SUNRPC xprtrdma: fix XDR tail buf marshalling for all ops
authorJames Lentini <jlentini@netapp.com>
Mon, 10 Dec 2007 16:24:48 +0000 (11:24 -0500)
committerTrond Myklebust <Trond.Myklebust@netapp.com>
Wed, 12 Dec 2007 03:01:59 +0000 (22:01 -0500)
rpcrdma_convert_iovs is passed an xdr_buf representing either an RPC
request or an RPC reply. In the case of a request, several
calculations and tests involving pos are unnecessary. In the case of a
reply, several calculations and tests involving pos are incorrect (the
code tests pos against the reply xdr buf's len field, which is always
0 at the time rpcrdma_convert_iovs is executed). This change removes
the incorrect/unnecessary calculations and tests involving pos.

This fixes an observed problem when reading certain file sizes over
NFS/RDMA.

Signed-off-by: Tom Tucker <tom@opengridcomputing.com>
Signed-off-by: Tom Talpey <talpey@netapp.com>
Signed-off-by: James Lentini <jlentini@netapp.com>
Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
net/sunrpc/xprtrdma/rpc_rdma.c

index 9e11ce7..ee8de7a 100644 (file)
@@ -92,7 +92,6 @@ rpcrdma_convert_iovs(struct xdr_buf *xdrbuf, int pos,
                seg[n].mr_page = NULL;
                seg[n].mr_offset = xdrbuf->head[0].iov_base;
                seg[n].mr_len = xdrbuf->head[0].iov_len;
-               pos += xdrbuf->head[0].iov_len;
                ++n;
        }
 
@@ -104,7 +103,6 @@ rpcrdma_convert_iovs(struct xdr_buf *xdrbuf, int pos,
                seg[n].mr_len = min_t(u32,
                        PAGE_SIZE - xdrbuf->page_base, xdrbuf->page_len);
                len = xdrbuf->page_len - seg[n].mr_len;
-               pos += len;
                ++n;
                p = 1;
                while (len > 0) {
@@ -119,20 +117,15 @@ rpcrdma_convert_iovs(struct xdr_buf *xdrbuf, int pos,
                }
        }
 
-       if (pos < xdrbuf->len && xdrbuf->tail[0].iov_len) {
+       if (xdrbuf->tail[0].iov_len) {
                if (n == nsegs)
                        return 0;
                seg[n].mr_page = NULL;
                seg[n].mr_offset = xdrbuf->tail[0].iov_base;
                seg[n].mr_len = xdrbuf->tail[0].iov_len;
-               pos += xdrbuf->tail[0].iov_len;
                ++n;
        }
 
-       if (pos < xdrbuf->len)
-               dprintk("RPC:       %s: marshaled only %d of %d\n",
-                               __func__, pos, xdrbuf->len);
-
        return n;
 }