aboutsummaryrefslogtreecommitdiffstats
path: root/net
diff options
context:
space:
mode:
authorTrond Myklebust <trond.myklebust@hammerspace.com>2019-03-10 12:22:39 -0400
committerTrond Myklebust <trond.myklebust@hammerspace.com>2019-03-10 14:08:19 -0400
commit4d6c671ace569d4b0d3f8d92ab3aef18a5d166bc (patch)
treea15b5f3630309e5c0433625e290d4ae46d1408fb /net
parent009a82f6437490c262584d65a14094a818bcb747 (diff)
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 <trond.myklebust@hammerspace.com>
Diffstat (limited to 'net')
-rw-r--r--net/sunrpc/clnt.c9
1 files changed, 8 insertions, 1 deletions
diff --git a/net/sunrpc/clnt.c b/net/sunrpc/clnt.c
index 498dd6ad5bc5..4216fe33204a 100644
--- a/net/sunrpc/clnt.c
+++ b/net/sunrpc/clnt.c
@@ -1867,6 +1867,9 @@ call_bind(struct rpc_task *task)
1867 dprint_status(task); 1867 dprint_status(task);
1868 1868
1869 task->tk_action = call_bind_status; 1869 task->tk_action = call_bind_status;
1870 if (!xprt_prepare_transmit(task))
1871 return;
1872
1870 task->tk_timeout = xprt->bind_timeout; 1873 task->tk_timeout = xprt->bind_timeout;
1871 xprt->ops->rpcbind(task); 1874 xprt->ops->rpcbind(task);
1872} 1875}
@@ -1911,6 +1914,8 @@ call_bind_status(struct rpc_task *task)
1911 task->tk_rebind_retry--; 1914 task->tk_rebind_retry--;
1912 rpc_delay(task, 3*HZ); 1915 rpc_delay(task, 3*HZ);
1913 goto retry_timeout; 1916 goto retry_timeout;
1917 case -EAGAIN:
1918 goto retry_timeout;
1914 case -ETIMEDOUT: 1919 case -ETIMEDOUT:
1915 dprintk("RPC: %5u rpcbind request timed out\n", 1920 dprintk("RPC: %5u rpcbind request timed out\n",
1916 task->tk_pid); 1921 task->tk_pid);
@@ -1952,7 +1957,7 @@ call_bind_status(struct rpc_task *task)
1952 1957
1953retry_timeout: 1958retry_timeout:
1954 task->tk_status = 0; 1959 task->tk_status = 0;
1955 task->tk_action = call_encode; 1960 task->tk_action = call_bind;
1956 rpc_check_timeout(task); 1961 rpc_check_timeout(task);
1957} 1962}
1958 1963
@@ -1986,6 +1991,8 @@ call_connect(struct rpc_task *task)
1986 rpc_exit(task, -ENOTCONN); 1991 rpc_exit(task, -ENOTCONN);
1987 return; 1992 return;
1988 } 1993 }
1994 if (!xprt_prepare_transmit(task))
1995 return;
1989 xprt_connect(task); 1996 xprt_connect(task);
1990} 1997}
1991 1998