Commit dc48e0ab authored by Olga Kornievskaia's avatar Olga Kornievskaia Committed by Anna Schumaker

SUNRPC enforce creation of no more than max_connect xprts

If we are adding new transports via rpc_clnt_test_and_add_xprt()
then check if we've reached the limit. Currently only pnfs path
adds transports via that function but this is done in
preparation when the client would add new transports when
session trunking is detected. A warning is logged if the
limit is reached.
Signed-off-by: default avatarOlga Kornievskaia <kolga@netapp.com>
Signed-off-by: default avatarAnna Schumaker <Anna.Schumaker@Netapp.com>
parent 7e134205
...@@ -541,6 +541,7 @@ int nfs_create_rpc_client(struct nfs_client *clp, ...@@ -541,6 +541,7 @@ int nfs_create_rpc_client(struct nfs_client *clp,
clnt->cl_principal = clp->cl_principal; clnt->cl_principal = clp->cl_principal;
clp->cl_rpcclient = clnt; clp->cl_rpcclient = clnt;
clnt->cl_max_connect = clp->cl_max_connect;
return 0; return 0;
} }
EXPORT_SYMBOL_GPL(nfs_create_rpc_client); EXPORT_SYMBOL_GPL(nfs_create_rpc_client);
......
...@@ -82,6 +82,7 @@ struct rpc_clnt { ...@@ -82,6 +82,7 @@ struct rpc_clnt {
struct work_struct cl_work; struct work_struct cl_work;
}; };
const struct cred *cl_cred; const struct cred *cl_cred;
unsigned int cl_max_connect; /* max number of transports not to the same IP */
}; };
/* /*
...@@ -136,6 +137,7 @@ struct rpc_create_args { ...@@ -136,6 +137,7 @@ struct rpc_create_args {
char *client_name; char *client_name;
struct svc_xprt *bc_xprt; /* NFSv4.1 backchannel */ struct svc_xprt *bc_xprt; /* NFSv4.1 backchannel */
const struct cred *cred; const struct cred *cred;
unsigned int max_connect;
}; };
struct rpc_add_xprt_test { struct rpc_add_xprt_test {
......
...@@ -2787,6 +2787,15 @@ int rpc_clnt_test_and_add_xprt(struct rpc_clnt *clnt, ...@@ -2787,6 +2787,15 @@ int rpc_clnt_test_and_add_xprt(struct rpc_clnt *clnt,
struct rpc_cb_add_xprt_calldata *data; struct rpc_cb_add_xprt_calldata *data;
struct rpc_task *task; struct rpc_task *task;
if (xps->xps_nunique_destaddr_xprts + 1 > clnt->cl_max_connect) {
rcu_read_lock();
pr_warn("SUNRPC: reached max allowed number (%d) did not add "
"transport to server: %s\n", clnt->cl_max_connect,
rpc_peeraddr2str(clnt, RPC_DISPLAY_ADDR));
rcu_read_unlock();
return -EINVAL;
}
data = kmalloc(sizeof(*data), GFP_NOFS); data = kmalloc(sizeof(*data), GFP_NOFS);
if (!data) if (!data)
return -ENOMEM; return -ENOMEM;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment