spin_unlock(&xprt->transport_lock);
        return ret;
 }
+EXPORT_SYMBOL_GPL(xprt_lock_connect);
 
 void xprt_unlock_connect(struct rpc_xprt *xprt, void *cookie)
 {
        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
 
                                           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);
 }
 
        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);