If the socket is not connected, then we want to initiate a reconnect rather that trying to transmit requests. If there is a large number of requests queued and waiting for the lock in call_transmit(), then it can take a while for one of the to loop back and retake the lock in call_connect. Fixes: 89f90fe1ad8b ("SUNRPC: Allow calls to xprt_transmit() to drain...") Signed-off-by: Trond Myklebust <trond.myklebust@xxxxxxxxxxxxxxx> --- net/sunrpc/clnt.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/net/sunrpc/clnt.c b/net/sunrpc/clnt.c index 241e8423fd0c..e7ae75a045c9 100644 --- a/net/sunrpc/clnt.c +++ b/net/sunrpc/clnt.c @@ -2003,6 +2003,12 @@ call_transmit(struct rpc_task *task) if (test_bit(RPC_TASK_NEED_XMIT, &task->tk_runstate)) { if (!xprt_prepare_transmit(task)) return; + /* Check that the connection is OK */ + if (!xprt_connected(task->tk_xprt) || + !xprt_bound(task->tk_xprt)) { + task->tk_action = call_bind; + return; + } xprt_transmit(task); } task->tk_action = call_transmit_status; -- 2.20.1