Skip to content

Commit 895245c

Browse files
Olga KornievskaiaTrond Myklebust
authored andcommitted
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 <[email protected]> Signed-off-by: Trond Myklebust <[email protected]>
1 parent 7ffcdaa commit 895245c

File tree

2 files changed

+47
-0
lines changed

2 files changed

+47
-0
lines changed

include/linux/sunrpc/clnt.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -234,6 +234,7 @@ int rpc_clnt_setup_test_and_add_xprt(struct rpc_clnt *,
234234
struct rpc_xprt_switch *,
235235
struct rpc_xprt *,
236236
void *);
237+
void rpc_clnt_manage_trunked_xprts(struct rpc_clnt *);
237238

238239
const char *rpc_proc_name(const struct rpc_task *task);
239240

net/sunrpc/clnt.c

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3000,6 +3000,52 @@ int rpc_clnt_add_xprt(struct rpc_clnt *clnt,
30003000
}
30013001
EXPORT_SYMBOL_GPL(rpc_clnt_add_xprt);
30023002

3003+
static int rpc_xprt_offline(struct rpc_clnt *clnt,
3004+
struct rpc_xprt *xprt,
3005+
void *data)
3006+
{
3007+
struct rpc_xprt *main_xprt;
3008+
struct rpc_xprt_switch *xps;
3009+
int err = 0;
3010+
3011+
xprt_get(xprt);
3012+
3013+
rcu_read_lock();
3014+
main_xprt = xprt_get(rcu_dereference(clnt->cl_xprt));
3015+
xps = xprt_switch_get(rcu_dereference(clnt->cl_xpi.xpi_xpswitch));
3016+
err = rpc_cmp_addr_port((struct sockaddr *)&xprt->addr,
3017+
(struct sockaddr *)&main_xprt->addr);
3018+
rcu_read_unlock();
3019+
xprt_put(main_xprt);
3020+
if (err)
3021+
goto out;
3022+
3023+
if (wait_on_bit_lock(&xprt->state, XPRT_LOCKED, TASK_KILLABLE)) {
3024+
err = -EINTR;
3025+
goto out;
3026+
}
3027+
xprt_set_offline_locked(xprt, xps);
3028+
3029+
xprt_release_write(xprt, NULL);
3030+
out:
3031+
xprt_put(xprt);
3032+
xprt_switch_put(xps);
3033+
return err;
3034+
}
3035+
3036+
/* rpc_clnt_manage_trunked_xprts -- offline trunked transports
3037+
* @clnt rpc_clnt structure
3038+
*
3039+
* For each active transport found in the rpc_clnt structure call
3040+
* the function rpc_xprt_offline() which will identify trunked transports
3041+
* and will mark them offline.
3042+
*/
3043+
void rpc_clnt_manage_trunked_xprts(struct rpc_clnt *clnt)
3044+
{
3045+
rpc_clnt_iterate_for_each_xprt(clnt, rpc_xprt_offline, NULL);
3046+
}
3047+
EXPORT_SYMBOL_GPL(rpc_clnt_manage_trunked_xprts);
3048+
30033049
struct connect_timeout_data {
30043050
unsigned long connect_timeout;
30053051
unsigned long reconnect_timeout;

0 commit comments

Comments
 (0)