X-Git-Url: https://git.decadent.org.uk/gitweb/?a=blobdiff_plain;ds=sidebyside;f=utils%2Fmount%2Fstropts.c;h=9695c739c4f53844a65119b3dd049faca2b304ee;hb=44f09b7c4c79ca184a29138078c68a4db7aeb85a;hp=98557d2988f487f531f0e250ac85af764c04b6ee;hpb=0935cebc1e130c6adfd870c88a6493277c84d47f;p=nfs-utils.git diff --git a/utils/mount/stropts.c b/utils/mount/stropts.c index 98557d2..9695c73 100644 --- a/utils/mount/stropts.c +++ b/utils/mount/stropts.c @@ -303,8 +303,10 @@ static int nfs_set_version(struct nfsmount_info *mi) if (strncmp(mi->type, "nfs4", 4) == 0) mi->version = 4; else { - char *option = po_get(mi->options, "proto"); - if (option && strcmp(option, "rdma") == 0) + unsigned long protocol; + if (!nfs_nfs_protocol(mi->options, &protocol)) + return 0; + if (protocol == NFSPROTO_RDMA) mi->version = 3; } @@ -490,14 +492,19 @@ nfs_rewrite_pmap_mount_options(struct mount_options *options) union nfs_sockaddr mnt_address; struct sockaddr *mnt_saddr = &mnt_address.sa; socklen_t mnt_salen = sizeof(mnt_address); + unsigned long protocol; struct pmap mnt_pmap; char *option; /* - * Skip option negotiation for proto=rdma mounts. + * Version and transport negotiation is not required + * and does not work for RDMA mounts. */ - option = po_get(options, "proto"); - if (option && strcmp(option, "rdma") == 0) + if (!nfs_nfs_protocol(options, &protocol)) { + errno = EINVAL; + return 0; + } + if (protocol == NFSPROTO_RDMA) goto out; /* @@ -538,7 +545,10 @@ nfs_rewrite_pmap_mount_options(struct mount_options *options) if (!nfs_construct_new_options(options, nfs_saddr, &nfs_pmap, mnt_saddr, &mnt_pmap)) { - errno = EINVAL; + if (rpc_createerr.cf_stat == RPC_UNKNOWNPROTO) + errno = EPROTONOSUPPORT; + else + errno = EINVAL; return 0; } @@ -586,18 +596,21 @@ static int nfs_do_mount_v3v2(struct nfsmount_info *mi, errno = ENOMEM; return result; } - + errno = 0; if (!nfs_append_addr_option(sap, salen, options)) { - errno = EINVAL; + if (errno == 0) + errno = EINVAL; goto out_fail; } if (!nfs_fix_mounthost_option(options, mi->hostname)) { - errno = EINVAL; + if (errno == 0) + errno = EINVAL; goto out_fail; } if (!mi->fake && !nfs_verify_lock_option(options)) { - errno = EINVAL; + if (errno == 0) + errno = EINVAL; goto out_fail; }