mount.nfs: Move start_statd into nfs_mount
authorChuck Lever <chuck.lever@oracle.com>
Mon, 16 Jul 2007 20:28:51 +0000 (16:28 -0400)
committerNeil Brown <neilb@suse.de>
Fri, 20 Jul 2007 06:10:53 +0000 (16:10 +1000)
Move start_startd into network.c, and move the call inside of
nfs_mount, instead of immediately after - conceptually a better place
for it.

Also fix a minor nit:  Since the mount actually fails if start_statd
doesn't work, cause mount.nfs to exit with a status of EX_FAIL.

Still need to do something about "running_bg" in nfsmount.c:nfsmount().

Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Neil Brown <neilb@suse.de>
utils/mount/mount.c
utils/mount/network.c
utils/mount/network.h
utils/mount/nfs_mount.h
utils/mount/nfsmount.c

index 30946bd..e3f84a0 100644 (file)
@@ -351,50 +351,6 @@ static int chk_mountpoint(char *mount_point)
        return 0;
 }
 
-static int probe_statd()
-{
-       struct sockaddr_in addr;
-       u_short port;
-
-       memset(&addr, 0, sizeof(addr));
-       addr.sin_family = AF_INET;
-       addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
-       port = getport(&addr, 100024, 1, IPPROTO_UDP);
-
-       if (port == 0)
-               return 0;
-       addr.sin_port = htons(port);
-
-       if (clnt_ping(&addr, 100024, 1, IPPROTO_UDP, NULL) <= 0)
-               return 0;
-
-       return 1;
-}
-
-static int 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 (probe_statd())
-               return 1;
-#ifdef START_STATD
-       if (stat(START_STATD, &stb) ==0 &&
-           S_ISREG(stb.st_mode) &&
-           (stb.st_mode & S_IXUSR)) {
-               system(START_STATD);
-               if (probe_statd())
-                       return 1;
-       }
-#endif
-       return 0;
-}
-
 int main(int argc, char *argv[])
 {
        int c, flags = 0, mnt_err = 1, fake = 0;
@@ -523,23 +479,10 @@ int main(int argc, char *argv[])
 
        if (strcmp(fs_type, "nfs4") == 0)
                mnt_err = nfs4mount(spec, mount_point, &flags, &extra_opts, &mount_opts, 0);
-       else {
-               int need_statd = 0;
+       else
                mnt_err = nfsmount(spec, mount_point, &flags,
                                   &extra_opts, &mount_opts,
-                                  0, &need_statd);
-               if (!mnt_err && !fake && need_statd) {
-                       if (!start_statd()) {
-                               fprintf(stderr,
-                                       "%s: rpc.statd is not running but is "
-                                       "required for remote locking\n"
-                                       "   Either use \"-o nolocks\" to keep "
-                                       "locks local, or start statd.\n",
-                                       progname);
-                               exit(1);
-                       }
-               }
-       }
+                                  0, fake);
 
        if (mnt_err)
                exit(EX_FAIL);
index c11fa3e..8da57d9 100644 (file)
@@ -316,3 +316,48 @@ version_fixed:
                goto out_bad;
        return probe_mntport(mnt_server);
 }
+
+static int probe_statd(void)
+{
+       struct sockaddr_in addr;
+       unsigned short port;
+
+       memset(&addr, 0, sizeof(addr));
+       addr.sin_family = AF_INET;
+       addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
+       port = getport(&addr, 100024, 1, IPPROTO_UDP);
+
+       if (port == 0)
+               return 0;
+       addr.sin_port = htons(port);
+
+       if (clnt_ping(&addr, 100024, 1, IPPROTO_UDP, NULL) <= 0)
+               return 0;
+
+       return 1;
+}
+
+/*
+ * Attempt to start rpc.statd
+ */
+int start_statd(void)
+{
+#ifdef START_STATD
+       struct stat stb;
+#endif
+
+       if (probe_statd())
+               return 1;
+
+#ifdef START_STATD
+       if (stat(START_STATD, &stb) == 0) {
+               if (S_ISREG(stb.st_mode) && (stb.st_mode & S_IXUSR)) {
+                       system(START_STATD);
+                       if (probe_statd())
+                               return 1;
+               }
+       }
+#endif
+
+       return 0;
+}
index 3a2fa7c..bb5b4da 100644 (file)
@@ -24,8 +24,9 @@
 #include "conn.h"
 
 int nfs_gethostbyname(const char *, struct sockaddr_in *);
-unsigned short getport(struct sockaddr_in *, unsigned long,
-                       unsigned long, unsigned int);
+
 int probe_mntport(clnt_addr_t *);
 int probe_nfsport(clnt_addr_t *);
 int probe_bothports(clnt_addr_t *, clnt_addr_t *);
+
+int start_statd(void);
index b38aa0f..e566083 100644 (file)
@@ -81,6 +81,6 @@ struct nfs_mount_data {
 #endif
 
 int nfsmount(const char *, const char *, int *, char **, char **,
-            int, int *);
+            int, int);
 
 #endif /* _NFS_MOUNT_H */
index 9c08ff5..a3cbbbe 100644 (file)
@@ -89,6 +89,7 @@ typedef union {
 } mntres_t;
 
 extern int nfs_mount_data_version;
+extern char *progname;
 extern int verbose;
 extern int sloppy;
 
@@ -487,7 +488,7 @@ out_bad:
 int
 nfsmount(const char *spec, const char *node, int *flags,
         char **extra_opts, char **mount_opts,
-        int running_bg, int *need_statd)
+        int running_bg, int fake)
 {
        static char *prev_bg_host;
        char hostdir[1024];
@@ -849,7 +850,18 @@ noauth_flavors:
        strcat(new_opts, cbuf);
 
        *extra_opts = xstrdup(new_opts);
-       *need_statd = ! (data.flags & NFS_MOUNT_NONLM);
+
+       if (!fake && !(data.flags & NFS_MOUNT_NONLM)) {
+               if (!start_statd()) {
+                       nfs_error(_("%s: rpc.statd is not running but is "
+                               "required for remote locking.\n"
+                               "   Either use '-o nolocks' to keep "
+                               "locks local, or start statd."),
+                                       progname);
+                       goto fail;
+               }
+       }
+
        return 0;
 
        /* abort */