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