On Oct 8, 2009, at 1:45 PM, Trond Myklebust wrote:
On Thu, 2009-10-08 at 13:37 -0400, Chuck Lever wrote:
Don't try NFSv4 if any MNT protocol related options were presented by
the user.
Signed-off-by: Chuck Lever <chuck.lever@xxxxxxxxxx>
---
utils/mount/stropts.c | 7 +++++++
1 files changed, 7 insertions(+), 0 deletions(-)
diff --git a/utils/mount/stropts.c b/utils/mount/stropts.c
index 0685caa..3401f63 100644
--- a/utils/mount/stropts.c
+++ b/utils/mount/stropts.c
@@ -564,6 +564,13 @@ static int nfs_try_mount_v4(struct
nfsmount_info *mi)
}
if (mi->version == 0) {
+ if (po_contains(options, "mounthost") ||
+ po_contains(options, "mountaddr") ||
+ po_contains(options, "mountvers") ||
+ po_contains(options, "mountproto")) {
+ errno = EPROTONOSUPPORT;
Shouldn't this be EINVAL ?
Since this is behind the mi->version == 0 check, we know that the user
didn't specify an NFS version. In any other v4 case, the kernel's
mount option parser will kick these out with EINVAL. But here, we
just want to avoid trying to negotiate NFSv4. So the EPROTONOSUPPORT
return code will cause the logic in nfs_try_mount() to try v3/v2 next.
Basically the bug is this: before, if I didn't specify an NFS
version, but added some mountfoo= option, the mount.nfs command will
try negotiating NFSv2/v3. Now, it will try NFSv4 first, but these are
illegal options for NFSv4, and the mount command will fail. So,
regression. This new logic simply skips trying NFSv4 in this case.
+ goto out_fail;
+ }
if (po_append(options, "vers=4") == PO_FAILED) {
errno = EINVAL;
goto out_fail;
--
To unsubscribe from this list: send the line "unsubscribe linux-
nfs" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
--
Chuck Lever
chuck[dot]lever[at]oracle[dot]com
--
To unsubscribe from this list: send the line "unsubscribe linux-nfs" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html