diff options
author | Chuck Lever <chuck.lever@oracle.com> | 2014-07-29 17:23:43 -0400 |
---|---|---|
committer | Anna Schumaker <Anna.Schumaker@Netapp.com> | 2014-07-31 16:22:53 -0400 |
commit | 6ab59945f292a5c6cbc4a6c2011f1a732a116af2 (patch) | |
tree | b6027a5d873b2c5941cfb279be193ad366b7b15d /net/sunrpc/xprtrdma/transport.c | |
parent | 43e95988178ed70a878a5be6be9ad248342dbf7d (diff) |
xprtrdma: Update rkeys after transport reconnect
Various reports of:
rpcrdma_qp_async_error_upcall: QP error 3 on device mlx4_0
ep ffff8800bfd3e848
Ensure that rkeys in already-marshalled RPC/RDMA headers are
refreshed after the QP has been replaced by a reconnect.
BugLink: https://bugzilla.linux-nfs.org/show_bug.cgi?id=249
Suggested-by: Selvin Xavier <Selvin.Xavier@Emulex.Com>
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Tested-by: Steve Wise <swise@opengridcomputing.com>
Tested-by: Shirley Ma <shirley.ma@oracle.com>
Tested-by: Devesh Sharma <devesh.sharma@emulex.com>
Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
Diffstat (limited to 'net/sunrpc/xprtrdma/transport.c')
-rw-r--r-- | net/sunrpc/xprtrdma/transport.c | 11 |
1 files changed, 6 insertions, 5 deletions
diff --git a/net/sunrpc/xprtrdma/transport.c b/net/sunrpc/xprtrdma/transport.c index 418510202919..f6d280b31dc9 100644 --- a/net/sunrpc/xprtrdma/transport.c +++ b/net/sunrpc/xprtrdma/transport.c | |||
@@ -597,13 +597,14 @@ xprt_rdma_send_request(struct rpc_task *task) | |||
597 | struct rpc_xprt *xprt = rqst->rq_xprt; | 597 | struct rpc_xprt *xprt = rqst->rq_xprt; |
598 | struct rpcrdma_req *req = rpcr_to_rdmar(rqst); | 598 | struct rpcrdma_req *req = rpcr_to_rdmar(rqst); |
599 | struct rpcrdma_xprt *r_xprt = rpcx_to_rdmax(xprt); | 599 | struct rpcrdma_xprt *r_xprt = rpcx_to_rdmax(xprt); |
600 | int rc; | 600 | int rc = 0; |
601 | 601 | ||
602 | if (req->rl_niovs == 0) { | 602 | if (req->rl_niovs == 0) |
603 | rc = rpcrdma_marshal_req(rqst); | 603 | rc = rpcrdma_marshal_req(rqst); |
604 | if (rc < 0) | 604 | else if (r_xprt->rx_ia.ri_memreg_strategy == RPCRDMA_FRMR) |
605 | goto failed_marshal; | 605 | rc = rpcrdma_marshal_chunks(rqst, 0); |
606 | } | 606 | if (rc < 0) |
607 | goto failed_marshal; | ||
607 | 608 | ||
608 | if (req->rl_reply == NULL) /* e.g. reconnection */ | 609 | if (req->rl_reply == NULL) /* e.g. reconnection */ |
609 | rpcrdma_recv_buffer_get(req); | 610 | rpcrdma_recv_buffer_get(req); |