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_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; | ||||
| } | ||||
| 
 | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user