Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit bf36387a authored by Chuck Lever's avatar Chuck Lever Committed by J. Bruce Fields
Browse files

svcrdma: svc_rdma_post_recv() should close connection on error



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: default avatarChuck Lever <chuck.lever@oracle.com>
Reviewed-by: default avatarDevesh Sharma <devesh.sharma@broadcom.com>
Tested-by: default avatarDevesh Sharma <devesh.sharma@broadcom.com>
Signed-off-by: default avatarJ. Bruce Fields <bfields@redhat.com>
parent 3e1eeb98
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -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);
+2 −9
Original line number Diff line number Diff line
@@ -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);
+1 −9
Original line number Diff line number Diff line
@@ -711,13 +711,5 @@ int svc_rdma_recvfrom(struct svc_rqst *rqstp)
	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);
}
+1 −6
Original line number Diff line number Diff line
@@ -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;
	}
+15 −0
Original line number Diff line number Diff line
@@ -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