Commit 68514471 authored by Trond Myklebust's avatar Trond Myklebust

SUNRPC: Fix a backchannel deadlock

xprt_alloc_bc_request() cannot call xprt_free_bc_request() without
deadlocking, since it already holds the xprt->bc_pa_lock.
Reported-by: default avatarChuck Lever <chuck.lever@oracle.com>
Fixes: 0d2a970d ("SUNRPC: Fix a backchannel race")
Signed-off-by: default avatarTrond Myklebust <trond.myklebust@primarydata.com>
parent faa4a54f
...@@ -240,8 +240,8 @@ static struct rpc_rqst *xprt_alloc_bc_request(struct rpc_xprt *xprt, __be32 xid) ...@@ -240,8 +240,8 @@ static struct rpc_rqst *xprt_alloc_bc_request(struct rpc_xprt *xprt, __be32 xid)
req = xprt_alloc_bc_req(xprt, GFP_ATOMIC); req = xprt_alloc_bc_req(xprt, GFP_ATOMIC);
if (!req) if (!req)
goto not_found; goto not_found;
/* Note: this 'free' request adds it to xprt->bc_pa_list */ list_add_tail(&req->rq_bc_pa_list, &xprt->bc_pa_list);
xprt_free_bc_request(req); xprt->bc_alloc_count++;
} }
req = list_first_entry(&xprt->bc_pa_list, struct rpc_rqst, req = list_first_entry(&xprt->bc_pa_list, struct rpc_rqst,
rq_bc_pa_list); rq_bc_pa_list);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment