svcrdma: Find rmsgp more reliably
xdr_start() can return the wrong rmsgp address if an assumption about how the xdr_buf was constructed changes. When it gets it wrong, the client receives a reply that has gibberish in the RPC/RDMA header, preventing it from matching a waiting RPC request. Instead, make (and document) just one assumption: that the RDMA header for the client's RPC call is at the start of the first page in rq_pages. Signed-off-by: Chuck Lever <chuck.lever@oracle.com> Reviewed-by: Steve Wise <swise@opengridcomputing.com> Signed-off-by: J. Bruce Fields <bfields@redhat.com>
This commit is contained in:
parent
3fe04ee9f9
commit
e5523bd281
1 changed files with 4 additions and 14 deletions
|
@ -483,18 +483,6 @@ void svc_rdma_prep_reply_hdr(struct svc_rqst *rqstp)
|
|||
{
|
||||
}
|
||||
|
||||
/*
|
||||
* Return the start of an xdr buffer.
|
||||
*/
|
||||
static void *xdr_start(struct xdr_buf *xdr)
|
||||
{
|
||||
return xdr->head[0].iov_base -
|
||||
(xdr->len -
|
||||
xdr->page_len -
|
||||
xdr->tail[0].iov_len -
|
||||
xdr->head[0].iov_len);
|
||||
}
|
||||
|
||||
int svc_rdma_sendto(struct svc_rqst *rqstp)
|
||||
{
|
||||
struct svc_xprt *xprt = rqstp->rq_xprt;
|
||||
|
@ -512,8 +500,10 @@ int svc_rdma_sendto(struct svc_rqst *rqstp)
|
|||
|
||||
dprintk("svcrdma: sending response for rqstp=%p\n", rqstp);
|
||||
|
||||
/* Get the RDMA request header. */
|
||||
rdma_argp = xdr_start(&rqstp->rq_arg);
|
||||
/* Get the RDMA request header. The receive logic always
|
||||
* places this at the start of page 0.
|
||||
*/
|
||||
rdma_argp = page_address(rqstp->rq_pages[0]);
|
||||
|
||||
/* Build an req vec for the XDR */
|
||||
ctxt = svc_rdma_get_context(rdma);
|
||||
|
|
Loading…
Reference in a new issue