Blob Blame History Raw
diff --git a/CHANGELOG b/CHANGELOG
index 34fad3e..b379431 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -3,6 +3,7 @@
 - fix return check for getpwuid_r and getgrgid_r.
 - give up trying to update exports list while host is mounted.
 - fix to "@network" matching.
+- check for fstab update and retry if not updated.
 
 20/2/2007 autofs-5.0.1
 ----------------------
diff --git a/daemon/spawn.c b/daemon/spawn.c
index 7f0a6e0..271d37e 100644
--- a/daemon/spawn.c
+++ b/daemon/spawn.c
@@ -34,6 +34,8 @@ static pthread_mutex_t spawn_mutex = PTHREAD_MUTEX_INITIALIZER;
 #define SPAWN_OPT_LOCK		0x0001
 #define SPAWN_OPT_ACCESS	0x0002
 
+#define MTAB_LOCK_RETRIES	3
+
 inline void dump_core(void)
 {
 	sigset_t segv;
@@ -267,6 +269,8 @@ int spawn_mount(logger *log, ...)
 	char prog[] = PATH_MOUNT;
 	char arg0[] = PATH_MOUNT;
 	unsigned int options;
+	unsigned int retries = MTAB_LOCK_RETRIES;
+	int ret;
 
 	/* If we use mount locking we can't validate the location */
 #ifdef ENABLE_MOUNT_LOCKING
@@ -289,7 +293,14 @@ int spawn_mount(logger *log, ...)
 	while ((*p++ = va_arg(arg, char *)));
 	va_end(arg);
 
-	return do_spawn(log, options, prog, (const char **) argv);
+	while (retries--) {
+		ret = do_spawn(log, options, prog, (const char **) argv);
+		if (ret & MTAB_NOTUPDATED)
+			continue;
+		break;
+	}
+
+	return ret;
 }
 
 /*
@@ -309,6 +320,8 @@ int spawn_bind_mount(logger *log, ...)
 	char arg0[] = PATH_MOUNT;
 	char bind[] = "--bind";
 	unsigned int options;
+	unsigned int retries = MTAB_LOCK_RETRIES;
+	int ret;
 
 	/* If we use mount locking we can't validate the location */
 #ifdef ENABLE_MOUNT_LOCKING
@@ -332,7 +345,14 @@ int spawn_bind_mount(logger *log, ...)
 	while ((*p++ = va_arg(arg, char *)));
 	va_end(arg);
 
-	return do_spawn(log, options, prog, (const char **) argv);
+	while (retries--) {
+		ret = do_spawn(log, options, prog, (const char **) argv);
+		if (ret & MTAB_NOTUPDATED)
+			continue;
+		break;
+	}
+
+	return ret;
 }
 
 int spawn_umount(logger *log, ...)
@@ -343,6 +363,8 @@ int spawn_umount(logger *log, ...)
 	char prog[] = PATH_UMOUNT;
 	char arg0[] = PATH_UMOUNT;
 	unsigned int options;
+	unsigned int retries = MTAB_LOCK_RETRIES;
+	int ret;
 
 #ifdef ENABLE_MOUNT_LOCKING
 	options = SPAWN_OPT_LOCK;
@@ -364,6 +386,13 @@ int spawn_umount(logger *log, ...)
 	while ((*p++ = va_arg(arg, char *)));
 	va_end(arg);
 
-	return do_spawn(log, options, prog, (const char **) argv);
+	while (retries--) {
+		ret = do_spawn(log, options, prog, (const char **) argv);
+		if (ret & MTAB_NOTUPDATED)
+			continue;
+		break;
+	}
+
+	return ret;
 }