svcrdma: Fix backchannel return code
[linux-2.6-microblaze.git] / net / sunrpc / xprtrdma / svc_rdma_backchannel.c
index d9aab45..b174f3b 100644 (file)
 #undef SVCRDMA_BACKCHANNEL_DEBUG
 
 /**
- * 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
+ * svc_rdma_handle_bc_reply - Process incoming backchannel Reply
+ * @rqstp: resources for handling the Reply
+ * @rctxt: Received message
  *
- * 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)
+void svc_rdma_handle_bc_reply(struct svc_rqst *rqstp,
+                             struct svc_rdma_recv_ctxt *rctxt)
 {
+       struct svc_xprt *sxprt = rqstp->rq_xprt;
+       struct rpc_xprt *xprt = sxprt->xpt_bc_xprt;
        struct rpcrdma_xprt *r_xprt = rpcx_to_rdmax(xprt);
+       struct xdr_buf *rcvbuf = &rqstp->rq_arg;
        struct kvec *dst, *src = &rcvbuf->head[0];
+       __be32 *rdma_resp = rctxt->rc_recv_buf;
        struct rpc_rqst *req;
        u32 credits;
        size_t len;
        __be32 xid;
        __be32 *p;
-       int ret;
 
        p = (__be32 *)src->iov_base;
        len = src->iov_len;
@@ -49,14 +48,10 @@ int svc_rdma_handle_bc_reply(struct rpc_xprt *xprt, __be32 *rdma_resp,
                __func__, (int)len, p);
 #endif
 
-       ret = -EAGAIN;
-       if (src->iov_len < 24)
-               goto out_shortreply;
-
        spin_lock(&xprt->queue_lock);
        req = xprt_lookup_rqst(xprt, xid);
        if (!req)
-               goto out_notfound;
+               goto out_unlock;
 
        dst = &req->rq_private_buf.head[0];
        memcpy(&req->rq_private_buf, &req->rq_rcv_buf, sizeof(struct xdr_buf));
@@ -77,25 +72,12 @@ int svc_rdma_handle_bc_reply(struct rpc_xprt *xprt, __be32 *rdma_resp,
        spin_unlock(&xprt->transport_lock);
 
        spin_lock(&xprt->queue_lock);
-       ret = 0;
        xprt_complete_rqst(req->rq_task, rcvbuf->len);
        xprt_unpin_rqst(req);
        rcvbuf->len = 0;
 
 out_unlock:
        spin_unlock(&xprt->queue_lock);
-out:
-       return ret;
-
-out_shortreply:
-       dprintk("svcrdma: short bc reply: xprt=%p, len=%zu\n",
-               xprt, src->iov_len);
-       goto out;
-
-out_notfound:
-       dprintk("svcrdma: unrecognized bc reply: xprt=%p, xid=%08x\n",
-               xprt, be32_to_cpu(xid));
-       goto out_unlock;
 }
 
 /* Send a backwards direction RPC call.