SUNRPC add function to offline remove trunkable transports

Iterate thru available transports in the xprt_switch for all
trunkable transports offline and possibly remote them as well.

Signed-off-by: Olga Kornievskaia <kolga@netapp.com>
Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
This commit is contained in:
Olga Kornievskaia 2022-07-25 09:32:22 -04:00 committed by Trond Myklebust
parent 7ffcdaa670
commit 895245ccea
2 changed files with 47 additions and 0 deletions

View File

@ -234,6 +234,7 @@ int rpc_clnt_setup_test_and_add_xprt(struct rpc_clnt *,
struct rpc_xprt_switch *,
struct rpc_xprt *,
void *);
void rpc_clnt_manage_trunked_xprts(struct rpc_clnt *);
const char *rpc_proc_name(const struct rpc_task *task);

View File

@ -3000,6 +3000,52 @@ out_put_switch:
}
EXPORT_SYMBOL_GPL(rpc_clnt_add_xprt);
static int rpc_xprt_offline(struct rpc_clnt *clnt,
struct rpc_xprt *xprt,
void *data)
{
struct rpc_xprt *main_xprt;
struct rpc_xprt_switch *xps;
int err = 0;
xprt_get(xprt);
rcu_read_lock();
main_xprt = xprt_get(rcu_dereference(clnt->cl_xprt));
xps = xprt_switch_get(rcu_dereference(clnt->cl_xpi.xpi_xpswitch));
err = rpc_cmp_addr_port((struct sockaddr *)&xprt->addr,
(struct sockaddr *)&main_xprt->addr);
rcu_read_unlock();
xprt_put(main_xprt);
if (err)
goto out;
if (wait_on_bit_lock(&xprt->state, XPRT_LOCKED, TASK_KILLABLE)) {
err = -EINTR;
goto out;
}
xprt_set_offline_locked(xprt, xps);
xprt_release_write(xprt, NULL);
out:
xprt_put(xprt);
xprt_switch_put(xps);
return err;
}
/* rpc_clnt_manage_trunked_xprts -- offline trunked transports
* @clnt rpc_clnt structure
*
* For each active transport found in the rpc_clnt structure call
* the function rpc_xprt_offline() which will identify trunked transports
* and will mark them offline.
*/
void rpc_clnt_manage_trunked_xprts(struct rpc_clnt *clnt)
{
rpc_clnt_iterate_for_each_xprt(clnt, rpc_xprt_offline, NULL);
}
EXPORT_SYMBOL_GPL(rpc_clnt_manage_trunked_xprts);
struct connect_timeout_data {
unsigned long connect_timeout;
unsigned long reconnect_timeout;