Centralize nfs valid version checking and introduce new configuration
authorChristos Zoulas <christos@zoulas.com>
Sat, 16 Jun 2012 23:21:56 +0000 (19:21 -0400)
committerChristos Zoulas <christos@zoulas.com>
Sat, 16 Jun 2012 23:21:56 +0000 (19:21 -0400)
variable nfs_vers_ping which sets the maximum version we ping for.

amd/amd.h
amd/conf.c
amd/srvr_nfs.c
conf/transp/transp_sockets.c
conf/transp/transp_tli.c
conf/umount/umount_linux.c
include/am_utils.h
libamu/mount_fs.c
wire-test/wire-test.c

index 6dab32c878de317d0d39ab42ae00aa4d23096995..2ad983d528c0094f615b48a70a6211afa9226d9a 100644 (file)
--- a/amd/amd.h
+++ b/amd/amd.h
@@ -315,6 +315,7 @@ struct amu_global_options {
 #endif /* HAVE_MAP_NIS */
   char *nfs_proto;             /* NFS protocol (NULL, udp, tcp) */
   int nfs_vers;                        /* NFS version (0, 2, 3, 4) */
+  int nfs_vers_ping;           /* NFS rpc ping version (0, 2, 3, 4) */
   u_int exec_map_timeout;      /* timeout (seconds) for executable maps */
 };
 
index 795e2be573146911456a203db22e0cf5b027624e..81f9e0fe6507d918721c9546d5ef8f5e7191106e 100644 (file)
@@ -120,6 +120,7 @@ static int gopt_nfs_retry_interval_udp(const char *val);
 static int gopt_nfs_retry_interval_tcp(const char *val);
 static int gopt_nfs_retry_interval_toplvl(const char *val);
 static int gopt_nfs_vers(const char *val);
+static int gopt_nfs_vers_ping(const char *val);
 static int gopt_nis_domain(const char *val);
 static int gopt_normalize_hostnames(const char *val);
 static int gopt_normalize_slashes(const char *val);
@@ -204,6 +205,7 @@ static struct _func_map glob_functable[] = {
   {"nfs_retry_interval_tcp",   gopt_nfs_retry_interval_tcp},
   {"nfs_retry_interval_toplvl",        gopt_nfs_retry_interval_toplvl},
   {"nfs_vers",                 gopt_nfs_vers},
+  {"nfs_vers_ping",            gopt_nfs_vers_ping},
   {"nis_domain",               gopt_nis_domain},
   {"normalize_hostnames",      gopt_normalize_hostnames},
   {"normalize_slashes",                gopt_normalize_slashes},
@@ -960,6 +962,19 @@ gopt_nfs_vers(const char *val)
 }
 
 
