On Mon, 2022-06-20 at 11:23 -0400, Olga Kornievskaia wrote: > From: Olga Kornievskaia <kolga@xxxxxxxxxx> > > Re-arrange the code that make offline transport and delete transport > callable functions. > > Signed-off-by: Olga Kornievskaia <kolga@xxxxxxxxxx> > --- > include/linux/sunrpc/xprt.h | 3 +++ > net/sunrpc/sysfs.c | 28 +++++----------------------- > net/sunrpc/xprt.c | 35 +++++++++++++++++++++++++++++++++++ > 3 files changed, 43 insertions(+), 23 deletions(-) > > diff --git a/include/linux/sunrpc/xprt.h > b/include/linux/sunrpc/xprt.h > index 522bbf937957..0d51b9f9ea37 100644 > --- a/include/linux/sunrpc/xprt.h > +++ b/include/linux/sunrpc/xprt.h > @@ -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 */ > diff --git a/net/sunrpc/sysfs.c b/net/sunrpc/sysfs.c > index a3a2f8aeb80e..7330eb9a70cf 100644 > --- a/net/sunrpc/sysfs.c > +++ b/net/sunrpc/sysfs.c > @@ -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: > diff --git a/net/sunrpc/xprt.c b/net/sunrpc/xprt.c > index 86d62cffba0d..6480ae324b27 100644 > --- a/net/sunrpc/xprt.c > +++ b/net/sunrpc/xprt.c > @@ -2152,3 +2152,38 @@ 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); > + } > +} > +EXPORT_SYMBOL(xprt_set_offline_locked); > + > +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); > + } > +} > +EXPORT_SYMBOL(xprt_set_online_locked); > + > +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); > +} > +EXPORT_SYMBOL(xprt_delete_locked); Why are these functions being exported? There is nothing outside the main sunrpc layer that should be using them. -- Trond Myklebust Linux NFS client maintainer, Hammerspace trond.myklebust@xxxxxxxxxxxxxxx