From: Christos Zoulas Date: Sat, 16 Jun 2012 23:21:56 +0000 (-0400) Subject: Centralize nfs valid version checking and introduce new configuration X-Git-Url: https://git.fsl.cs.stonybrook.edu/?a=commitdiff_plain;h=8570b4d8bb3e2eef8057d668a8585338cd2db269;p=am-utils-6.2.git Centralize nfs valid version checking and introduce new configuration variable nfs_vers_ping which sets the maximum version we ping for. --- diff --git a/amd/amd.h b/amd/amd.h index 6dab32c8..2ad983d5 100644 --- 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 */ }; diff --git a/amd/conf.c b/amd/conf.c index 795e2be5..81f9e0fe 100644 --- a/amd/conf.c +++ b/amd/conf.c @@ -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) { diff --git a/amd/srvr_nfs.c b/amd/srvr_nfs.c index 89fda513..247e8d3e 100644 --- a/amd/srvr_nfs.c +++ b/amd/srvr_nfs.c @@ -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; diff --git a/conf/transp/transp_sockets.c b/conf/transp/transp_sockets.c index 1cd132f5..479c7666 100644 --- a/conf/transp/transp_sockets.c +++ b/conf/transp/transp_sockets.c @@ -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 */ diff --git a/conf/transp/transp_tli.c b/conf/transp/transp_tli.c index a5f29083..a8365e4c 100644 --- a/conf/transp/transp_tli.c +++ b/conf/transp/transp_tli.c @@ -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) { diff --git a/conf/umount/umount_linux.c b/conf/umount/umount_linux.c index 3c36491e..b80c659c 100644 --- a/conf/umount/umount_linux.c +++ b/conf/umount/umount_linux.c @@ -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 diff --git a/include/am_utils.h b/include/am_utils.h index 90d30b3d..33249795 100644 --- a/include/am_utils.h +++ b/include/am_utils.h @@ -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); diff --git a/libamu/mount_fs.c b/libamu/mount_fs.c index 13769504..534b0d23 100644 --- a/libamu/mount_fs.c +++ b/libamu/mount_fs.c @@ -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; diff --git a/wire-test/wire-test.c b/wire-test/wire-test.c index 76ca495b..25789fe7 100644 --- a/wire-test/wire-test.c +++ b/wire-test/wire-test.c @@ -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