diff options
-rw-r--r-- | configure.in | 9 | ||||
-rw-r--r-- | utils/mount/mount.c | 32 | ||||
-rw-r--r-- | utils/mount/nfs_mount.h | 3 | ||||
-rw-r--r-- | utils/mount/nfsmount.c | 3 |
4 files changed, 40 insertions, 7 deletions
diff --git a/configure.in b/configure.in index 258188a..1a1ce1a 100644 --- a/configure.in +++ b/configure.in @@ -38,6 +38,15 @@ AC_ARG_WITH(statduser, statduser=nobody fi) AC_SUBST(statduser) +AC_ARG_WITH(start-statd, + [AC_HELP_STRING([--with-start-statd=scriptname], + [When an nfs filesystems is mounted with locking, run this script] + )], + startstatd=$withval, + startstatd=/usr/sbin/start-statd + ) + AC_SUBST(startstatd) + AC_DEFINE_UNQUOTED(START_STATD, "$startstatd", [Define this to a script which can start statd on mount]) AC_ARG_ENABLE(nfsv3, [AC_HELP_STRING([--enable-nfsv3], [enable support for NFSv3 @<:@default=yes@:>@])], diff --git a/utils/mount/mount.c b/utils/mount/mount.c index 7d71e06..6717941 100644 --- a/utils/mount/mount.c +++ b/utils/mount/mount.c @@ -255,6 +255,26 @@ static void mount_error(char *node) } } +static void start_statd() +{ + /* If /var/run/rpc.statd.pid exists and is non-empty, + * assume statd already running. + * If START_STATD not defined, or defined to a non-existent file, + * don't bother, + * else run that file (typically a shell script) + */ + struct stat stb; + if (stat("/var/run/rpc.statd.pid", &stb) == 0 && + stb.st_size > 0) + return; +#ifdef START_STATD + if (stat(START_STATD, &stb) ==0 && + S_ISREG(stb.st_mode) && + (stb.st_mode & S_IXUSR)) + system(START_STATD); +#endif +} + int main(int argc, char *argv[]) { int c, flags = 0, nfs_mount_vers = 0, mnt_err = 1, fake = 0; @@ -358,11 +378,13 @@ int main(int argc, char *argv[]) nfs_mount_vers = 4; mnt_err = nfs4mount(spec, mount_point, &flags, &extra_opts, &mount_opts, 0); } - else { - if (!strcmp(progname, "mount.nfs")) { - mnt_err = nfsmount(spec, mount_point, &flags, - &extra_opts, &mount_opts, &nfs_mount_vers, 0); - } + else if (!strcmp(progname, "mount.nfs")) { + int need_statd = 0; + mnt_err = nfsmount(spec, mount_point, &flags, + &extra_opts, &mount_opts, &nfs_mount_vers, + 0, &need_statd); + if (!mnt_err && !fake && need_statd) + start_statd(); } if (!mnt_err && !fake) { diff --git a/utils/mount/nfs_mount.h b/utils/mount/nfs_mount.h index 1fd74c8..1acb633 100644 --- a/utils/mount/nfs_mount.h +++ b/utils/mount/nfs_mount.h @@ -78,7 +78,8 @@ struct nfs_mount_data { #define AUTH_GSS_SPKMP 390011 #endif -int nfsmount(const char *, const char *, int *, char **, char **, int *, int); +int nfsmount(const char *, const char *, int *, char **, char **, int *, + int, int *); void mount_errors(char *, int, int); #endif /* _NFS_MOUNT_H */ diff --git a/utils/mount/nfsmount.c b/utils/mount/nfsmount.c index 6226f6c..0188caa 100644 --- a/utils/mount/nfsmount.c +++ b/utils/mount/nfsmount.c @@ -818,7 +818,7 @@ nfsmnt_check_compat(const struct pmap *nfs_pmap, const struct pmap *mnt_pmap) int nfsmount(const char *spec, const char *node, int *flags, char **extra_opts, char **mount_opts, int *nfs_mount_vers, - int running_bg) + int running_bg, int *need_statd) { static char *prev_bg_host; char hostdir[1024]; @@ -1185,6 +1185,7 @@ noauth_flavors: strcat(new_opts, cbuf); *extra_opts = xstrdup(new_opts); + *need_statd = ! (data.flags & NFS_MOUNT_NONLM); return 0; /* abort */ |