diff options
author | Trond Myklebust <trond.myklebust@primarydata.com> | 2017-04-27 11:13:40 -0400 |
---|---|---|
committer | Trond Myklebust <trond.myklebust@hammerspace.com> | 2019-07-06 14:54:50 -0400 |
commit | 6619079d05404cb32be29af329b87ac3b0ad4f96 (patch) | |
tree | 76d7bd7275a30e9758c20cbaacc21ae950a93157 | |
parent | 28cc5cd8c68f1cd2146d88c7a54cc3234ed4dabe (diff) |
NFSv4: Allow multiple connections to NFSv4.x (x>0) servers
If the user specifies the -onconn=<number> mount option, and the transport
protocol is TCP, then set up <number> connections to the server. The
connections will all go to the same IP address.
Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
-rw-r--r-- | fs/nfs/client.c | 2 | ||||
-rw-r--r-- | fs/nfs/internal.h | 1 | ||||
-rw-r--r-- | fs/nfs/nfs4client.c | 11 | ||||
-rw-r--r-- | include/linux/nfs_fs_sb.h | 1 |
4 files changed, 13 insertions, 2 deletions
diff --git a/fs/nfs/client.c b/fs/nfs/client.c index d7e4f0848e28..fa6953e56a71 100644 --- a/fs/nfs/client.c +++ b/fs/nfs/client.c | |||
@@ -175,6 +175,7 @@ struct nfs_client *nfs_alloc_client(const struct nfs_client_initdata *cl_init) | |||
175 | clp->cl_rpcclient = ERR_PTR(-EINVAL); | 175 | clp->cl_rpcclient = ERR_PTR(-EINVAL); |
176 | 176 | ||
177 | clp->cl_proto = cl_init->proto; | 177 | clp->cl_proto = cl_init->proto; |
178 | clp->cl_nconnect = cl_init->nconnect; | ||
178 | clp->cl_net = get_net(cl_init->net); | 179 | clp->cl_net = get_net(cl_init->net); |
179 | 180 | ||
180 | clp->cl_principal = "*"; | 181 | clp->cl_principal = "*"; |
@@ -493,6 +494,7 @@ int nfs_create_rpc_client(struct nfs_client *clp, | |||
493 | struct rpc_create_args args = { | 494 | struct rpc_create_args args = { |
494 | .net = clp->cl_net, | 495 | .net = clp->cl_net, |
495 | .protocol = clp->cl_proto, | 496 | .protocol = clp->cl_proto, |
497 | .nconnect = clp->cl_nconnect, | ||
496 | .address = (struct sockaddr *)&clp->cl_addr, | 498 | .address = (struct sockaddr *)&clp->cl_addr, |
497 | .addrsize = clp->cl_addrlen, | 499 | .addrsize = clp->cl_addrlen, |
498 | .timeout = cl_init->timeparms, | 500 | .timeout = cl_init->timeparms, |
diff --git a/fs/nfs/internal.h b/fs/nfs/internal.h index bba09dace5d6..4a49dc1495c5 100644 --- a/fs/nfs/internal.h +++ b/fs/nfs/internal.h | |||
@@ -82,6 +82,7 @@ struct nfs_client_initdata { | |||
82 | struct nfs_subversion *nfs_mod; | 82 | struct nfs_subversion *nfs_mod; |
83 | int proto; | 83 | int proto; |
84 | u32 minorversion; | 84 | u32 minorversion; |
85 | unsigned int nconnect; | ||
85 | struct net *net; | 86 | struct net *net; |
86 | const struct rpc_timeout *timeparms; | 87 | const struct rpc_timeout *timeparms; |
87 | const struct cred *cred; | 88 | const struct cred *cred; |
diff --git a/fs/nfs/nfs4client.c b/fs/nfs/nfs4client.c index 81b9b6d7927a..5c244c440658 100644 --- a/fs/nfs/nfs4client.c +++ b/fs/nfs/nfs4client.c | |||
@@ -859,7 +859,8 @@ static int nfs4_set_client(struct nfs_server *server, | |||
859 | const size_t addrlen, | 859 | const size_t addrlen, |
860 | const char *ip_addr, | 860 | const char *ip_addr, |
861 | int proto, const struct rpc_timeout *timeparms, | 861 | int proto, const struct rpc_timeout *timeparms, |
862 | u32 minorversion, struct net *net) | 862 | u32 minorversion, unsigned int nconnect, |
863 | struct net *net) | ||
863 | { | 864 | { |
864 | struct nfs_client_initdata cl_init = { | 865 | struct nfs_client_initdata cl_init = { |
865 | .hostname = hostname, | 866 | .hostname = hostname, |
@@ -875,6 +876,8 @@ static int nfs4_set_client(struct nfs_server *server, | |||
875 | }; | 876 | }; |
876 | struct nfs_client *clp; | 877 | struct nfs_client *clp; |
877 | 878 | ||
879 | if (minorversion > 0 && proto == XPRT_TRANSPORT_TCP) | ||
880 | cl_init.nconnect = nconnect; | ||
878 | if (server->flags & NFS_MOUNT_NORESVPORT) | 881 | if (server->flags & NFS_MOUNT_NORESVPORT) |
879 | set_bit(NFS_CS_NORESVPORT, &cl_init.init_flags); | 882 | set_bit(NFS_CS_NORESVPORT, &cl_init.init_flags); |
880 | if (server->options & NFS_OPTION_MIGRATION) | 883 | if (server->options & NFS_OPTION_MIGRATION) |
@@ -1074,6 +1077,7 @@ static int nfs4_init_server(struct nfs_server *server, | |||
1074 | data->nfs_server.protocol, | 1077 | data->nfs_server.protocol, |
1075 | &timeparms, | 1078 | &timeparms, |
1076 | data->minorversion, | 1079 | data->minorversion, |
1080 | data->nfs_server.nconnect, | ||
1077 | data->net); | 1081 | data->net); |
1078 | if (error < 0) | 1082 | if (error < 0) |
1079 | return error; | 1083 | return error; |
@@ -1163,6 +1167,7 @@ struct nfs_server *nfs4_create_referral_server(struct nfs_clone_mount *data, | |||
1163 | XPRT_TRANSPORT_RDMA, | 1167 | XPRT_TRANSPORT_RDMA, |
1164 | parent_server->client->cl_timeout, | 1168 | parent_server->client->cl_timeout, |
1165 | parent_client->cl_mvops->minor_version, | 1169 | parent_client->cl_mvops->minor_version, |
1170 | parent_client->cl_nconnect, | ||
1166 | parent_client->cl_net); | 1171 | parent_client->cl_net); |
1167 | if (!error) | 1172 | if (!error) |
1168 | goto init_server; | 1173 | goto init_server; |
@@ -1176,6 +1181,7 @@ struct nfs_server *nfs4_create_referral_server(struct nfs_clone_mount *data, | |||
1176 | XPRT_TRANSPORT_TCP, | 1181 | XPRT_TRANSPORT_TCP, |
1177 | parent_server->client->cl_timeout, | 1182 | parent_server->client->cl_timeout, |
1178 | parent_client->cl_mvops->minor_version, | 1183 | parent_client->cl_mvops->minor_version, |
1184 | parent_client->cl_nconnect, | ||
1179 | parent_client->cl_net); | 1185 | parent_client->cl_net); |
1180 | if (error < 0) | 1186 | if (error < 0) |
1181 | goto error; | 1187 | goto error; |
@@ -1271,7 +1277,8 @@ int nfs4_update_server(struct nfs_server *server, const char *hostname, | |||
1271 | set_bit(NFS_MIG_TSM_POSSIBLE, &server->mig_status); | 1277 | set_bit(NFS_MIG_TSM_POSSIBLE, &server->mig_status); |
1272 | error = nfs4_set_client(server, hostname, sap, salen, buf, | 1278 | error = nfs4_set_client(server, hostname, sap, salen, buf, |
1273 | clp->cl_proto, clnt->cl_timeout, | 1279 | clp->cl_proto, clnt->cl_timeout, |
1274 | clp->cl_minorversion, net); | 1280 | clp->cl_minorversion, |
1281 | clp->cl_nconnect, net); | ||
1275 | clear_bit(NFS_MIG_TSM_POSSIBLE, &server->mig_status); | 1282 | clear_bit(NFS_MIG_TSM_POSSIBLE, &server->mig_status); |
1276 | if (error != 0) { | 1283 | if (error != 0) { |
1277 | nfs_server_insert_lists(server); | 1284 | nfs_server_insert_lists(server); |
diff --git a/include/linux/nfs_fs_sb.h b/include/linux/nfs_fs_sb.h index 1e78032a174b..a87fe854f008 100644 --- a/include/linux/nfs_fs_sb.h +++ b/include/linux/nfs_fs_sb.h | |||
@@ -58,6 +58,7 @@ struct nfs_client { | |||
58 | struct nfs_subversion * cl_nfs_mod; /* pointer to nfs version module */ | 58 | struct nfs_subversion * cl_nfs_mod; /* pointer to nfs version module */ |
59 | 59 | ||
60 | u32 cl_minorversion;/* NFSv4 minorversion */ | 60 | u32 cl_minorversion;/* NFSv4 minorversion */ |
61 | unsigned int cl_nconnect; /* Number of connections */ | ||
61 | const char * cl_principal; /* used for machine cred */ | 62 | const char * cl_principal; /* used for machine cred */ |
62 | 63 | ||
63 | #if IS_ENABLED(CONFIG_NFS_V4) | 64 | #if IS_ENABLED(CONFIG_NFS_V4) |