Skip to content

Commit 497e646

Browse files
Olga KornievskaiaTrond Myklebust
authored andcommitted
SUNRPC create an rpc function that allows xprt removal from rpc_clnt
Expose a function that allows a removal of xprt from the rpc_clnt. When called from NFS that's running a trunked transport then don't decrement the active transport counter. Signed-off-by: Olga Kornievskaia <[email protected]> Signed-off-by: Trond Myklebust <[email protected]>
1 parent 9368fd6 commit 497e646

File tree

5 files changed

+24
-8
lines changed

5 files changed

+24
-8
lines changed

include/linux/sunrpc/clnt.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -240,6 +240,7 @@ const char *rpc_proc_name(const struct rpc_task *task);
240240

241241
void rpc_clnt_xprt_switch_put(struct rpc_clnt *);
242242
void rpc_clnt_xprt_switch_add_xprt(struct rpc_clnt *, struct rpc_xprt *);
243+
void rpc_clnt_xprt_switch_remove_xprt(struct rpc_clnt *, struct rpc_xprt *);
243244
bool rpc_clnt_xprt_switch_has_addr(struct rpc_clnt *clnt,
244245
const struct sockaddr *sap);
245246
void rpc_clnt_xprt_set_online(struct rpc_clnt *clnt, struct rpc_xprt *xprt);

include/linux/sunrpc/xprtmultipath.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ extern void rpc_xprt_switch_set_roundrobin(struct rpc_xprt_switch *xps);
5555
extern void rpc_xprt_switch_add_xprt(struct rpc_xprt_switch *xps,
5656
struct rpc_xprt *xprt);
5757
extern void rpc_xprt_switch_remove_xprt(struct rpc_xprt_switch *xps,
58-
struct rpc_xprt *xprt);
58+
struct rpc_xprt *xprt, bool offline);
5959

6060
extern void xprt_iter_init(struct rpc_xprt_iter *xpi,
6161
struct rpc_xprt_switch *xps);

net/sunrpc/clnt.c

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2144,7 +2144,8 @@ call_connect_status(struct rpc_task *task)
21442144
xprt_release(task);
21452145
value = atomic_long_dec_return(&xprt->queuelen);
21462146
if (value == 0)
2147-
rpc_xprt_switch_remove_xprt(xps, saved);
2147+
rpc_xprt_switch_remove_xprt(xps, saved,
2148+
true);
21482149
xprt_put(saved);
21492150
task->tk_xprt = NULL;
21502151
task->tk_action = call_start;
@@ -3118,6 +3119,19 @@ void rpc_clnt_xprt_switch_add_xprt(struct rpc_clnt *clnt, struct rpc_xprt *xprt)
31183119
}
31193120
EXPORT_SYMBOL_GPL(rpc_clnt_xprt_switch_add_xprt);
31203121

3122+
void rpc_clnt_xprt_switch_remove_xprt(struct rpc_clnt *clnt, struct rpc_xprt *xprt)
3123+
{
3124+
struct rpc_xprt_switch *xps;
3125+
3126+
rcu_read_lock();
3127+
xps = rcu_dereference(clnt->cl_xpi.xpi_xpswitch);
3128+
rpc_xprt_switch_remove_xprt(rcu_dereference(clnt->cl_xpi.xpi_xpswitch),
3129+
xprt, 0);
3130+
xps->xps_nunique_destaddr_xprts--;
3131+
rcu_read_unlock();
3132+
}
3133+
EXPORT_SYMBOL_GPL(rpc_clnt_xprt_switch_remove_xprt);
3134+
31213135
bool rpc_clnt_xprt_switch_has_addr(struct rpc_clnt *clnt,
31223136
const struct sockaddr *sap)
31233137
{

net/sunrpc/xprt.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2182,5 +2182,5 @@ void xprt_delete_locked(struct rpc_xprt *xprt, struct rpc_xprt_switch *xps)
21822182

21832183
if (!xprt->sending.qlen && !xprt->pending.qlen &&
21842184
!xprt->backlog.qlen && !atomic_long_read(&xprt->queuelen))
2185-
rpc_xprt_switch_remove_xprt(xps, xprt);
2185+
rpc_xprt_switch_remove_xprt(xps, xprt, true);
21862186
}

net/sunrpc/xprtmultipath.c

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -62,11 +62,11 @@ void rpc_xprt_switch_add_xprt(struct rpc_xprt_switch *xps,
6262
}
6363

6464
static void xprt_switch_remove_xprt_locked(struct rpc_xprt_switch *xps,
65-
struct rpc_xprt *xprt)
65+
struct rpc_xprt *xprt, bool offline)
6666
{
6767
if (unlikely(xprt == NULL))
6868
return;
69-
if (!test_bit(XPRT_OFFLINE, &xprt->state))
69+
if (!test_bit(XPRT_OFFLINE, &xprt->state) && offline)
7070
xps->xps_nactive--;
7171
xps->xps_nxprts--;
7272
if (xps->xps_nxprts == 0)
@@ -79,14 +79,15 @@ static void xprt_switch_remove_xprt_locked(struct rpc_xprt_switch *xps,
7979
* rpc_xprt_switch_remove_xprt - Removes an rpc_xprt from a rpc_xprt_switch
8080
* @xps: pointer to struct rpc_xprt_switch
8181
* @xprt: pointer to struct rpc_xprt
82+
* @offline: indicates if the xprt that's being removed is in an offline state
8283
*
8384
* Removes xprt from the list of struct rpc_xprt in xps.
8485
*/
8586
void rpc_xprt_switch_remove_xprt(struct rpc_xprt_switch *xps,
86-
struct rpc_xprt *xprt)
87+
struct rpc_xprt *xprt, bool offline)
8788
{
8889
spin_lock(&xps->xps_lock);
89-
xprt_switch_remove_xprt_locked(xps, xprt);
90+
xprt_switch_remove_xprt_locked(xps, xprt, offline);
9091
spin_unlock(&xps->xps_lock);
9192
xprt_put(xprt);
9293
}
@@ -155,7 +156,7 @@ static void xprt_switch_free_entries(struct rpc_xprt_switch *xps)
155156

156157
xprt = list_first_entry(&xps->xps_xprt_list,
157158
struct rpc_xprt, xprt_switch);
158-
xprt_switch_remove_xprt_locked(xps, xprt);
159+
xprt_switch_remove_xprt_locked(xps, xprt, true);
159160
spin_unlock(&xps->xps_lock);
160161
xprt_put(xprt);
161162
spin_lock(&xps->xps_lock);

0 commit comments

Comments
 (0)