From: Chuck Lever <chuck.lever-QHcLZuEGTsvQT0dZR+AlfA@public.gmane.org> To: linux-rdma-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, linux-nfs-u79uwXL29TY76Z2rM5mHXA@public.gmane.org Subject: [PATCH v1 07/10] svcrdma: rc_position sanity checking Date: Fri, 09 Jan 2015 14:22:53 -0500 [thread overview] Message-ID: <20150109192253.4901.19640.stgit@klimt.1015granger.net> (raw) In-Reply-To: <20150109191910.4901.29548.stgit-Hs+gFlyCn65vLzlybtyyYzGyq/o6K9yX@public.gmane.org> An RPC/RDMA client may send large data payloads via a read chunk list. This is a list of scatter/gather elements which are RPC call arguments too large to fit in a small RDMA SEND. Each read chunk list entry has a "position" which is the offset in the RPC header where the chunk list payload should be inserted. Thus content can exist in the RPC header both before _and_ after a chunk list (see RFC 5666). Currently the Linux NFS/RDMA server cannot handle receiving read chunks in more than one position. Fortunately no client currently sends more than one read list per RPC. Ensure that all received chunks have the same "rc_position." Signed-off-by: Chuck Lever <chuck.lever-QHcLZuEGTsvQT0dZR+AlfA@public.gmane.org> --- net/sunrpc/xprtrdma/svc_rdma_recvfrom.c | 16 ++++++++++++---- 1 files changed, 12 insertions(+), 4 deletions(-) diff --git a/net/sunrpc/xprtrdma/svc_rdma_recvfrom.c b/net/sunrpc/xprtrdma/svc_rdma_recvfrom.c index c3aebc1..a67dd1a 100644 --- a/net/sunrpc/xprtrdma/svc_rdma_recvfrom.c +++ b/net/sunrpc/xprtrdma/svc_rdma_recvfrom.c @@ -365,6 +365,7 @@ static int rdma_read_chunks(struct svcxprt_rdma *xprt, int page_no, ret; struct rpcrdma_read_chunk *ch; u32 handle, page_offset, byte_count; + u32 position; u64 rs_offset; bool last; @@ -389,10 +390,17 @@ static int rdma_read_chunks(struct svcxprt_rdma *xprt, head->arg.len = rqstp->rq_arg.len; head->arg.buflen = rqstp->rq_arg.buflen; - page_no = 0; page_offset = 0; - for (ch = (struct rpcrdma_read_chunk *)&rmsgp->rm_body.rm_chunks[0]; - ch->rc_discrim != 0; ch++) { - handle = be32_to_cpu(ch->rc_target.rs_handle); + ch = (struct rpcrdma_read_chunk *)&rmsgp->rm_body.rm_chunks[0]; + position = be32_to_cpu(ch->rc_position); + + ret = 0; + page_no = 0; + page_offset = 0; + for (; ch->rc_discrim != xdr_zero; ch++) { + if (be32_to_cpu(ch->rc_position) != position) + goto err; + + handle = be32_to_cpu(ch->rc_target.rs_handle), byte_count = be32_to_cpu(ch->rc_target.rs_length); xdr_decode_hyper((__be32 *)&ch->rc_target.rs_offset, &rs_offset); -- To unsubscribe from this list: send the line "unsubscribe linux-rdma" in the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org More majordomo info at http://vger.kernel.org/majordomo-info.html
WARNING: multiple messages have this Message-ID (diff)
From: Chuck Lever <chuck.lever@oracle.com> To: linux-rdma@vger.kernel.org, linux-nfs@vger.kernel.org Subject: [PATCH v1 07/10] svcrdma: rc_position sanity checking Date: Fri, 09 Jan 2015 14:22:53 -0500 [thread overview] Message-ID: <20150109192253.4901.19640.stgit@klimt.1015granger.net> (raw) In-Reply-To: <20150109191910.4901.29548.stgit@klimt.1015granger.net> An RPC/RDMA client may send large data payloads via a read chunk list. This is a list of scatter/gather elements which are RPC call arguments too large to fit in a small RDMA SEND. Each read chunk list entry has a "position" which is the offset in the RPC header where the chunk list payload should be inserted. Thus content can exist in the RPC header both before _and_ after a chunk list (see RFC 5666). Currently the Linux NFS/RDMA server cannot handle receiving read chunks in more than one position. Fortunately no client currently sends more than one read list per RPC. Ensure that all received chunks have the same "rc_position." Signed-off-by: Chuck Lever <chuck.lever@oracle.com> --- net/sunrpc/xprtrdma/svc_rdma_recvfrom.c | 16 ++++++++++++---- 1 files changed, 12 insertions(+), 4 deletions(-) diff --git a/net/sunrpc/xprtrdma/svc_rdma_recvfrom.c b/net/sunrpc/xprtrdma/svc_rdma_recvfrom.c index c3aebc1..a67dd1a 100644 --- a/net/sunrpc/xprtrdma/svc_rdma_recvfrom.c +++ b/net/sunrpc/xprtrdma/svc_rdma_recvfrom.c @@ -365,6 +365,7 @@ static int rdma_read_chunks(struct svcxprt_rdma *xprt, int page_no, ret; struct rpcrdma_read_chunk *ch; u32 handle, page_offset, byte_count; + u32 position; u64 rs_offset; bool last; @@ -389,10 +390,17 @@ static int rdma_read_chunks(struct svcxprt_rdma *xprt, head->arg.len = rqstp->rq_arg.len; head->arg.buflen = rqstp->rq_arg.buflen; - page_no = 0; page_offset = 0; - for (ch = (struct rpcrdma_read_chunk *)&rmsgp->rm_body.rm_chunks[0]; - ch->rc_discrim != 0; ch++) { - handle = be32_to_cpu(ch->rc_target.rs_handle); + ch = (struct rpcrdma_read_chunk *)&rmsgp->rm_body.rm_chunks[0]; + position = be32_to_cpu(ch->rc_position); + + ret = 0; + page_no = 0; + page_offset = 0; + for (; ch->rc_discrim != xdr_zero; ch++) { + if (be32_to_cpu(ch->rc_position) != position) + goto err; + + handle = be32_to_cpu(ch->rc_target.rs_handle), byte_count = be32_to_cpu(ch->rc_target.rs_length); xdr_decode_hyper((__be32 *)&ch->rc_target.rs_offset, &rs_offset);
next prev parent reply other threads:[~2015-01-09 19:22 UTC|newest] Thread overview: 62+ messages / expand[flat|nested] mbox.gz Atom feed top 2015-01-09 19:21 [PATCH v1 00/10] NFS/RDMA server for 3.20 Chuck Lever 2015-01-09 19:21 ` Chuck Lever [not found] ` <20150109191910.4901.29548.stgit-Hs+gFlyCn65vLzlybtyyYzGyq/o6K9yX@public.gmane.org> 2015-01-09 19:22 ` [PATCH v1 01/10] svcrdma: Clean up dprintk Chuck Lever 2015-01-09 19:22 ` Chuck Lever 2015-01-09 19:22 ` [PATCH v1 02/10] svcrdma: Remove unused variable Chuck Lever 2015-01-09 19:22 ` Chuck Lever 2015-01-09 19:22 ` [PATCH v1 03/10] svcrdma: Clean up read chunk counting Chuck Lever 2015-01-09 19:22 ` Chuck Lever 2015-01-09 19:22 ` [PATCH v1 04/10] svcrdma: Scrub BUG_ON() and WARN_ON() call sites Chuck Lever 2015-01-09 19:22 ` Chuck Lever 2015-01-09 19:22 ` [PATCH v1 05/10] svcrdma: Find rmsgp more reliably Chuck Lever 2015-01-09 19:22 ` Chuck Lever [not found] ` <20150109192237.4901.92644.stgit-Hs+gFlyCn65vLzlybtyyYzGyq/o6K9yX@public.gmane.org> 2015-01-11 17:37 ` Sagi Grimberg 2015-01-11 17:37 ` Sagi Grimberg [not found] ` <54B2B4E0.5060901-LDSdmyG8hGV8YrgS2mwiifqBs+8SCbDb@public.gmane.org> 2015-01-12 0:30 ` Chuck Lever 2015-01-12 0:30 ` Chuck Lever [not found] ` <3C09A798-2BA9-46A1-AA60-122C2274974C-QHcLZuEGTsvQT0dZR+AlfA@public.gmane.org> 2015-01-13 10:07 ` Sagi Grimberg 2015-01-13 10:07 ` Sagi Grimberg 2015-01-09 19:22 ` [PATCH v1 06/10] svcrdma: Plant reader function in struct svcxprt_rdma Chuck Lever 2015-01-09 19:22 ` Chuck Lever [not found] ` <20150109192245.4901.89614.stgit-Hs+gFlyCn65vLzlybtyyYzGyq/o6K9yX@public.gmane.org> 2015-01-11 17:45 ` Sagi Grimberg 2015-01-11 17:45 ` Sagi Grimberg [not found] ` <54B2B69E.2010503-LDSdmyG8hGV8YrgS2mwiifqBs+8SCbDb@public.gmane.org> 2015-01-12 0:41 ` Chuck Lever 2015-01-12 0:41 ` Chuck Lever [not found] ` <6A78707C-A371-412F-8E9A-24937318A01D-QHcLZuEGTsvQT0dZR+AlfA@public.gmane.org> 2015-01-12 16:08 ` Steve Wise 2015-01-12 16:08 ` Steve Wise 2015-01-12 16:20 ` Chuck Lever 2015-01-12 16:20 ` Chuck Lever [not found] ` <A84D07C5-1879-49ED-A181-6FFC76B4864B-QHcLZuEGTsvQT0dZR+AlfA@public.gmane.org> 2015-01-12 16:26 ` Steve Wise 2015-01-12 16:26 ` Steve Wise 2015-01-12 16:45 ` Steve Wise 2015-01-12 16:45 ` Steve Wise [not found] ` <54B3FA35.4030003-7bPotxP6k4+P2YhJcF5u+vpXobYPEAuW@public.gmane.org> 2015-01-13 10:05 ` Sagi Grimberg 2015-01-13 10:05 ` Sagi Grimberg [not found] ` <54B4EDE9.2050300-LDSdmyG8hGV8YrgS2mwiifqBs+8SCbDb@public.gmane.org> 2015-01-13 15:40 ` Steve Wise 2015-01-13 15:40 ` Steve Wise 2015-01-09 19:22 ` Chuck Lever [this message] 2015-01-09 19:22 ` [PATCH v1 07/10] svcrdma: rc_position sanity checking Chuck Lever 2015-01-09 19:23 ` [PATCH v1 08/10] svcrdma: Support RDMA_NOMSG requests Chuck Lever 2015-01-09 19:23 ` Chuck Lever 2015-01-09 19:23 ` [PATCH v1 09/10] Move read list XDR round-up logic Chuck Lever 2015-01-09 19:23 ` Chuck Lever [not found] ` <20150109192310.4901.62851.stgit-Hs+gFlyCn65vLzlybtyyYzGyq/o6K9yX@public.gmane.org> 2015-01-09 20:14 ` J. Bruce Fields 2015-01-09 20:14 ` J. Bruce Fields [not found] ` <20150109201434.GA30452-uC3wQj2KruNg9hUCZPvPmw@public.gmane.org> 2015-01-09 20:20 ` Chuck Lever 2015-01-09 20:20 ` Chuck Lever 2015-01-09 19:23 ` [PATCH v1 10/10] svcrdma: Handle additional inline content Chuck Lever 2015-01-09 19:23 ` Chuck Lever [not found] ` <20150109192319.4901.89444.stgit-Hs+gFlyCn65vLzlybtyyYzGyq/o6K9yX@public.gmane.org> 2015-01-11 18:01 ` Sagi Grimberg 2015-01-11 18:01 ` Sagi Grimberg [not found] ` <54B2BA77.20101-LDSdmyG8hGV8YrgS2mwiifqBs+8SCbDb@public.gmane.org> 2015-01-12 1:13 ` Chuck Lever 2015-01-12 1:13 ` Chuck Lever [not found] ` <46D2849E-39D7-4290-91CE-FD66E3F96B21-QHcLZuEGTsvQT0dZR+AlfA@public.gmane.org> 2015-01-13 10:11 ` Sagi Grimberg 2015-01-13 10:11 ` Sagi Grimberg [not found] ` <54B4EF5D.3040201-LDSdmyG8hGV8YrgS2mwiifqBs+8SCbDb@public.gmane.org> 2015-01-13 14:35 ` Chuck Lever 2015-01-13 14:35 ` Chuck Lever 2015-01-09 20:39 ` [PATCH v1 00/10] NFS/RDMA server for 3.20 J. Bruce Fields 2015-01-09 20:39 ` J. Bruce Fields [not found] ` <20150109203958.GB30452-uC3wQj2KruNg9hUCZPvPmw@public.gmane.org> 2015-01-09 20:40 ` Chuck Lever 2015-01-09 20:40 ` Chuck Lever [not found] ` <629A4CE4-ECB9-4A1D-9179-CFAD2FC7AD91-QHcLZuEGTsvQT0dZR+AlfA@public.gmane.org> 2015-01-09 20:44 ` J. Bruce Fields 2015-01-09 20:44 ` J. Bruce Fields
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=20150109192253.4901.19640.stgit@klimt.1015granger.net \ --to=chuck.lever-qhclzuegtsvqt0dzr+alfa@public.gmane.org \ --cc=linux-nfs-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \ --cc=linux-rdma-u79uwXL29TY76Z2rM5mHXA@public.gmane.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: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.