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: Chuck Lever <chuck.lever@oracle.com> Fixes: 0d2a970d0ae55 ("SUNRPC: Fix a backchannel race") Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
This commit is contained in:
@ -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);
|
||||||
|
Reference in New Issue
Block a user