Skip to content

Commit 7ffcdaa

Browse files
Olga KornievskaiaTrond Myklebust
authored andcommitted
SUNRPC expose functions for offline remote xprt functionality
Re-arrange the code that make offline transport and delete transport callable functions. Signed-off-by: Olga Kornievskaia <[email protected]> Signed-off-by: Trond Myklebust <[email protected]>
1 parent 29946fb commit 7ffcdaa

File tree

3 files changed

+40
-23
lines changed

3 files changed

+40
-23
lines changed

include/linux/sunrpc/xprt.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -505,4 +505,7 @@ static inline int xprt_test_and_set_binding(struct rpc_xprt *xprt)
505505
return test_and_set_bit(XPRT_BINDING, &xprt->state);
506506
}
507507

508+
void xprt_set_offline_locked(struct rpc_xprt *xprt, struct rpc_xprt_switch *xps);
509+
void xprt_set_online_locked(struct rpc_xprt *xprt, struct rpc_xprt_switch *xps);
510+
void xprt_delete_locked(struct rpc_xprt *xprt, struct rpc_xprt_switch *xps);
508511
#endif /* _LINUX_SUNRPC_XPRT_H */

net/sunrpc/sysfs.c

Lines changed: 5 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -314,32 +314,14 @@ static ssize_t rpc_sysfs_xprt_state_change(struct kobject *kobj,
314314
goto release_tasks;
315315
}
316316
if (offline) {
317-
if (!test_and_set_bit(XPRT_OFFLINE, &xprt->state)) {
318-
spin_lock(&xps->xps_lock);
319-
xps->xps_nactive--;
320-
spin_unlock(&xps->xps_lock);
321-
}
317+
xprt_set_offline_locked(xprt, xps);
322318
} else if (online) {
323-
if (test_and_clear_bit(XPRT_OFFLINE, &xprt->state)) {
324-
spin_lock(&xps->xps_lock);
325-
xps->xps_nactive++;
326-
spin_unlock(&xps->xps_lock);
327-
}
319+
xprt_set_online_locked(xprt, xps);
328320
} else if (remove) {
329-
if (test_bit(XPRT_OFFLINE, &xprt->state)) {
330-
if (!test_and_set_bit(XPRT_REMOVE, &xprt->state)) {
331-
xprt_force_disconnect(xprt);
332-
if (test_bit(XPRT_CONNECTED, &xprt->state)) {
333-
if (!xprt->sending.qlen &&
334-
!xprt->pending.qlen &&
335-
!xprt->backlog.qlen &&
336-
!atomic_long_read(&xprt->queuelen))
337-
rpc_xprt_switch_remove_xprt(xps, xprt);
338-
}
339-
}
340-
} else {
321+
if (test_bit(XPRT_OFFLINE, &xprt->state))
322+
xprt_delete_locked(xprt, xps);
323+
else
341324
count = -EINVAL;
342-
}
343325
}
344326

345327
release_tasks:

net/sunrpc/xprt.c

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2152,3 +2152,35 @@ void xprt_put(struct rpc_xprt *xprt)
21522152
kref_put(&xprt->kref, xprt_destroy_kref);
21532153
}
21542154
EXPORT_SYMBOL_GPL(xprt_put);
2155+
2156+
void xprt_set_offline_locked(struct rpc_xprt *xprt, struct rpc_xprt_switch *xps)
2157+
{
2158+
if (!test_and_set_bit(XPRT_OFFLINE, &xprt->state)) {
2159+
spin_lock(&xps->xps_lock);
2160+
xps->xps_nactive--;
2161+
spin_unlock(&xps->xps_lock);
2162+
}
2163+
}
2164+
2165+
void xprt_set_online_locked(struct rpc_xprt *xprt, struct rpc_xprt_switch *xps)
2166+
{
2167+
if (test_and_clear_bit(XPRT_OFFLINE, &xprt->state)) {
2168+
spin_lock(&xps->xps_lock);
2169+
xps->xps_nactive++;
2170+
spin_unlock(&xps->xps_lock);
2171+
}
2172+
}
2173+
2174+
void xprt_delete_locked(struct rpc_xprt *xprt, struct rpc_xprt_switch *xps)
2175+
{
2176+
if (test_and_set_bit(XPRT_REMOVE, &xprt->state))
2177+
return;
2178+
2179+
xprt_force_disconnect(xprt);
2180+
if (!test_bit(XPRT_CONNECTED, &xprt->state))
2181+
return;
2182+
2183+
if (!xprt->sending.qlen && !xprt->pending.qlen &&
2184+
!xprt->backlog.qlen && !atomic_long_read(&xprt->queuelen))
2185+
rpc_xprt_switch_remove_xprt(xps, xprt);
2186+
}

0 commit comments

Comments
 (0)