]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
SUNRPC expose functions for offline remote xprt functionality
authorOlga Kornievskaia <olga.kornievskaia@gmail.com>
Mon, 25 Jul 2022 13:32:21 +0000 (09:32 -0400)
committerTrond Myklebust <trond.myklebust@hammerspace.com>
Mon, 25 Jul 2022 14:06:04 +0000 (10:06 -0400)
Re-arrange the code that make offline transport and delete transport
callable functions.

Signed-off-by: Olga Kornievskaia <kolga@netapp.com>
Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
include/linux/sunrpc/xprt.h
net/sunrpc/sysfs.c
net/sunrpc/xprt.c

index 522bbf937957132e121ae9e175917e34cde9bc6e..0d51b9f9ea379330cc12d3179573657fc1f47e87 100644 (file)
@@ -505,4 +505,7 @@ static inline int xprt_test_and_set_binding(struct rpc_xprt *xprt)
        return test_and_set_bit(XPRT_BINDING, &xprt->state);
 }
 
+void xprt_set_offline_locked(struct rpc_xprt *xprt, struct rpc_xprt_switch *xps);
+void xprt_set_online_locked(struct rpc_xprt *xprt, struct rpc_xprt_switch *xps);
+void xprt_delete_locked(struct rpc_xprt *xprt, struct rpc_xprt_switch *xps);
 #endif /* _LINUX_SUNRPC_XPRT_H */
index a3a2f8aeb80ea98a5690d4c876aeb5a70eab7437..7330eb9a70cf82ce1084f977106532b7d363949b 100644 (file)
@@ -314,32 +314,14 @@ static ssize_t rpc_sysfs_xprt_state_change(struct kobject *kobj,
                goto release_tasks;
        }
        if (offline) {
-               if (!test_and_set_bit(XPRT_OFFLINE, &xprt->state)) {
-                       spin_lock(&xps->xps_lock);
-                       xps->xps_nactive--;
-                       spin_unlock(&xps->xps_lock);
-               }
+               xprt_set_offline_locked(xprt, xps);
        } else if (online) {
-               if (test_and_clear_bit(XPRT_OFFLINE, &xprt->state)) {
-                       spin_lock(&xps->xps_lock);
-                       xps->xps_nactive++;
-                       spin_unlock(&xps->xps_lock);
-               }
+               xprt_set_online_locked(xprt, xps);
        } else if (remove) {
-               if (test_bit(XPRT_OFFLINE, &xprt->state)) {
-                       if (!test_and_set_bit(XPRT_REMOVE, &xprt->state)) {
-                               xprt_force_disconnect(xprt);
-                               if (test_bit(XPRT_CONNECTED, &xprt->state)) {
-                                       if (!xprt->sending.qlen &&
-                                           !xprt->pending.qlen &&
-                                           !xprt->backlog.qlen &&
-                                           !atomic_long_read(&xprt->queuelen))
-                                               rpc_xprt_switch_remove_xprt(xps, xprt);
-                               }
-                       }
-               } else {
+               if (test_bit(XPRT_OFFLINE, &xprt->state))
+                       xprt_delete_locked(xprt, xps);
+               else
                        count = -EINVAL;
-               }
        }
 
 release_tasks:
index 86d62cffba0dd178d9c9c2529197d2f171c192de..8f8e3c952f24afc7cd6a54a6db89adf6e57c683a 100644 (file)
@@ -2152,3 +2152,35 @@ void xprt_put(struct rpc_xprt *xprt)
                kref_put(&xprt->kref, xprt_destroy_kref);
 }
 EXPORT_SYMBOL_GPL(xprt_put);
+
+void xprt_set_offline_locked(struct rpc_xprt *xprt, struct rpc_xprt_switch *xps)
+{
+       if (!test_and_set_bit(XPRT_OFFLINE, &xprt->state)) {
+               spin_lock(&xps->xps_lock);
+               xps->xps_nactive--;
+               spin_unlock(&xps->xps_lock);
+       }
+}
+
+void xprt_set_online_locked(struct rpc_xprt *xprt, struct rpc_xprt_switch *xps)
+{
+       if (test_and_clear_bit(XPRT_OFFLINE, &xprt->state)) {
+               spin_lock(&xps->xps_lock);
+               xps->xps_nactive++;
+               spin_unlock(&xps->xps_lock);
+       }
+}
+
+void xprt_delete_locked(struct rpc_xprt *xprt, struct rpc_xprt_switch *xps)
+{
+       if (test_and_set_bit(XPRT_REMOVE, &xprt->state))
+               return;
+
+       xprt_force_disconnect(xprt);
+       if (!test_bit(XPRT_CONNECTED, &xprt->state))
+               return;
+
+       if (!xprt->sending.qlen && !xprt->pending.qlen &&
+           !xprt->backlog.qlen && !atomic_long_read(&xprt->queuelen))
+               rpc_xprt_switch_remove_xprt(xps, xprt);
+}