From: Trond Myklebust <trondmy@gmail.com>
Date: Thu, 17 Oct 2019 09:02:19 -0400
Subject: [PATCH] SUNRPC: The TCP back channel mustn't disappear while requests
are outstanding
Git-commit: 875f0706accd6501c3209bb99df8573171fb5d75
Patch-mainline: v5.4
References: bsc#1152624
If there are TCP back channel requests being processed by the
server threads, then we should hold a reference to the transport
to ensure it doesn't get freed from underneath us.
Reported-by: Neil Brown <neilb@suse.de>
Fixes: 2ea24497a1b3 ("SUNRPC: RPC callbacks may be split across several..")
Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
Acked-by: NeilBrown <neilb@suse.com>
---
net/sunrpc/backchannel_rqst.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
--- a/net/sunrpc/backchannel_rqst.c
+++ b/net/sunrpc/backchannel_rqst.c
@@ -305,8 +305,8 @@ void xprt_free_bc_rqst(struct rpc_rqst *
*/
dprintk("RPC: Last session removed req=%p\n", req);
xprt_free_allocation(req);
- return;
}
+ xprt_put(xprt);
}
/*
@@ -357,6 +357,7 @@ void xprt_complete_bc_request(struct rpc
set_bit(RPC_BC_PA_IN_USE, &req->rq_bc_pa_state);
dprintk("RPC: add callback request to list\n");
+ xprt_get(xprt);
spin_lock(&bc_serv->sv_cb_lock);
list_add(&req->rq_bc_list, &bc_serv->sv_cb_list);
wake_up(&bc_serv->sv_cb_waitq);