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;
}
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;
/*
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;
}
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;
}
case ESTALE:
case ETIMEDOUT:
case ECONNREFUSED:
+ case EHOSTUNREACH:
return 0; /* temporary */
default:
return 1; /* permanent */