]> git.kernelconcepts.de Git - karo-tx-linux.git/commitdiff
svcrdma: svc_rdma_post_recv() should close connection on error
authorChuck Lever <chuck.lever@oracle.com>
Tue, 1 Mar 2016 18:06:20 +0000 (13:06 -0500)
committerJ. Bruce Fields <bfields@redhat.com>
Tue, 1 Mar 2016 21:06:37 +0000 (13:06 -0800)
Clean up: Most svc_rdma_post_recv() call sites close the transport
connection when a receive cannot be posted. Wrap that in a common
helper.

Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Reviewed-by: Devesh Sharma <devesh.sharma@broadcom.com>
Tested-by: Devesh Sharma <devesh.sharma@broadcom.com>
Signed-off-by: J. Bruce Fields <bfields@redhat.com>
include/linux/sunrpc/svc_rdma.h
net/sunrpc/xprtrdma/svc_rdma_backchannel.c
net/sunrpc/xprtrdma/svc_rdma_recvfrom.c
net/sunrpc/xprtrdma/svc_rdma_sendto.c
net/sunrpc/xprtrdma/svc_rdma_transport.c

index 40b678584041e019528d711ae30884ee7710eef0..aef47dd2bd1a9d201cd28449c56f60c67f7b812c 100644 (file)
@@ -234,6 +234,7 @@ extern int svc_rdma_send(struct svcxprt_rdma *, struct ib_send_wr *);
 extern void svc_rdma_send_error(struct svcxprt_rdma *, struct rpcrdma_msg *,
                                enum rpcrdma_errcode);
 extern int svc_rdma_post_recv(struct svcxprt_rdma *, gfp_t);
+extern int svc_rdma_repost_recv(struct svcxprt_rdma *, gfp_t);
 extern int svc_rdma_create_listen(struct svc_serv *, int, struct sockaddr *);
 extern struct svc_rdma_op_ctxt *svc_rdma_get_context(struct svcxprt_rdma *);
 extern void svc_rdma_put_context(struct svc_rdma_op_ctxt *, int);
index de3919624fac650c43e138b332a92caa9ab1d488..254be86619810f36c165fb00de8ef9a49f7520c1 100644 (file)
@@ -111,16 +111,9 @@ static int svc_rdma_bc_sendto(struct svcxprt_rdma *rdma,
        if (ret)
                goto out_err;
 
-       /* Post a recv buffer to handle the reply for this request. */
-       ret = svc_rdma_post_recv(rdma, GFP_NOIO);
-       if (ret) {
-               pr_err("svcrdma: Failed to post bc receive buffer, err=%d.\n",
-                      ret);
-               pr_err("svcrdma: closing transport %p.\n", rdma);
-               set_bit(XPT_CLOSE, &rdma->sc_xprt.xpt_flags);
-               ret = -ENOTCONN;
+       ret = svc_rdma_repost_recv(rdma, GFP_NOIO);
+       if (ret)
                goto out_err;
-       }
 
        ctxt = svc_rdma_get_context(rdma);
        ctxt->pages[0] = virt_to_page(rqst->rq_buffer);
index c8b8a8b4181eafa75de0d673040b9f927fa74d9d..acf15b8bca7084cc25ba5dc8c76161b835c381e5 100644 (file)
@@ -711,13 +711,5 @@ defer:
        return 0;
 
 repost:
-       ret = svc_rdma_post_recv(rdma_xprt, GFP_KERNEL);
-       if (ret) {
-               pr_err("svcrdma: could not post a receive buffer, err=%d.\n",
-                      ret);
-               pr_err("svcrdma: closing transport %p.\n", rdma_xprt);
-               set_bit(XPT_CLOSE, &rdma_xprt->sc_xprt.xpt_flags);
-               ret = -ENOTCONN;
-       }
-       return ret;
+       return svc_rdma_repost_recv(rdma_xprt, GFP_KERNEL);
 }
index 0f8798d4ed88d9c09f09f00e6669987ac408a392..ace9efa7aa6c2cee5b194d1762ae4bbc9368e107 100644 (file)
@@ -475,13 +475,8 @@ static int send_reply(struct svcxprt_rdma *rdma,
        int pages;
        int ret;
 
-       /* Post a recv buffer to handle another request. */
-       ret = svc_rdma_post_recv(rdma, GFP_KERNEL);
+       ret = svc_rdma_repost_recv(rdma, GFP_KERNEL);
        if (ret) {
-               printk(KERN_INFO
-                      "svcrdma: could not post a receive buffer, err=%d."
-                      "Closing transport %p.\n", ret, rdma);
-               set_bit(XPT_CLOSE, &rdma->sc_xprt.xpt_flags);
                svc_rdma_put_context(ctxt, 0);
                return -ENOTCONN;
        }
index 5763825d09bf776bfa89f0007be1805203d96adf..03fdfce45493fbade5b3651bb84dbfaa7bccfbd3 100644 (file)
@@ -722,6 +722,21 @@ int svc_rdma_post_recv(struct svcxprt_rdma *xprt, gfp_t flags)
        return -ENOMEM;
 }
 
+int svc_rdma_repost_recv(struct svcxprt_rdma *xprt, gfp_t flags)
+{
+       int ret = 0;
+
+       ret = svc_rdma_post_recv(xprt, flags);
+       if (ret) {
+               pr_err("svcrdma: could not post a receive buffer, err=%d.\n",
+                      ret);
+               pr_err("svcrdma: closing transport %p.\n", xprt);
+               set_bit(XPT_CLOSE, &xprt->sc_xprt.xpt_flags);
+               ret = -ENOTCONN;
+       }
+       return ret;
+}
+
 /*
  * This function handles the CONNECT_REQUEST event on a listening
  * endpoint. It is passed the cma_id for the _new_ connection. The context in