summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTrond Myklebust <trond.myklebust@primarydata.com>2017-04-27 11:13:40 -0400
committerTrond Myklebust <trond.myklebust@hammerspace.com>2019-07-06 14:54:50 -0400
commit6619079d05404cb32be29af329b87ac3b0ad4f96 (patch)
tree76d7bd7275a30e9758c20cbaacc21ae950a93157
parent28cc5cd8c68f1cd2146d88c7a54cc3234ed4dabe (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.c2
-rw-r--r--fs/nfs/internal.h1
-rw-r--r--fs/nfs/nfs4client.c11
-rw-r--r--include/linux/nfs_fs_sb.h1
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)