diff options
author | Chuck Lever <chuck.lever@oracle.com> | 2009-09-14 13:55:36 -0400 |
---|---|---|
committer | Steve Dickson <steved@redhat.com> | 2009-09-14 13:55:36 -0400 |
commit | 74badf6f30f7aea95e9d784244488084dbadcb55 (patch) | |
tree | b9b51f825d68acfbfc16e1cc789c096a9a00d203 /utils | |
parent | b2a3cd590442309d40e9dd6d43213445df250694 (diff) | |
download | nfs-utils-74badf6f30f7aea95e9d784244488084dbadcb55.tar.gz nfs-utils-74badf6f30f7aea95e9d784244488084dbadcb55.tar.xz nfs-utils-74badf6f30f7aea95e9d784244488084dbadcb55.zip |
mount.nfs: Support "-t nfs,vers=4" mounts in the kernel
Support "vers=4" in nfs_nfs_version()
Skip UMNT call for "-t nfs -o vers=4" mounts
For "-t nfs -o vers=4" mounts, we want to skip v2/v3
version/transport negotiation, but be sure to append
the "clientaddr" option.
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Steve Dickson <steved@redhat.com>
Tested-by: Steve Dickson <steved@redhat.com>
Diffstat (limited to 'utils')
-rw-r--r-- | utils/mount/network.c | 14 | ||||
-rw-r--r-- | utils/mount/network.h | 1 | ||||
-rw-r--r-- | utils/mount/nfsumount.c | 4 | ||||
-rw-r--r-- | utils/mount/stropts.c | 10 |
4 files changed, 22 insertions, 7 deletions
diff --git a/utils/mount/network.c b/utils/mount/network.c index f6fa5fd..bd621be 100644 --- a/utils/mount/network.c +++ b/utils/mount/network.c @@ -90,6 +90,7 @@ static const char *nfs_transport_opttbl[] = { static const char *nfs_version_opttbl[] = { "v2", "v3", + "v4", "vers", "nfsvers", NULL, @@ -1203,7 +1204,7 @@ nfs_nfs_program(struct mount_options *options, unsigned long *program) * Returns TRUE if @version contains a valid value for this option, * or FALSE if the option was specified with an invalid value. */ -static int +int nfs_nfs_version(struct mount_options *options, unsigned long *version) { long tmp; @@ -1215,10 +1216,13 @@ nfs_nfs_version(struct mount_options *options, unsigned long *version) case 1: /* v3 */ *version = 3; return 1; - case 2: /* vers */ + case 2: /* v4 */ + *version = 4; + return 1; + case 3: /* vers */ switch (po_get_numeric(options, "vers", &tmp)) { case PO_FOUND: - if (tmp >= 2 && tmp <= 3) { + if (tmp >= 2 && tmp <= 4) { *version = tmp; return 1; } @@ -1229,10 +1233,10 @@ nfs_nfs_version(struct mount_options *options, unsigned long *version) case PO_BAD_VALUE: return 0; } - case 3: /* nfsvers */ + case 4: /* nfsvers */ switch (po_get_numeric(options, "nfsvers", &tmp)) { case PO_FOUND: - if (tmp >= 2 && tmp <= 3) { + if (tmp >= 2 && tmp <= 4) { *version = tmp; return 1; } diff --git a/utils/mount/network.h b/utils/mount/network.h index db5134c..402e0a5 100644 --- a/utils/mount/network.h +++ b/utils/mount/network.h @@ -56,6 +56,7 @@ int clnt_ping(struct sockaddr_in *, const unsigned long, struct mount_options; +int nfs_nfs_version(struct mount_options *options, unsigned long *version); int nfs_options2pmap(struct mount_options *, struct pmap *, struct pmap *); diff --git a/utils/mount/nfsumount.c b/utils/mount/nfsumount.c index f81db14..c5505b1 100644 --- a/utils/mount/nfsumount.c +++ b/utils/mount/nfsumount.c @@ -179,6 +179,10 @@ static int nfs_umount_do_umnt(struct mount_options *options, return EX_FAIL; } + /* Skip UMNT call for vers=4 mounts */ + if (nfs_pmap.pm_vers == 4) + return EX_SUCCESS; + *hostname = nfs_umount_hostname(options, *hostname); if (!*hostname) { nfs_error(_("%s: out of memory"), progname); diff --git a/utils/mount/stropts.c b/utils/mount/stropts.c index a12ace7..3eb661e 100644 --- a/utils/mount/stropts.c +++ b/utils/mount/stropts.c @@ -84,6 +84,7 @@ struct nfsmount_info { struct mount_options *options; /* parsed mount options */ char **extra_opts; /* string for /etc/mtab */ + unsigned long version; /* NFS version */ int flags, /* MS_ flags */ fake, /* actually do the mount? */ child; /* forked bg child? */ @@ -272,7 +273,12 @@ static int nfs_validate_options(struct nfsmount_info *mi) if (!nfs_name_to_address(mi->hostname, sap, &salen)) return 0; - if (strncmp(mi->type, "nfs4", 4) == 0) { + if (!nfs_nfs_version(mi->options, &mi->version)) + return 0; + if (strncmp(mi->type, "nfs4", 4) == 0) + mi->version = 4; + + if (mi->version == 4) { if (!nfs_append_clientaddr_option(sap, salen, mi->options)) return 0; } else { @@ -488,7 +494,7 @@ static int nfs_try_mount(struct nfsmount_info *mi) char *options = NULL; int result; - if (strncmp(mi->type, "nfs4", 4) != 0) { + if (mi->version != 4) { if (!nfs_rewrite_pmap_mount_options(mi->options)) return 0; } |