Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

SUNRPC: The TCP back channel mustn't disappear while requests are outstanding

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>

authored by

Trond Myklebust and committed by
Anna Schumaker
875f0706 9e5eefba

+3 -2
+3 -2
net/sunrpc/backchannel_rqst.c
··· 307 307 */ 308 308 dprintk("RPC: Last session removed req=%p\n", req); 309 309 xprt_free_allocation(req); 310 - return; 311 310 } 311 + xprt_put(xprt); 312 312 } 313 313 314 314 /* ··· 339 339 spin_unlock(&xprt->bc_pa_lock); 340 340 if (new) { 341 341 if (req != new) 342 - xprt_free_bc_rqst(new); 342 + xprt_free_allocation(new); 343 343 break; 344 344 } else if (req) 345 345 break; ··· 368 368 set_bit(RPC_BC_PA_IN_USE, &req->rq_bc_pa_state); 369 369 370 370 dprintk("RPC: add callback request to list\n"); 371 + xprt_get(xprt); 371 372 spin_lock(&bc_serv->sv_cb_lock); 372 373 list_add(&req->rq_bc_list, &bc_serv->sv_cb_list); 373 374 wake_up(&bc_serv->sv_cb_waitq);