SUNRPC xprtrdma: fix XDR tail buf marshalling for all ops
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>
This commit is contained in:
parent
5cef338b30
commit
50e1092b3a
|
@ -92,7 +92,6 @@ rpcrdma_convert_iovs(struct xdr_buf *xdrbuf, int pos,
|
||||||
seg[n].mr_page = NULL;
|
seg[n].mr_page = NULL;
|
||||||
seg[n].mr_offset = xdrbuf->head[0].iov_base;
|
seg[n].mr_offset = xdrbuf->head[0].iov_base;
|
||||||
seg[n].mr_len = xdrbuf->head[0].iov_len;
|
seg[n].mr_len = xdrbuf->head[0].iov_len;
|
||||||
pos += xdrbuf->head[0].iov_len;
|
|
||||||
++n;
|
++n;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -104,7 +103,6 @@ rpcrdma_convert_iovs(struct xdr_buf *xdrbuf, int pos,
|
||||||
seg[n].mr_len = min_t(u32,
|
seg[n].mr_len = min_t(u32,
|
||||||
PAGE_SIZE - xdrbuf->page_base, xdrbuf->page_len);
|
PAGE_SIZE - xdrbuf->page_base, xdrbuf->page_len);
|
||||||
len = xdrbuf->page_len - seg[n].mr_len;
|
len = xdrbuf->page_len - seg[n].mr_len;
|
||||||
pos += len;
|
|
||||||
++n;
|
++n;
|
||||||
p = 1;
|
p = 1;
|
||||||
while (len > 0) {
|
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)
|
if (n == nsegs)
|
||||||
return 0;
|
return 0;
|
||||||
seg[n].mr_page = NULL;
|
seg[n].mr_page = NULL;
|
||||||
seg[n].mr_offset = xdrbuf->tail[0].iov_base;
|
seg[n].mr_offset = xdrbuf->tail[0].iov_base;
|
||||||
seg[n].mr_len = xdrbuf->tail[0].iov_len;
|
seg[n].mr_len = xdrbuf->tail[0].iov_len;
|
||||||
pos += xdrbuf->tail[0].iov_len;
|
|
||||||
++n;
|
++n;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pos < xdrbuf->len)
|
|
||||||
dprintk("RPC: %s: marshaled only %d of %d\n",
|
|
||||||
__func__, pos, xdrbuf->len);
|
|
||||||
|
|
||||||
return n;
|
return n;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue