]> git.decadent.org.uk Git - nfs-utils.git/commitdiff
Automatically start statd when mounting an nfs filesystem.
authorNeil Brown <neilb@suse.de>
Fri, 16 Mar 2007 00:24:15 +0000 (11:24 +1100)
committerNeil Brown <neilb@suse.de>
Fri, 16 Mar 2007 00:24:15 +0000 (11:24 +1100)
If statd is not running (/var/run/rpc.statd.pid) when an nfs filesystem
is mounted (v2 or v3, with remote locking enabled), and if
/usr/sbin/start-statd (or other program specified at config time) is
present, then run that program to start statd.

This means that statd does not need to be running "just in case".
It only needs to be started at boot time if the nfs server is
started.

configure.in
utils/mount/mount.c
utils/mount/nfs_mount.h
utils/mount/nfsmount.c

index 258188ad525720b52a89613b9bad16fde62f460e..1a1ce1a846bcb7577ff915ab394513a23d8794d5 100644 (file)
@@ -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@:>@])],
index 7d71e06f20d1b81baf803a4ea6ea275e20a807a1..6717941621c9b1e622f7b467c2e273a9d69081d3 100644 (file)
@@ -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) {
index 1fd74c870d75134c55fbb2b38c2d44091d675f46..1acb633faf48108c5edde320d1117f5d199be0b3 100644 (file)
@@ -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 */
index 6226f6cf0241c6a99f35bc31a3861927dd976892..0188caa2a7b8612d6fe5a2a175d7af922ddfd22d 100644 (file)
@@ -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 */