On Wed, 2022-04-20 at 14:21 -0400, Olga Kornievskaia wrote: > From: Olga Kornievskaia <kolga@xxxxxxxxxx> > > A relocated task must release its previous transport. > > Fixes: 82ee41b85cef1 ("SUNRPC don't resend a task on an offlined > transport") > Signed-off-by: Olga Kornievskaia <kolga@xxxxxxxxxx> > --- > net/sunrpc/clnt.c | 4 +++- > 1 file changed, 3 insertions(+), 1 deletion(-) > > diff --git a/net/sunrpc/clnt.c b/net/sunrpc/clnt.c > index af0174d7ce5a..95de454a858b 100644 > --- a/net/sunrpc/clnt.c > +++ b/net/sunrpc/clnt.c > @@ -1067,8 +1067,10 @@ void rpc_task_set_transport(struct rpc_task > *task, struct rpc_clnt *clnt) > { > if (task->tk_xprt && > !(test_bit(XPRT_OFFLINE, &task->tk_xprt- > >state) && > - (task->tk_flags & RPC_TASK_MOVEABLE))) > + (task->tk_flags & RPC_TASK_MOVEABLE))) { > + xprt_release_write(task->tk_xprt, task); > return; > + } > if (task->tk_flags & RPC_TASK_NO_ROUND_ROBIN) > task->tk_xprt = rpc_task_get_first_xprt(clnt); > else I don't think this patch is correct. It is changing the case where we're not changing the value of task->tk_xprt, which was never a problem before commit 82ee41b85cef. What needs to change is the case where task->tk_xprt is set, but we're going to change its value anyway because of the tests for XPRT_OFFLINE and RPC_TASK_MOVEABLE. In that case we need to call xprt_release(), followed by xprt_put(). Otherwise we're leaking slots, locks and references to the old task- >tk_xprt. -- Trond Myklebust Linux NFS client maintainer, Hammerspace trond.myklebust@xxxxxxxxxxxxxxx