diff options
author | Trond Myklebust <Trond.Myklebust@netapp.com> | 2008-07-02 14:43:47 -0400 |
---|---|---|
committer | Trond Myklebust <Trond.Myklebust@netapp.com> | 2008-07-09 12:09:38 -0400 |
commit | 259875efed06d6936f54c9a264e868937f1bc217 (patch) | |
tree | c3831c6050582e6ab90ab523131788e2b09df163 | |
parent | 40fef8a649e5344bfb6a67a7cc3def3e0dad6448 (diff) |
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>
-rw-r--r-- | fs/nfs/client.c | 13 | ||||
-rw-r--r-- | fs/nfs/super.c | 60 | ||||
-rw-r--r-- | include/linux/nfs_fs.h | 5 |
3 files changed, 55 insertions, 23 deletions
diff --git a/fs/nfs/client.c b/fs/nfs/client.c index f2a092ca69b5..5ee23e7058b3 100644 --- a/fs/nfs/client.c +++ b/fs/nfs/client.c | |||
@@ -431,14 +431,14 @@ static void nfs_init_timeout_values(struct rpc_timeout *to, int proto, | |||
431 | { | 431 | { |
432 | to->to_initval = timeo * HZ / 10; | 432 | to->to_initval = timeo * HZ / 10; |
433 | to->to_retries = retrans; | 433 | to->to_retries = retrans; |
434 | if (!to->to_retries) | ||
435 | to->to_retries = 2; | ||
436 | 434 | ||
437 | switch (proto) { | 435 | switch (proto) { |
438 | case XPRT_TRANSPORT_TCP: | 436 | case XPRT_TRANSPORT_TCP: |
439 | case XPRT_TRANSPORT_RDMA: | 437 | case XPRT_TRANSPORT_RDMA: |
438 | if (to->to_retries == 0) | ||
439 | to->to_retries = NFS_DEF_TCP_RETRANS; | ||
440 | if (to->to_initval == 0) | 440 | if (to->to_initval == 0) |
441 | to->to_initval = 60 * HZ; | 441 | to->to_initval = NFS_DEF_TCP_TIMEO * HZ / 10; |
442 | if (to->to_initval > NFS_MAX_TCP_TIMEOUT) | 442 | if (to->to_initval > NFS_MAX_TCP_TIMEOUT) |
443 | to->to_initval = NFS_MAX_TCP_TIMEOUT; | 443 | to->to_initval = NFS_MAX_TCP_TIMEOUT; |
444 | to->to_increment = to->to_initval; | 444 | to->to_increment = to->to_initval; |
@@ -450,14 +450,17 @@ static void nfs_init_timeout_values(struct rpc_timeout *to, int proto, | |||
450 | to->to_exponential = 0; | 450 | to->to_exponential = 0; |
451 | break; | 451 | break; |
452 | case XPRT_TRANSPORT_UDP: | 452 | case XPRT_TRANSPORT_UDP: |
453 | default: | 453 | if (to->to_retries == 0) |
454 | to->to_retries = NFS_DEF_UDP_RETRANS; | ||
454 | if (!to->to_initval) | 455 | if (!to->to_initval) |
455 | to->to_initval = 11 * HZ / 10; | 456 | to->to_initval = NFS_DEF_UDP_TIMEO * HZ / 10; |
456 | if (to->to_initval > NFS_MAX_UDP_TIMEOUT) | 457 | if (to->to_initval > NFS_MAX_UDP_TIMEOUT) |
457 | to->to_initval = NFS_MAX_UDP_TIMEOUT; | 458 | to->to_initval = NFS_MAX_UDP_TIMEOUT; |
458 | to->to_maxval = NFS_MAX_UDP_TIMEOUT; | 459 | to->to_maxval = NFS_MAX_UDP_TIMEOUT; |
459 | to->to_exponential = 1; | 460 | to->to_exponential = 1; |
460 | break; | 461 | break; |
462 | default: | ||
463 | BUG(); | ||
461 | } | 464 | } |
462 | } | 465 | } |
463 | 466 | ||
diff --git a/fs/nfs/super.c b/fs/nfs/super.c index 73a8e5970f02..9c1a960f5b94 100644 --- a/fs/nfs/super.c +++ b/fs/nfs/super.c | |||
@@ -817,6 +817,43 @@ static void nfs_parse_ip_address(char *string, size_t str_len, | |||
817 | } | 817 | } |
818 | 818 | ||
819 | /* | 819 | /* |
820 | * Sanity check the NFS transport protocol. | ||
821 | * | ||
822 | */ | ||
823 | static void nfs_validate_transport_protocol(struct nfs_parsed_mount_data *mnt) | ||
824 | { | ||
825 | switch (mnt->nfs_server.protocol) { | ||
826 | case XPRT_TRANSPORT_UDP: | ||
827 | case XPRT_TRANSPORT_TCP: | ||
828 | case XPRT_TRANSPORT_RDMA: | ||
829 | break; | ||
830 | default: | ||
831 | mnt->nfs_server.protocol = XPRT_TRANSPORT_TCP; | ||
832 | } | ||
833 | } | ||
834 | |||
835 | /* | ||
836 | * For text based NFSv2/v3 mounts, the mount protocol transport default | ||
837 | * settings should depend upon the specified NFS transport. | ||
838 | */ | ||
839 | static void nfs_set_mount_transport_protocol(struct nfs_parsed_mount_data *mnt) | ||
840 | { | ||
841 | nfs_validate_transport_protocol(mnt); | ||
842 | |||
843 | if (mnt->mount_server.protocol == XPRT_TRANSPORT_UDP || | ||
844 | mnt->mount_server.protocol == XPRT_TRANSPORT_TCP) | ||
845 | return; | ||
846 | switch (mnt->nfs_server.protocol) { | ||
847 | case XPRT_TRANSPORT_UDP: | ||
848 | mnt->mount_server.protocol = XPRT_TRANSPORT_UDP; | ||
849 | break; | ||
850 | case XPRT_TRANSPORT_TCP: | ||
851 | case XPRT_TRANSPORT_RDMA: | ||
852 | mnt->mount_server.protocol = XPRT_TRANSPORT_TCP; | ||
853 | } | ||
854 | } | ||
855 | |||
856 | /* | ||
820 | * Error-check and convert a string of mount options from user space into | 857 | * Error-check and convert a string of mount options from user space into |
821 | * a data structure | 858 | * a data structure |
822 | */ | 859 | */ |
@@ -896,20 +933,14 @@ static int nfs_parse_mount_options(char *raw, | |||
896 | case Opt_udp: | 933 | case Opt_udp: |
897 | mnt->flags &= ~NFS_MOUNT_TCP; | 934 | mnt->flags &= ~NFS_MOUNT_TCP; |
898 | mnt->nfs_server.protocol = XPRT_TRANSPORT_UDP; | 935 | mnt->nfs_server.protocol = XPRT_TRANSPORT_UDP; |
899 | mnt->timeo = 7; | ||
900 | mnt->retrans = 5; | ||
901 | break; | 936 | break; |
902 | case Opt_tcp: | 937 | case Opt_tcp: |
903 | mnt->flags |= NFS_MOUNT_TCP; | 938 | mnt->flags |= NFS_MOUNT_TCP; |
904 | mnt->nfs_server.protocol = XPRT_TRANSPORT_TCP; | 939 | mnt->nfs_server.protocol = XPRT_TRANSPORT_TCP; |
905 | mnt->timeo = 600; | ||
906 | mnt->retrans = 2; | ||
907 | break; | 940 | break; |
908 | case Opt_rdma: | 941 | case Opt_rdma: |
909 | mnt->flags |= NFS_MOUNT_TCP; /* for side protocols */ | 942 | mnt->flags |= NFS_MOUNT_TCP; /* for side protocols */ |
910 | mnt->nfs_server.protocol = XPRT_TRANSPORT_RDMA; | 943 | mnt->nfs_server.protocol = XPRT_TRANSPORT_RDMA; |
911 | mnt->timeo = 600; | ||
912 | mnt->retrans = 2; | ||
913 | break; | 944 | break; |
914 | case Opt_acl: | 945 | case Opt_acl: |
915 | mnt->flags &= ~NFS_MOUNT_NOACL; | 946 | mnt->flags &= ~NFS_MOUNT_NOACL; |
@@ -1103,21 +1134,15 @@ static int nfs_parse_mount_options(char *raw, | |||
1103 | case Opt_xprt_udp: | 1134 | case Opt_xprt_udp: |
1104 | mnt->flags &= ~NFS_MOUNT_TCP; | 1135 | mnt->flags &= ~NFS_MOUNT_TCP; |
1105 | mnt->nfs_server.protocol = XPRT_TRANSPORT_UDP; | 1136 | mnt->nfs_server.protocol = XPRT_TRANSPORT_UDP; |
1106 | mnt->timeo = 7; | ||
1107 | mnt->retrans = 5; | ||
1108 | break; | 1137 | break; |
1109 | case Opt_xprt_tcp: | 1138 | case Opt_xprt_tcp: |
1110 | mnt->flags |= NFS_MOUNT_TCP; | 1139 | mnt->flags |= NFS_MOUNT_TCP; |
1111 | mnt->nfs_server.protocol = XPRT_TRANSPORT_TCP; | 1140 | mnt->nfs_server.protocol = XPRT_TRANSPORT_TCP; |
1112 | mnt->timeo = 600; | ||
1113 | mnt->retrans = 2; | ||
1114 | break; | 1141 | break; |
1115 | case Opt_xprt_rdma: | 1142 | case Opt_xprt_rdma: |
1116 | /* vector side protocols to TCP */ | 1143 | /* vector side protocols to TCP */ |
1117 | mnt->flags |= NFS_MOUNT_TCP; | 1144 | mnt->flags |= NFS_MOUNT_TCP; |
1118 | mnt->nfs_server.protocol = XPRT_TRANSPORT_RDMA; | 1145 | mnt->nfs_server.protocol = XPRT_TRANSPORT_RDMA; |
1119 | mnt->timeo = 600; | ||
1120 | mnt->retrans = 2; | ||
1121 | break; | 1146 | break; |
1122 | default: | 1147 | default: |
1123 | goto out_unrec_xprt; | 1148 | goto out_unrec_xprt; |
@@ -1438,14 +1463,11 @@ static int nfs_validate_mount_data(void *options, | |||
1438 | args->flags = (NFS_MOUNT_VER3 | NFS_MOUNT_TCP); | 1463 | args->flags = (NFS_MOUNT_VER3 | NFS_MOUNT_TCP); |
1439 | args->rsize = NFS_MAX_FILE_IO_SIZE; | 1464 | args->rsize = NFS_MAX_FILE_IO_SIZE; |
1440 | args->wsize = NFS_MAX_FILE_IO_SIZE; | 1465 | args->wsize = NFS_MAX_FILE_IO_SIZE; |
1441 | args->timeo = 600; | ||
1442 | args->retrans = 2; | ||
1443 | args->acregmin = 3; | 1466 | args->acregmin = 3; |
1444 | args->acregmax = 60; | 1467 | args->acregmax = 60; |
1445 | args->acdirmin = 30; | 1468 | args->acdirmin = 30; |
1446 | args->acdirmax = 60; | 1469 | args->acdirmax = 60; |
1447 | args->mount_server.port = 0; /* autobind unless user sets port */ | 1470 | args->mount_server.port = 0; /* autobind unless user sets port */ |
1448 | args->mount_server.protocol = XPRT_TRANSPORT_UDP; | ||
1449 | args->nfs_server.port = 0; /* autobind unless user sets port */ | 1471 | args->nfs_server.port = 0; /* autobind unless user sets port */ |
1450 | args->nfs_server.protocol = XPRT_TRANSPORT_TCP; | 1472 | args->nfs_server.protocol = XPRT_TRANSPORT_TCP; |
1451 | 1473 | ||
@@ -1546,6 +1568,8 @@ static int nfs_validate_mount_data(void *options, | |||
1546 | &args->nfs_server.address)) | 1568 | &args->nfs_server.address)) |
1547 | goto out_no_address; | 1569 | goto out_no_address; |
1548 | 1570 | ||
1571 | nfs_set_mount_transport_protocol(args); | ||
1572 | |||
1549 | status = nfs_parse_devname(dev_name, | 1573 | status = nfs_parse_devname(dev_name, |
1550 | &args->nfs_server.hostname, | 1574 | &args->nfs_server.hostname, |
1551 | PAGE_SIZE, | 1575 | PAGE_SIZE, |
@@ -2095,14 +2119,11 @@ static int nfs4_validate_mount_data(void *options, | |||
2095 | 2119 | ||
2096 | args->rsize = NFS_MAX_FILE_IO_SIZE; | 2120 | args->rsize = NFS_MAX_FILE_IO_SIZE; |
2097 | args->wsize = NFS_MAX_FILE_IO_SIZE; | 2121 | args->wsize = NFS_MAX_FILE_IO_SIZE; |
2098 | args->timeo = 600; | ||
2099 | args->retrans = 2; | ||
2100 | args->acregmin = 3; | 2122 | args->acregmin = 3; |
2101 | args->acregmax = 60; | 2123 | args->acregmax = 60; |
2102 | args->acdirmin = 30; | 2124 | args->acdirmin = 30; |
2103 | args->acdirmax = 60; | 2125 | args->acdirmax = 60; |
2104 | args->nfs_server.port = NFS_PORT; /* 2049 unless user set port= */ | 2126 | args->nfs_server.port = NFS_PORT; /* 2049 unless user set port= */ |
2105 | args->nfs_server.protocol = XPRT_TRANSPORT_TCP; | ||
2106 | 2127 | ||
2107 | switch (data->version) { | 2128 | switch (data->version) { |
2108 | case 1: | 2129 | case 1: |
@@ -2163,6 +2184,7 @@ static int nfs4_validate_mount_data(void *options, | |||
2163 | args->acdirmin = data->acdirmin; | 2184 | args->acdirmin = data->acdirmin; |
2164 | args->acdirmax = data->acdirmax; | 2185 | args->acdirmax = data->acdirmax; |
2165 | args->nfs_server.protocol = data->proto; | 2186 | args->nfs_server.protocol = data->proto; |
2187 | nfs_validate_transport_protocol(args); | ||
2166 | 2188 | ||
2167 | break; | 2189 | break; |
2168 | default: { | 2190 | default: { |
@@ -2175,6 +2197,8 @@ static int nfs4_validate_mount_data(void *options, | |||
2175 | &args->nfs_server.address)) | 2197 | &args->nfs_server.address)) |
2176 | return -EINVAL; | 2198 | return -EINVAL; |
2177 | 2199 | ||
2200 | nfs_validate_transport_protocol(args); | ||
2201 | |||
2178 | switch (args->auth_flavor_len) { | 2202 | switch (args->auth_flavor_len) { |
2179 | case 0: | 2203 | case 0: |
2180 | args->auth_flavors[0] = RPC_AUTH_UNIX; | 2204 | args->auth_flavors[0] = RPC_AUTH_UNIX; |
diff --git a/include/linux/nfs_fs.h b/include/linux/nfs_fs.h index 27d6a8d98cef..830d9cc8cdce 100644 --- a/include/linux/nfs_fs.h +++ b/include/linux/nfs_fs.h | |||
@@ -12,6 +12,11 @@ | |||
12 | #include <linux/magic.h> | 12 | #include <linux/magic.h> |
13 | 13 | ||
14 | /* Default timeout values */ | 14 | /* Default timeout values */ |
15 | #define NFS_DEF_UDP_TIMEO (11) | ||
16 | #define NFS_DEF_UDP_RETRANS (3) | ||
17 | #define NFS_DEF_TCP_TIMEO (600) | ||
18 | #define NFS_DEF_TCP_RETRANS (2) | ||
19 | |||
15 | #define NFS_MAX_UDP_TIMEOUT (60*HZ) | 20 | #define NFS_MAX_UDP_TIMEOUT (60*HZ) |
16 | #define NFS_MAX_TCP_TIMEOUT (600*HZ) | 21 | #define NFS_MAX_TCP_TIMEOUT (600*HZ) |
17 | 22 | ||