|
@@ -816,6 +816,43 @@ static void nfs_parse_ip_address(char *string, size_t str_len,
|
|
|
nfs_parse_ipv4_address(string, str_len, sap, addr_len);
|
|
|
}
|
|
|
|
|
|
+/*
|
|
|
+ * Sanity check the NFS transport protocol.
|
|
|
+ *
|
|
|
+ */
|
|
|
+static void nfs_validate_transport_protocol(struct nfs_parsed_mount_data *mnt)
|
|
|
+{
|
|
|
+ switch (mnt->nfs_server.protocol) {
|
|
|
+ case XPRT_TRANSPORT_UDP:
|
|
|
+ case XPRT_TRANSPORT_TCP:
|
|
|
+ case XPRT_TRANSPORT_RDMA:
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ mnt->nfs_server.protocol = XPRT_TRANSPORT_TCP;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+/*
|
|
|
+ * For text based NFSv2/v3 mounts, the mount protocol transport default
|
|
|
+ * settings should depend upon the specified NFS transport.
|
|
|
+ */
|
|
|
+static void nfs_set_mount_transport_protocol(struct nfs_parsed_mount_data *mnt)
|
|
|
+{
|
|
|
+ nfs_validate_transport_protocol(mnt);
|
|
|
+
|
|
|
+ if (mnt->mount_server.protocol == XPRT_TRANSPORT_UDP ||
|
|
|
+ mnt->mount_server.protocol == XPRT_TRANSPORT_TCP)
|
|
|
+ return;
|
|
|
+ switch (mnt->nfs_server.protocol) {
|
|
|
+ case XPRT_TRANSPORT_UDP:
|
|
|
+ mnt->mount_server.protocol = XPRT_TRANSPORT_UDP;
|
|
|
+ break;
|
|
|
+ case XPRT_TRANSPORT_TCP:
|
|
|
+ case XPRT_TRANSPORT_RDMA:
|
|
|
+ mnt->mount_server.protocol = XPRT_TRANSPORT_TCP;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
/*
|
|
|
* Error-check and convert a string of mount options from user space into
|
|
|
* a data structure
|
|
@@ -896,20 +933,14 @@ static int nfs_parse_mount_options(char *raw,
|
|
|
case Opt_udp:
|
|
|
mnt->flags &= ~NFS_MOUNT_TCP;
|
|
|
mnt->nfs_server.protocol = XPRT_TRANSPORT_UDP;
|
|
|
- mnt->timeo = 7;
|
|
|
- mnt->retrans = 5;
|
|
|
break;
|
|
|
case Opt_tcp:
|
|
|
mnt->flags |= NFS_MOUNT_TCP;
|
|
|
mnt->nfs_server.protocol = XPRT_TRANSPORT_TCP;
|
|
|
- mnt->timeo = 600;
|
|
|
- mnt->retrans = 2;
|
|
|
break;
|
|
|
case Opt_rdma:
|
|
|
mnt->flags |= NFS_MOUNT_TCP; /* for side protocols */
|
|
|
mnt->nfs_server.protocol = XPRT_TRANSPORT_RDMA;
|
|
|
- mnt->timeo = 600;
|
|
|
- mnt->retrans = 2;
|
|
|
break;
|
|
|
case Opt_acl:
|
|
|
mnt->flags &= ~NFS_MOUNT_NOACL;
|
|
@@ -1103,21 +1134,15 @@ static int nfs_parse_mount_options(char *raw,
|
|
|
case Opt_xprt_udp:
|
|
|
mnt->flags &= ~NFS_MOUNT_TCP;
|
|
|
mnt->nfs_server.protocol = XPRT_TRANSPORT_UDP;
|
|
|
- mnt->timeo = 7;
|
|
|
- mnt->retrans = 5;
|
|
|
break;
|
|
|
case Opt_xprt_tcp:
|
|
|
mnt->flags |= NFS_MOUNT_TCP;
|
|
|
mnt->nfs_server.protocol = XPRT_TRANSPORT_TCP;
|
|
|
- mnt->timeo = 600;
|
|
|
- mnt->retrans = 2;
|
|
|
break;
|
|
|
case Opt_xprt_rdma:
|
|
|
/* vector side protocols to TCP */
|
|
|
mnt->flags |= NFS_MOUNT_TCP;
|
|
|
mnt->nfs_server.protocol = XPRT_TRANSPORT_RDMA;
|
|
|
- mnt->timeo = 600;
|
|
|
- mnt->retrans = 2;
|
|
|
break;
|
|
|
default:
|
|
|
goto out_unrec_xprt;
|
|
@@ -1438,14 +1463,11 @@ static int nfs_validate_mount_data(void *options,
|
|
|
args->flags = (NFS_MOUNT_VER3 | NFS_MOUNT_TCP);
|
|
|
args->rsize = NFS_MAX_FILE_IO_SIZE;
|
|
|
args->wsize = NFS_MAX_FILE_IO_SIZE;
|
|
|
- args->timeo = 600;
|
|
|
- args->retrans = 2;
|
|
|
args->acregmin = 3;
|
|
|
args->acregmax = 60;
|
|
|
args->acdirmin = 30;
|
|
|
args->acdirmax = 60;
|
|
|
args->mount_server.port = 0; /* autobind unless user sets port */
|
|
|
- args->mount_server.protocol = XPRT_TRANSPORT_UDP;
|
|
|
args->nfs_server.port = 0; /* autobind unless user sets port */
|
|
|
args->nfs_server.protocol = XPRT_TRANSPORT_TCP;
|
|
|
|
|
@@ -1546,6 +1568,8 @@ static int nfs_validate_mount_data(void *options,
|
|
|
&args->nfs_server.address))
|
|
|
goto out_no_address;
|
|
|
|
|
|
+ nfs_set_mount_transport_protocol(args);
|
|
|
+
|
|
|
status = nfs_parse_devname(dev_name,
|
|
|
&args->nfs_server.hostname,
|
|
|
PAGE_SIZE,
|
|
@@ -2095,14 +2119,11 @@ static int nfs4_validate_mount_data(void *options,
|
|
|
|
|
|
args->rsize = NFS_MAX_FILE_IO_SIZE;
|
|
|
args->wsize = NFS_MAX_FILE_IO_SIZE;
|
|
|
- args->timeo = 600;
|
|
|
- args->retrans = 2;
|
|
|
args->acregmin = 3;
|
|
|
args->acregmax = 60;
|
|
|
args->acdirmin = 30;
|
|
|
args->acdirmax = 60;
|
|
|
args->nfs_server.port = NFS_PORT; /* 2049 unless user set port= */
|
|
|
- args->nfs_server.protocol = XPRT_TRANSPORT_TCP;
|
|
|
|
|
|
switch (data->version) {
|
|
|
case 1:
|
|
@@ -2163,6 +2184,7 @@ static int nfs4_validate_mount_data(void *options,
|
|
|
args->acdirmin = data->acdirmin;
|
|
|
args->acdirmax = data->acdirmax;
|
|
|
args->nfs_server.protocol = data->proto;
|
|
|
+ nfs_validate_transport_protocol(args);
|
|
|
|
|
|
break;
|
|
|
default: {
|
|
@@ -2175,6 +2197,8 @@ static int nfs4_validate_mount_data(void *options,
|
|
|
&args->nfs_server.address))
|
|
|
return -EINVAL;
|
|
|
|
|
|
+ nfs_validate_transport_protocol(args);
|
|
|
+
|
|
|
switch (args->auth_flavor_len) {
|
|
|
case 0:
|
|
|
args->auth_flavors[0] = RPC_AUTH_UNIX;
|