SUNRPC: Destroy the back channel when we destroy the host transport
When we're destroying the host transport mechanism, we should ensure that we do not leak memory by failing to release any back channel slots that might still exist. Reported-by: Neil Brown <neilb@suse.de> Reported-by: kbuild test robot <lkp@intel.com> Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com> Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
This commit is contained in:
parent
9edb455e67
commit
669996add4
|
@ -64,6 +64,11 @@ static inline int xprt_setup_backchannel(struct rpc_xprt *xprt,
|
|||
return 0;
|
||||
}
|
||||
|
||||
static inline void xprt_destroy_backchannel(struct rpc_xprt *xprt,
|
||||
unsigned int max_reqs)
|
||||
{
|
||||
}
|
||||
|
||||
static inline bool svc_is_backchannel(const struct svc_rqst *rqstp)
|
||||
{
|
||||
return false;
|
||||
|
|
|
@ -220,7 +220,7 @@ void xprt_destroy_bc(struct rpc_xprt *xprt, unsigned int max_reqs)
|
|||
goto out;
|
||||
|
||||
spin_lock_bh(&xprt->bc_pa_lock);
|
||||
xprt->bc_alloc_max -= max_reqs;
|
||||
xprt->bc_alloc_max -= min(max_reqs, xprt->bc_alloc_max);
|
||||
list_for_each_entry_safe(req, tmp, &xprt->bc_pa_list, rq_bc_pa_list) {
|
||||
dprintk("RPC: req=%p\n", req);
|
||||
list_del(&req->rq_bc_pa_list);
|
||||
|
|
|
@ -1942,6 +1942,11 @@ static void xprt_destroy_cb(struct work_struct *work)
|
|||
rpc_destroy_wait_queue(&xprt->sending);
|
||||
rpc_destroy_wait_queue(&xprt->backlog);
|
||||
kfree(xprt->servername);
|
||||
/*
|
||||
* Destroy any existing back channel
|
||||
*/
|
||||
xprt_destroy_backchannel(xprt, UINT_MAX);
|
||||
|
||||
/*
|
||||
* Tear down transport state and free the rpc_xprt
|
||||
*/
|
||||
|
|
Loading…
Reference in New Issue