svcrdma: Add a "deferred close" helper

Refactor a bit of commonly used logic so that every site that wants
a close deferred to an nfsd thread does all the right things
(set_bit(XPT_CLOSE) then enqueue).

Also, once XPT_CLOSE is set on a transport, it is never cleared. If
XPT_CLOSE is already set, then the close is already being handled
and the enqueue can be skipped.

Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
This commit is contained in:
Chuck Lever
2021-02-20 18:53:40 -05:00
parent c558d47596
commit e844d307d4
7 changed files with 30 additions and 24 deletions

View File

@@ -139,6 +139,20 @@ int svc_print_xprts(char *buf, int maxlen)
return len;
}
/**
* svc_xprt_deferred_close - Close a transport
* @xprt: transport instance
*
* Used in contexts that need to defer the work of shutting down
* the transport to an nfsd thread.
*/
void svc_xprt_deferred_close(struct svc_xprt *xprt)
{
if (!test_and_set_bit(XPT_CLOSE, &xprt->xpt_flags))
svc_xprt_enqueue(xprt);
}
EXPORT_SYMBOL_GPL(svc_xprt_deferred_close);
static void svc_xprt_free(struct kref *kref)
{
struct svc_xprt *xprt =