]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - net/sunrpc/xprtrdma/svc_rdma_backchannel.c
svcrdma: Clear xpt_bc_xps in xprt_setup_rdma_bc() error exit arm
[karo-tx-linux.git] / net / sunrpc / xprtrdma / svc_rdma_backchannel.c
index 2d8545c3409596190d027e8ad73651903f25a6aa..6035c5a380a6b10198a01eada0732f46ca2e93fc 100644 (file)
@@ -177,18 +177,26 @@ xprt_rdma_bc_allocate(struct rpc_task *task)
                return -EINVAL;
        }
 
+       /* svc_rdma_sendto releases this page */
        page = alloc_page(RPCRDMA_DEF_GFP);
        if (!page)
                return -ENOMEM;
-
        rqst->rq_buffer = page_address(page);
+
+       rqst->rq_rbuffer = kmalloc(rqst->rq_rcvsize, RPCRDMA_DEF_GFP);
+       if (!rqst->rq_rbuffer) {
+               put_page(page);
+               return -ENOMEM;
+       }
        return 0;
 }
 
 static void
 xprt_rdma_bc_free(struct rpc_task *task)
 {
-       /* No-op: ctxt and page have already been freed. */
+       struct rpc_rqst *rqst = task->tk_rqstp;
+
+       kfree(rqst->rq_rbuffer);
 }
 
 static int
@@ -351,6 +359,7 @@ xprt_setup_rdma_bc(struct xprt_create *args)
 out_fail:
        xprt_rdma_free_addresses(xprt);
        args->bc_xprt->xpt_bc_xprt = NULL;
+       args->bc_xprt->xpt_bc_xps = NULL;
        xprt_put(xprt);
        xprt_free(xprt);
        return ERR_PTR(-EINVAL);