From d3dbee0b4808f0e588060cde5387d797fe91a653 Mon Sep 17 00:00:00 2001 From: Trond Myklebust Date: Sun, 10 Mar 2019 12:22:39 -0400 Subject: [PATCH] SUNRPC: Take the transport send lock before binding+connecting Before trying to bind a port, ensure we grab the send lock to ensure that we don't change the port while another task is busy transmitting requests. The connect code already takes the send lock in xprt_connect(), but it is harmless to take it before that. Signed-off-by: Trond Myklebust --- net/sunrpc/clnt.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/net/sunrpc/clnt.c b/net/sunrpc/clnt.c index 498dd6ad5bc57..4216fe33204a8 100644 --- a/net/sunrpc/clnt.c +++ b/net/sunrpc/clnt.c @@ -1867,6 +1867,9 @@ call_bind(struct rpc_task *task) dprint_status(task); task->tk_action = call_bind_status; + if (!xprt_prepare_transmit(task)) + return; + task->tk_timeout = xprt->bind_timeout; xprt->ops->rpcbind(task); } @@ -1911,6 +1914,8 @@ call_bind_status(struct rpc_task *task) task->tk_rebind_retry--; rpc_delay(task, 3*HZ); goto retry_timeout; + case -EAGAIN: + goto retry_timeout; case -ETIMEDOUT: dprintk("RPC: %5u rpcbind request timed out\n", task->tk_pid); @@ -1952,7 +1957,7 @@ call_bind_status(struct rpc_task *task) retry_timeout: task->tk_status = 0; - task->tk_action = call_encode; + task->tk_action = call_bind; rpc_check_timeout(task); } @@ -1986,6 +1991,8 @@ call_connect(struct rpc_task *task) rpc_exit(task, -ENOTCONN); return; } + if (!xprt_prepare_transmit(task)) + return; xprt_connect(task); } -- 2.39.5