Commit 07d0ff3b authored by Chuck Lever's avatar Chuck Lever Committed by J. Bruce Fields

svcrdma: Clean up Read chunk path

Simplify the error handling at the tail of recv_read_chunk() by
re-arranging rq_pages[] housekeeping and documenting it properly.

NB: In this path, svc_rdma_recvfrom returns zero. Therefore no
subsequent reply processing is done on the svc_rqstp, and thus the
rq_respages field does not need to be updated.
Signed-off-by: default avatarChuck Lever <chuck.lever@oracle.com>
Signed-off-by: default avatarJ. Bruce Fields <bfields@redhat.com>
parent a53d5cb0
...@@ -679,6 +679,7 @@ static int svc_rdma_build_read_chunk(struct svc_rqst *rqstp, ...@@ -679,6 +679,7 @@ static int svc_rdma_build_read_chunk(struct svc_rqst *rqstp,
struct svc_rdma_read_info *info, struct svc_rdma_read_info *info,
__be32 *p) __be32 *p)
{ {
unsigned int i;
int ret; int ret;
ret = -EINVAL; ret = -EINVAL;
...@@ -701,6 +702,12 @@ static int svc_rdma_build_read_chunk(struct svc_rqst *rqstp, ...@@ -701,6 +702,12 @@ static int svc_rdma_build_read_chunk(struct svc_rqst *rqstp,
info->ri_chunklen += rs_length; info->ri_chunklen += rs_length;
} }
/* Pages under I/O have been copied to head->rc_pages.
* Prevent their premature release by svc_xprt_release() .
*/
for (i = 0; i < info->ri_readctxt->rc_page_count; i++)
rqstp->rq_pages[i] = NULL;
return ret; return ret;
} }
...@@ -816,7 +823,6 @@ int svc_rdma_recv_read_chunk(struct svcxprt_rdma *rdma, struct svc_rqst *rqstp, ...@@ -816,7 +823,6 @@ int svc_rdma_recv_read_chunk(struct svcxprt_rdma *rdma, struct svc_rqst *rqstp,
struct svc_rdma_recv_ctxt *head, __be32 *p) struct svc_rdma_recv_ctxt *head, __be32 *p)
{ {
struct svc_rdma_read_info *info; struct svc_rdma_read_info *info;
struct page **page;
int ret; int ret;
/* The request (with page list) is constructed in /* The request (with page list) is constructed in
...@@ -843,27 +849,15 @@ int svc_rdma_recv_read_chunk(struct svcxprt_rdma *rdma, struct svc_rqst *rqstp, ...@@ -843,27 +849,15 @@ int svc_rdma_recv_read_chunk(struct svcxprt_rdma *rdma, struct svc_rqst *rqstp,
ret = svc_rdma_build_normal_read_chunk(rqstp, info, p); ret = svc_rdma_build_normal_read_chunk(rqstp, info, p);
else else
ret = svc_rdma_build_pz_read_chunk(rqstp, info, p); ret = svc_rdma_build_pz_read_chunk(rqstp, info, p);
/* Mark the start of the pages that can be used for the reply */
if (info->ri_pageoff > 0)
info->ri_pageno++;
rqstp->rq_respages = &rqstp->rq_pages[info->ri_pageno];
rqstp->rq_next_page = rqstp->rq_respages + 1;
if (ret < 0) if (ret < 0)
goto out; goto out_err;
ret = svc_rdma_post_chunk_ctxt(&info->ri_cc); ret = svc_rdma_post_chunk_ctxt(&info->ri_cc);
out:
/* Read sink pages have been moved from rqstp->rq_pages to
* head->rc_arg.pages. Force svc_recv to refill those slots
* in rq_pages.
*/
for (page = rqstp->rq_pages; page < rqstp->rq_respages; page++)
*page = NULL;
if (ret < 0) if (ret < 0)
svc_rdma_read_info_free(info); goto out_err;
return 0;
out_err:
svc_rdma_read_info_free(info);
return ret; return ret;
} }
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment