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; }