On Tue, Jul 12, 2022 at 11:12 AM Trond Myklebust <trondmy@xxxxxxxxxxxxxxx> wrote: > > 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. > Thank you for the comment. Make sense, will fix. It probably came from looking at xprt_put above that code. > -- > Trond Myklebust > Linux NFS client maintainer, Hammerspace > trond.myklebust@xxxxxxxxxxxxxxx > >