xprtrdma: Fix return code from rpcrdma_xprt_connect()
authorChuck Lever <chuck.lever@oracle.com>
Sat, 27 Jun 2020 16:35:15 +0000 (12:35 -0400)
committerAnna Schumaker <Anna.Schumaker@Netapp.com>
Mon, 13 Jul 2020 14:50:41 +0000 (10:50 -0400)
I noticed that when rpcrdma_xprt_connect() returns -ENOMEM,
instead of retrying the connect, the RPC client kills the
RPC task that requested the connection. We want a retry
here.

Fixes: cb586decbb88 ("xprtrdma: Make sendctx queue lifetime the same as connection lifetime")
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
net/sunrpc/xprtrdma/verbs.c

index 641a3ca0fc8f5e6fee882a075ba3ad885d3ec4e7..13d671dccfd815919210caf6e05e408ac7ae3049 100644 (file)
@@ -400,7 +400,7 @@ static int rpcrdma_ep_create(struct rpcrdma_xprt *r_xprt)
 
        ep = kzalloc(sizeof(*ep), GFP_NOFS);
        if (!ep)
-               return -EAGAIN;
+               return -ENOTCONN;
        ep->re_xprt = &r_xprt->rx_xprt;
        kref_init(&ep->re_kref);
 
@@ -535,10 +535,6 @@ int rpcrdma_xprt_connect(struct rpcrdma_xprt *r_xprt)
        rpcrdma_ep_get(ep);
        rpcrdma_post_recvs(r_xprt, true);
 
-       rc = rpcrdma_sendctxs_create(r_xprt);
-       if (rc)
-               goto out;
-
        rc = rdma_connect(ep->re_id, &ep->re_remote_cma);
        if (rc)
                goto out;
@@ -552,9 +548,17 @@ int rpcrdma_xprt_connect(struct rpcrdma_xprt *r_xprt)
                goto out;
        }
 
+       rc = rpcrdma_sendctxs_create(r_xprt);
+       if (rc) {
+               rc = -ENOTCONN;
+               goto out;
+       }
+
        rc = rpcrdma_reqs_setup(r_xprt);
-       if (rc)
+       if (rc) {
+               rc = -ENOTCONN;
                goto out;
+       }
        rpcrdma_mrs_create(r_xprt);
 
 out: