diff options
| -rw-r--r-- | net/sunrpc/xprt.c | 2 | ||||
| -rw-r--r-- | net/sunrpc/xprtrdma/transport.c | 11 | 
2 files changed, 7 insertions, 6 deletions
diff --git a/net/sunrpc/xprt.c b/net/sunrpc/xprt.c index aae5a328b15b..b88ac8132054 100644 --- a/net/sunrpc/xprt.c +++ b/net/sunrpc/xprt.c @@ -877,6 +877,7 @@ out:  	spin_unlock(&xprt->transport_lock);  	return ret;  } +EXPORT_SYMBOL_GPL(xprt_lock_connect);  void xprt_unlock_connect(struct rpc_xprt *xprt, void *cookie)  { @@ -893,6 +894,7 @@ out:  	spin_unlock(&xprt->transport_lock);  	wake_up_bit(&xprt->state, XPRT_LOCKED);  } +EXPORT_SYMBOL_GPL(xprt_unlock_connect);  /**   * xprt_connect - schedule a transport connect operation diff --git a/net/sunrpc/xprtrdma/transport.c b/net/sunrpc/xprtrdma/transport.c index a463400ed5a3..16e5696314a4 100644 --- a/net/sunrpc/xprtrdma/transport.c +++ b/net/sunrpc/xprtrdma/transport.c @@ -250,12 +250,9 @@ xprt_rdma_connect_worker(struct work_struct *work)  					   xprt->stat.connect_start;  		xprt_set_connected(xprt);  		rc = -EAGAIN; -	} else { -		/* Force a call to xprt_rdma_close to clean up */ -		spin_lock(&xprt->transport_lock); -		set_bit(XPRT_CLOSE_WAIT, &xprt->state); -		spin_unlock(&xprt->transport_lock); -	} +	} else +		rpcrdma_xprt_disconnect(r_xprt); +	xprt_unlock_connect(xprt, r_xprt);  	xprt_wake_pending_tasks(xprt, rc);  } @@ -489,6 +486,8 @@ xprt_rdma_connect(struct rpc_xprt *xprt, struct rpc_task *task)  	struct rpcrdma_ep *ep = r_xprt->rx_ep;  	unsigned long delay; +	WARN_ON_ONCE(!xprt_lock_connect(xprt, task, r_xprt)); +  	delay = 0;  	if (ep && ep->re_connect_status != 0) {  		delay = xprt_reconnect_delay(xprt);  | 
