forked from Minki/linux
NFS: set transport defaults after mount option parsing is finished
Move the UDP/TCP default timeo/retrans settings for text mounts to nfs_init_timeout_values(), which was were they were always being initialised (and sanity checked) for binary mounts. Document the default timeout values using appropriate #defines. Ensure that we initialise and sanity check the transport protocols that may have been specified by the user. Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
This commit is contained in:
parent
40fef8a649
commit
259875efed
@ -431,14 +431,14 @@ static void nfs_init_timeout_values(struct rpc_timeout *to, int proto,
|
||||
{
|
||||
to->to_initval = timeo * HZ / 10;
|
||||
to->to_retries = retrans;
|
||||
if (!to->to_retries)
|
||||
to->to_retries = 2;
|
||||
|
||||
switch (proto) {
|
||||
case XPRT_TRANSPORT_TCP:
|
||||
case XPRT_TRANSPORT_RDMA:
|
||||
if (to->to_retries == 0)
|
||||
to->to_retries = NFS_DEF_TCP_RETRANS;
|
||||
if (to->to_initval == 0)
|
||||
to->to_initval = 60 * HZ;
|
||||
to->to_initval = NFS_DEF_TCP_TIMEO * HZ / 10;
|
||||
if (to->to_initval > NFS_MAX_TCP_TIMEOUT)
|
||||
to->to_initval = NFS_MAX_TCP_TIMEOUT;
|
||||
to->to_increment = to->to_initval;
|
||||
@ -450,14 +450,17 @@ static void nfs_init_timeout_values(struct rpc_timeout *to, int proto,
|
||||
to->to_exponential = 0;
|
||||
break;
|
||||
case XPRT_TRANSPORT_UDP:
|
||||
default:
|
||||
if (to->to_retries == 0)
|
||||
to->to_retries = NFS_DEF_UDP_RETRANS;
|
||||
if (!to->to_initval)
|
||||
to->to_initval = 11 * HZ / 10;
|
||||
to->to_initval = NFS_DEF_UDP_TIMEO * HZ / 10;
|
||||
if (to->to_initval > NFS_MAX_UDP_TIMEOUT)
|
||||
to->to_initval = NFS_MAX_UDP_TIMEOUT;
|
||||
to->to_maxval = NFS_MAX_UDP_TIMEOUT;
|
||||
to->to_exponential = 1;
|
||||
break;
|
||||
default:
|
||||
BUG();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
|
@ -12,6 +12,11 @@
|
||||
#include <linux/magic.h>
|
||||
|
||||
/* Default timeout values */
|
||||
#define NFS_DEF_UDP_TIMEO (11)
|
||||
#define NFS_DEF_UDP_RETRANS (3)
|
||||
#define NFS_DEF_TCP_TIMEO (600)
|
||||
#define NFS_DEF_TCP_RETRANS (2)
|
||||
|
||||
#define NFS_MAX_UDP_TIMEOUT (60*HZ)
|
||||
#define NFS_MAX_TCP_TIMEOUT (600*HZ)
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user