|
ikent |
6ee1d8 |
diff --git a/daemon/spawn.c b/daemon/spawn.c
|
|
ikent |
6ee1d8 |
index 7f0a6e0..271d37e 100644
|
|
ikent |
6ee1d8 |
--- a/daemon/spawn.c
|
|
ikent |
6ee1d8 |
+++ b/daemon/spawn.c
|
|
ikent |
6ee1d8 |
@@ -34,6 +34,8 @@ static pthread_mutex_t spawn_mutex = PTHREAD_MUTEX_INITIALIZER;
|
|
ikent |
6ee1d8 |
#define SPAWN_OPT_LOCK 0x0001
|
|
ikent |
6ee1d8 |
#define SPAWN_OPT_ACCESS 0x0002
|
|
ikent |
6ee1d8 |
|
|
ikent |
6ee1d8 |
+#define MTAB_LOCK_RETRIES 3
|
|
ikent |
6ee1d8 |
+
|
|
ikent |
6ee1d8 |
inline void dump_core(void)
|
|
ikent |
6ee1d8 |
{
|
|
ikent |
6ee1d8 |
sigset_t segv;
|
|
ikent |
6ee1d8 |
@@ -267,6 +269,8 @@ int spawn_mount(logger *log, ...)
|
|
ikent |
6ee1d8 |
char prog[] = PATH_MOUNT;
|
|
ikent |
6ee1d8 |
char arg0[] = PATH_MOUNT;
|
|
ikent |
6ee1d8 |
unsigned int options;
|
|
ikent |
6ee1d8 |
+ unsigned int retries = MTAB_LOCK_RETRIES;
|
|
ikent |
6ee1d8 |
+ int ret;
|
|
ikent |
6ee1d8 |
|
|
ikent |
6ee1d8 |
/* If we use mount locking we can't validate the location */
|
|
ikent |
6ee1d8 |
#ifdef ENABLE_MOUNT_LOCKING
|
|
ikent |
6ee1d8 |
@@ -289,7 +293,14 @@ int spawn_mount(logger *log, ...)
|
|
ikent |
6ee1d8 |
while ((*p++ = va_arg(arg, char *)));
|
|
ikent |
6ee1d8 |
va_end(arg);
|
|
ikent |
6ee1d8 |
|
|
ikent |
6ee1d8 |
- return do_spawn(log, options, prog, (const char **) argv);
|
|
ikent |
6ee1d8 |
+ while (retries--) {
|
|
ikent |
6ee1d8 |
+ ret = do_spawn(log, options, prog, (const char **) argv);
|
|
ikent |
6ee1d8 |
+ if (ret & MTAB_NOTUPDATED)
|
|
ikent |
6ee1d8 |
+ continue;
|
|
ikent |
6ee1d8 |
+ break;
|
|
ikent |
6ee1d8 |
+ }
|
|
ikent |
6ee1d8 |
+
|
|
ikent |
6ee1d8 |
+ return ret;
|
|
ikent |
6ee1d8 |
}
|
|
ikent |
6ee1d8 |
|
|
ikent |
6ee1d8 |
/*
|
|
ikent |
6ee1d8 |
@@ -309,6 +320,8 @@ int spawn_bind_mount(logger *log, ...)
|
|
ikent |
6ee1d8 |
char arg0[] = PATH_MOUNT;
|
|
ikent |
6ee1d8 |
char bind[] = "--bind";
|
|
ikent |
6ee1d8 |
unsigned int options;
|
|
ikent |
6ee1d8 |
+ unsigned int retries = MTAB_LOCK_RETRIES;
|
|
ikent |
6ee1d8 |
+ int ret;
|
|
ikent |
6ee1d8 |
|
|
ikent |
6ee1d8 |
/* If we use mount locking we can't validate the location */
|
|
ikent |
6ee1d8 |
#ifdef ENABLE_MOUNT_LOCKING
|
|
ikent |
6ee1d8 |
@@ -332,7 +345,14 @@ int spawn_bind_mount(logger *log, ...)
|
|
ikent |
6ee1d8 |
while ((*p++ = va_arg(arg, char *)));
|
|
ikent |
6ee1d8 |
va_end(arg);
|
|
ikent |
6ee1d8 |
|
|
ikent |
6ee1d8 |
- return do_spawn(log, options, prog, (const char **) argv);
|
|
ikent |
6ee1d8 |
+ while (retries--) {
|
|
ikent |
6ee1d8 |
+ ret = do_spawn(log, options, prog, (const char **) argv);
|
|
ikent |
6ee1d8 |
+ if (ret & MTAB_NOTUPDATED)
|
|
ikent |
6ee1d8 |
+ continue;
|
|
ikent |
6ee1d8 |
+ break;
|
|
ikent |
6ee1d8 |
+ }
|
|
ikent |
6ee1d8 |
+
|
|
ikent |
6ee1d8 |
+ return ret;
|
|
ikent |
6ee1d8 |
}
|
|
ikent |
6ee1d8 |
|
|
ikent |
6ee1d8 |
int spawn_umount(logger *log, ...)
|
|
ikent |
6ee1d8 |
@@ -343,6 +363,8 @@ int spawn_umount(logger *log, ...)
|
|
ikent |
6ee1d8 |
char prog[] = PATH_UMOUNT;
|
|
ikent |
6ee1d8 |
char arg0[] = PATH_UMOUNT;
|
|
ikent |
6ee1d8 |
unsigned int options;
|
|
ikent |
6ee1d8 |
+ unsigned int retries = MTAB_LOCK_RETRIES;
|
|
ikent |
6ee1d8 |
+ int ret;
|
|
ikent |
6ee1d8 |
|
|
ikent |
6ee1d8 |
#ifdef ENABLE_MOUNT_LOCKING
|
|
ikent |
6ee1d8 |
options = SPAWN_OPT_LOCK;
|
|
ikent |
6ee1d8 |
@@ -364,6 +386,13 @@ int spawn_umount(logger *log, ...)
|
|
ikent |
6ee1d8 |
while ((*p++ = va_arg(arg, char *)));
|
|
ikent |
6ee1d8 |
va_end(arg);
|
|
ikent |
6ee1d8 |
|
|
ikent |
6ee1d8 |
- return do_spawn(log, options, prog, (const char **) argv);
|
|
ikent |
6ee1d8 |
+ while (retries--) {
|
|
ikent |
6ee1d8 |
+ ret = do_spawn(log, options, prog, (const char **) argv);
|
|
ikent |
6ee1d8 |
+ if (ret & MTAB_NOTUPDATED)
|
|
ikent |
6ee1d8 |
+ continue;
|
|
ikent |
6ee1d8 |
+ break;
|
|
ikent |
6ee1d8 |
+ }
|
|
ikent |
6ee1d8 |
+
|
|
ikent |
6ee1d8 |
+ return ret;
|
|
ikent |
6ee1d8 |
}
|
|
ikent |
6ee1d8 |
|