From: Chuck Lever <chuck.lever@oracle.com>
To: linux-rdma@vger.kernel.org, linux-nfs@vger.kernel.org
Subject: [PATCH v4 02/13] svcrdma: Do not write xdr_buf::tail in a Write chunk
Date: Mon, 22 Feb 2016 15:41:02 -0500 [thread overview]
Message-ID: <20160222204102.3274.86385.stgit@sisley.1015granger.net> (raw)
In-Reply-To: <20160222203550.3274.82777.stgit@sisley.1015granger.net>
When the Linux NFS server writes an odd-length data item into a
Write chunk, it finishes with XDR pad bytes. If the data item is
smaller than the Write chunk, the pad bytes are written at the end
of the data item, but still inside the chunk (ie, in the
application's buffer). Since this is direct data placement, that
exposes the pad bytes.
XDR pad bytes are inserted in order to preserve the XDR alignment
of the next XDR data item in an XDR stream. But Write chunks do not
appear in the payload XDR stream, and only one data item is allowed
in each chunk. Thus XDR padding is not needed in a Write chunk.
With NFSv4, the Linux NFS server places the results of any
operations that follow an NFSv4 READ or READLINK in the xdr_buf's
tail. Those results also should never be sent as a part of a Write
chunk. The current logic in send_write_chunks() appears to assume
that the xdr_buf's tail contains only pad bytes (ie, NFSv3).
The server should write only the contents of the xdr_buf's page list
in a Write chunk. If there's more than an XDR pad in the tail, that
needs to go inline or in the Reply chunk.
BugLink: https://bugzilla.linux-nfs.org/show_bug.cgi?id=294
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
---
net/sunrpc/xprtrdma/svc_rdma_sendto.c | 11 ++++++++---
1 file changed, 8 insertions(+), 3 deletions(-)
diff --git a/net/sunrpc/xprtrdma/svc_rdma_sendto.c b/net/sunrpc/xprtrdma/svc_rdma_sendto.c
index 79fa661..86fea5c 100644
--- a/net/sunrpc/xprtrdma/svc_rdma_sendto.c
+++ b/net/sunrpc/xprtrdma/svc_rdma_sendto.c
@@ -50,6 +50,11 @@
#define RPCDBG_FACILITY RPCDBG_SVCXPRT
+static u32 xdr_padsize(u32 len)
+{
+ return (len & 3) ? (4 - (len & 3)) : 0;
+}
+
int svc_rdma_map_xdr(struct svcxprt_rdma *xprt,
struct xdr_buf *xdr,
struct svc_rdma_req_map *vec)
@@ -308,7 +313,7 @@ static int send_write_chunks(struct svcxprt_rdma *xprt,
struct svc_rqst *rqstp,
struct svc_rdma_req_map *vec)
{
- u32 xfer_len = rqstp->rq_res.page_len + rqstp->rq_res.tail[0].iov_len;
+ u32 xfer_len = rqstp->rq_res.page_len;
int write_len;
u32 xdr_off;
int chunk_off;
@@ -357,7 +362,7 @@ static int send_write_chunks(struct svcxprt_rdma *xprt,
/* Update the req with the number of chunks actually used */
svc_rdma_xdr_encode_write_list(rdma_resp, chunk_no);
- return rqstp->rq_res.page_len + rqstp->rq_res.tail[0].iov_len;
+ return rqstp->rq_res.page_len;
out_err:
pr_err("svcrdma: failed to send write chunks, rc=%d\n", ret);
@@ -612,7 +617,7 @@ int svc_rdma_sendto(struct svc_rqst *rqstp)
ret = send_write_chunks(rdma, wr_ary, rdma_resp, rqstp, vec);
if (ret < 0)
goto err1;
- inline_bytes -= ret;
+ inline_bytes -= ret + xdr_padsize(ret);
}
/* Send any reply-list data and update resp reply-list */
next prev parent reply other threads:[~2016-02-22 20:41 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-02-22 20:40 [PATCH v4 00/13] NFS/RDMA server patches for v4.6 Chuck Lever
2016-02-22 20:40 ` [PATCH v4 01/13] svcrdma: Find client-provided write and reply chunks once per reply Chuck Lever
2016-02-22 20:41 ` Chuck Lever [this message]
2016-02-22 20:41 ` [PATCH v4 03/13] svcrdma: Do not send Write chunk XDR pad with inline content Chuck Lever
2016-02-22 20:41 ` [PATCH v4 04/13] nfsd: Lower NFSv4.1 callback message size limit Chuck Lever
2016-02-22 20:41 ` [PATCH v4 05/13] svcrdma: Close connection when a send error occurs Chuck Lever
2016-02-22 20:41 ` [PATCH v4 06/13] svcrdma: svc_rdma_post_recv() should close connection on error Chuck Lever
2016-02-22 20:41 ` [PATCH v4 07/13] rpcrdma: Add RPCRDMA_HDRLEN_ERR Chuck Lever
2016-02-22 20:41 ` [PATCH v4 08/13] svcrdma: Make RDMA_ERROR messages work Chuck Lever
2016-02-22 20:42 ` [PATCH v4 09/13] svcrdma: Use correct XID in error replies Chuck Lever
2016-02-22 20:42 ` [PATCH v4 10/13] svcrdma: Hook up the logic to return ERR_CHUNK Chuck Lever
2016-02-22 20:42 ` [PATCH v4 11/13] svcrdma: Remove close_out exit path Chuck Lever
2016-02-22 20:42 ` [PATCH v4 12/13] svcrdma: Use new CQ API for RPC-over-RDMA server receive CQs Chuck Lever
2016-02-22 20:42 ` [PATCH v4 13/13] svcrdma: Use new CQ API for RPC-over-RDMA server send CQs Chuck Lever
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20160222204102.3274.86385.stgit@sisley.1015granger.net \
--to=chuck.lever@oracle.com \
--cc=linux-nfs@vger.kernel.org \
--cc=linux-rdma@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).