Skip to content

Commit

Permalink
SUNRPC enforce creation of no more than max_connect xprts
Browse files Browse the repository at this point in the history
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: Olga Kornievskaia <kolga@netapp.com>
  • Loading branch information
olgakorn1 authored and intel-lab-lkp committed Aug 24, 2021
1 parent bab63c3 commit 9ac1118
Show file tree
Hide file tree
Showing 3 changed files with 12 additions and 0 deletions.
1 change: 1 addition & 0 deletions fs/nfs/client.c
Original file line number Diff line number Diff line change
Expand Up @@ -541,6 +541,7 @@ int nfs_create_rpc_client(struct nfs_client *clp,

clnt->cl_principal = clp->cl_principal;
clp->cl_rpcclient = clnt;
clnt->cl_max_connect = clp->cl_max_connect;
return 0;
}
EXPORT_SYMBOL_GPL(nfs_create_rpc_client);
Expand Down
2 changes: 2 additions & 0 deletions include/linux/sunrpc/clnt.h
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,7 @@ struct rpc_clnt {
struct work_struct cl_work;
};
const struct cred *cl_cred;
unsigned int cl_max_connect; /* max number of transports not to the same IP */
};

/*
Expand Down Expand Up @@ -135,6 +136,7 @@ struct rpc_create_args {
char *client_name;
struct svc_xprt *bc_xprt; /* NFSv4.1 backchannel */
const struct cred *cred;
unsigned int max_connect;
};

struct rpc_add_xprt_test {
Expand Down
9 changes: 9 additions & 0 deletions net/sunrpc/clnt.c
Original file line number Diff line number Diff line change
Expand Up @@ -2774,6 +2774,15 @@ int rpc_clnt_test_and_add_xprt(struct rpc_clnt *clnt,
struct rpc_cb_add_xprt_calldata *data;
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,
rcu_dereference(xprt->address_strings[RPC_DISPLAY_ADDR]));
rcu_read_unlock();
return -EINVAL;
}

data = kmalloc(sizeof(*data), GFP_NOFS);
if (!data)
return -ENOMEM;
Expand Down

0 comments on commit 9ac1118

Please sign in to comment.