Merge tag 'nfsd-4.19-1' of git://linux-nfs.org/~bfields/linux
[sfrench/cifs-2.6.git] / net / sunrpc / xprtrdma / svc_rdma_recvfrom.c
index 2ef75e885411765273c7e5c63f9b5b32d8e33f76..b24d5b8f2feeda5a2d5d66d755694475a6003cf7 100644 (file)
@@ -365,9 +365,6 @@ static void svc_rdma_build_arg_xdr(struct svc_rqst *rqstp,
        arg->page_base = 0;
        arg->buflen = ctxt->rc_byte_len;
        arg->len = ctxt->rc_byte_len;
-
-       rqstp->rq_respages = &rqstp->rq_pages[0];
-       rqstp->rq_next_page = rqstp->rq_respages + 1;
 }
 
 /* This accommodates the largest possible Write chunk,
@@ -729,6 +726,12 @@ int svc_rdma_recvfrom(struct svc_rqst *rqstp)
 
        svc_rdma_build_arg_xdr(rqstp, ctxt);
 
+       /* Prevent svc_xprt_release from releasing pages in rq_pages
+        * if we return 0 or an error.
+        */
+       rqstp->rq_respages = rqstp->rq_pages;
+       rqstp->rq_next_page = rqstp->rq_respages;
+
        p = (__be32 *)rqstp->rq_arg.head[0].iov_base;
        ret = svc_rdma_xdr_decode_req(&rqstp->rq_arg);
        if (ret < 0)