|
@@ -12,7 +12,17 @@
|
|
|
|
|
|
#undef SVCRDMA_BACKCHANNEL_DEBUG
|
|
|
|
|
|
-int svc_rdma_handle_bc_reply(struct rpc_xprt *xprt, struct rpcrdma_msg *rmsgp,
|
|
|
+/**
|
|
|
+ * svc_rdma_handle_bc_reply - Process incoming backchannel reply
|
|
|
+ * @xprt: controlling backchannel transport
|
|
|
+ * @rdma_resp: pointer to incoming transport header
|
|
|
+ * @rcvbuf: XDR buffer into which to decode the reply
|
|
|
+ *
|
|
|
+ * Returns:
|
|
|
+ * %0 if @rcvbuf is filled in, xprt_complete_rqst called,
|
|
|
+ * %-EAGAIN if server should call ->recvfrom again.
|
|
|
+ */
|
|
|
+int svc_rdma_handle_bc_reply(struct rpc_xprt *xprt, __be32 *rdma_resp,
|
|
|
struct xdr_buf *rcvbuf)
|
|
|
{
|
|
|
struct rpcrdma_xprt *r_xprt = rpcx_to_rdmax(xprt);
|
|
@@ -27,13 +37,13 @@ int svc_rdma_handle_bc_reply(struct rpc_xprt *xprt, struct rpcrdma_msg *rmsgp,
|
|
|
|
|
|
p = (__be32 *)src->iov_base;
|
|
|
len = src->iov_len;
|
|
|
- xid = rmsgp->rm_xid;
|
|
|
+ xid = *rdma_resp;
|
|
|
|
|
|
#ifdef SVCRDMA_BACKCHANNEL_DEBUG
|
|
|
pr_info("%s: xid=%08x, length=%zu\n",
|
|
|
__func__, be32_to_cpu(xid), len);
|
|
|
pr_info("%s: RPC/RDMA: %*ph\n",
|
|
|
- __func__, (int)RPCRDMA_HDRLEN_MIN, rmsgp);
|
|
|
+ __func__, (int)RPCRDMA_HDRLEN_MIN, rdma_resp);
|
|
|
pr_info("%s: RPC: %*ph\n",
|
|
|
__func__, (int)len, p);
|
|
|
#endif
|
|
@@ -53,7 +63,7 @@ int svc_rdma_handle_bc_reply(struct rpc_xprt *xprt, struct rpcrdma_msg *rmsgp,
|
|
|
goto out_unlock;
|
|
|
memcpy(dst->iov_base, p, len);
|
|
|
|
|
|
- credits = be32_to_cpu(rmsgp->rm_credit);
|
|
|
+ credits = be32_to_cpup(rdma_resp + 2);
|
|
|
if (credits == 0)
|
|
|
credits = 1; /* don't deadlock */
|
|
|
else if (credits > r_xprt->rx_buf.rb_bc_max_requests)
|