+static int
+gopt_nfs_vers_ping(const char *val)
+{
+  int i = atoi(val);
+
+  if (i == 2 || i == 3 || i == 4) {
+    gopt.nfs_vers_ping = i;
+    return 0;
+  }
+  fprintf(stderr, "conf: illegal nfs_vers_ping \"%s\"\n", val);
+  return 1;
+}
+
 static int
 gopt_nis_domain(const char *val)
 {
index 89fda5137fd20ecae4ad5d546432d9c3640b0640..247e8d3eaaa08ee75f92b45176f866e3a258431d 100644 (file)
@@ -565,20 +565,22 @@ nfs_keepalive(voidp v)
   int error;
   nfs_private *np = (nfs_private *) fs->fs_private;
   int fstimeo = -1;
+  int fs_version = nfs_valid_version(gopt.nfs_vers_ping) &&
+    gopt.nfs_vers_ping < fs->fs_version ? gopt.nfs_vers_ping : fs->fs_version;
 
   /*
    * Send an NFS ping to this node
    */
 
-  if (ping_len[fs->fs_version - NFS_VERSION] == 0)
-    create_ping_payload(fs->fs_version);
+  if (ping_len[fs_version - NFS_VERSION] == 0)
+    create_ping_payload(fs_version);
 
   /*
    * Queue the packet...
    */
   error = fwd_packet(MK_RPC_XID(RPC_XID_NFSPING, np->np_xid),
-                    ping_buf[fs->fs_version - NFS_VERSION],
-                    ping_len[fs->fs_version - NFS_VERSION],
+                    ping_buf[fs_version - NFS_VERSION],
+                    ping_len[fs_version - NFS_VERSION],
                     fs->fs_ip,
                     (struct sockaddr_in *) NULL,
                     (voidp) ((long) np->np_xid), /* cast needed for 64-bit archs */
@@ -858,7 +860,8 @@ find_nfs_srvr(mntfs *mf)
      */
     if (check_pmap_up(host, ip)) {
       if (nfs_proto) {
-       best_nfs_version = get_nfs_version(host, ip, nfs_version, nfs_proto);
+       best_nfs_version = get_nfs_version(host, ip, nfs_version, nfs_proto,
+         gopt.nfs_vers);
        nfs_port = ip->sin_port;
       }
 #ifdef MNTTAB_OPT_PROTO
@@ -867,8 +870,8 @@ find_nfs_srvr(mntfs *mf)
        char **p;
 
        for (p = protocols; *p; p++) {
-         proto_nfs_version = get_nfs_version(host, ip, nfs_version, *p);
-
+         proto_nfs_version = get_nfs_version(host, ip, nfs_version, *p,
+           gopt.nfs_vers);
          if (proto_nfs_version > best_nfs_version) {
            best_nfs_version = proto_nfs_version;
            nfs_proto = *p;
index 1cd132f59d8cac140447322cf23e4401a8dab331..479c766677174c8da37f11c4175a8a247f4ab4d5 100644 (file)
@@ -420,7 +420,7 @@ int check_pmap_up(char *host, struct sockaddr_in* sin)
  * Find the best NFS version for a host and protocol.
  */
 u_long
-get_nfs_version(char *host, struct sockaddr_in *sin, u_long nfs_version, const char *proto)
+get_nfs_version(char *host, struct sockaddr_in *sin, u_long nfs_version, const char *proto, u_long def)
 {
   CLIENT *clnt;
   int again = 0;
@@ -433,8 +433,11 @@ get_nfs_version(char *host, struct sockaddr_in *sin, u_long nfs_version, const c
    * If not set or set wrong, then try from NFS_VERS_MAX on down. If
    * set, then try from nfs_version on down.
    */
-  if (nfs_version < NFS_VERS_MIN || nfs_version > NFS_VERS_MAX) {
-    nfs_version = NFS_VERS_MAX;
+  if (!nfs_valid_version(nfs_version)) {
+    if (nfs_valid_version(def))
+      nfs_version = def;
+    else
+      nfs_version = NFS_VERS_MAX;
     again = 1;
   }
   tv.tv_sec = 2;               /* retry every 2 seconds, but also timeout */
index a5f29083e5983c49e11493b51c806c09d57c9fe1..a8365e4c5a74d933b9bec05baca43605da887038 100644 (file)
@@ -743,7 +743,7 @@ int check_pmap_up(char *host, struct sockaddr_in* sin)
  * Find the best NFS version for a host.
  */
 u_long
-get_nfs_version(char *host, struct sockaddr_in *sin, u_long nfs_version, const char *proto)
+get_nfs_version(char *host, struct sockaddr_in *sin, u_long nfs_version, const char *proto, u_long def)
 {
   CLIENT *clnt = NULL;
   rpcvers_t versout;
@@ -753,8 +753,11 @@ get_nfs_version(char *host, struct sockaddr_in *sin, u_long nfs_version, const c
    * If not set or set wrong, then try from NFS_VERS_MAX on down. If
    * set, then try from nfs_version on down.
    */
-  if (nfs_version <= 0 || nfs_version > NFS_VERS_MAX) {
-    nfs_version = NFS_VERS_MAX;
+  if (!nfs_valid_version(nfs_version))
+    if (nfs_valid_version(def))
+      nfs_version = def;
+    else
+      nfs_version = NFS_VERS_MAX;
   }
 
   if (nfs_version == NFS_VERSION) {
index 3c36491e1f33d7f1fc93468f6808940f3d9bbd1a..b80c659c6906e4fa9744efe26fbe7460922fbed8 100644 (file)
@@ -83,6 +83,7 @@ umount_fs(char *mntdir, const char *mnttabname, u_int unmount_flags)
     goto out;
   }
 
+  plog(XLOG_ERROR, "Trying unmount %s, umount_flags 0x%x", mp_save->mnt->mnt_dir, unmount_flags);
   dlog("Trying unmount(%s)", mp_save->mnt->mnt_dir);
 
 #ifdef MOUNT_TABLE_ON_FILE
index 90d30b3d00ab56a6feeedc63a84c580917fcf278..3324979531155216e9db0e1b69082ac144af4bdb 100644 (file)
@@ -333,7 +333,8 @@ extern voidp xrealloc(voidp, int);
 extern voidp xzalloc(int);
 extern char *xstrdup(const char *);
 extern int check_pmap_up(char *host, struct sockaddr_in* sin);
-extern u_long get_nfs_version(char *host, struct sockaddr_in *sin, u_long nfs_version, const char *proto);
+extern u_long get_nfs_version(char *host, struct sockaddr_in *sin, u_long nfs_version, const char *proto, u_long def);
+extern int nfs_valid_version(u_long vers);
 extern long get_server_pid(void);
 extern void setup_sighandler(int signum, void (*handler)(int));
 extern time_t clocktime(nfstime *nt);
index 137695045735c33b33ba4a9255af988ebad50275..534b0d231047796f3f2e40f11626ec144320cc6e 100644 (file)
@@ -1079,7 +1079,7 @@ struct {
 static char *
 set_nfs4_security(nfs4_args_t *nap, mntent_t *mntp)
 {
-  const char *o = hasmnteq(mntp, MNTTAB_OPT_SEC);
+  const char *o = hasmntopt(mntp, MNTTAB_OPT_SEC);
   char *q, *s, *ss;
   size_t l, i;
 
index 76ca495b9a9cdb0bb72ced5b21cfbd5fce5041cc..25789fe7e16fa4299b0fb74b300be2bbde262695 100644 (file)
@@ -106,7 +106,7 @@ main(int argc, char **argv)
   proto = "udp";
   for (nv=2; nv<=3; ++nv) {
     fprintf(stderr, "\ttesting vers=%d, proto=\"%s\" -> ", nv, proto);
-    ret = get_nfs_version(testhost, ip, nv, proto);
+    ret = get_nfs_version(testhost, ip, nv, proto, 0);
     if (ret == 0)
       fprintf(stderr, "failed!\n");
     else
@@ -116,7 +116,7 @@ main(int argc, char **argv)
   proto = "tcp";
   for (nv=2; nv<=3; ++nv) {
     fprintf(stderr, "\ttesting vers=%d, proto=\"%s\" -> ", nv, proto);
-    ret = get_nfs_version(testhost, ip, nv, proto);
+    ret = get_nfs_version(testhost, ip, nv, proto, 0);
     if (ret == 0)
       fprintf(stderr, "failed!\n");
     else