Skip to content

Commit

Permalink
RPC/RDMA: fix connect/reconnect resource leak.
Browse files Browse the repository at this point in the history
The RPC/RDMA code can leak RDMA connection manager endpoints in
certain error cases on connect. Don't signal unwanted events,
and be certain to destroy any allocated qp.

Signed-off-by: Tom Talpey <talpey@netapp.com>
Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
  • Loading branch information
Tom Talpey authored and Trond Myklebust committed Oct 10, 2008
1 parent 926449b commit 1a95405
Showing 1 changed file with 4 additions and 5 deletions.
9 changes: 4 additions & 5 deletions net/sunrpc/xprtrdma/verbs.c
Original file line number Diff line number Diff line change
Expand Up @@ -338,10 +338,8 @@ rpcrdma_conn_upcall(struct rdma_cm_id *id, struct rdma_cm_event *event)
wake_up_all(&ep->rep_connect_wait);
break;
default:
ia->ri_async_rc = -EINVAL;
dprintk("RPC: %s: unexpected CM event %X\n",
dprintk("RPC: %s: unexpected CM event %d\n",
__func__, event->event);
complete(&ia->ri_done);
break;
}

Expand All @@ -355,6 +353,8 @@ rpcrdma_create_id(struct rpcrdma_xprt *xprt,
struct rdma_cm_id *id;
int rc;

init_completion(&ia->ri_done);

id = rdma_create_id(rpcrdma_conn_upcall, xprt, RDMA_PS_TCP);
if (IS_ERR(id)) {
rc = PTR_ERR(id);
Expand Down Expand Up @@ -427,8 +427,6 @@ rpcrdma_ia_open(struct rpcrdma_xprt *xprt, struct sockaddr *addr, int memreg)
struct ib_device_attr devattr;
struct rpcrdma_ia *ia = &xprt->rx_ia;

init_completion(&ia->ri_done);

ia->ri_id = rpcrdma_create_id(xprt, ia, addr);
if (IS_ERR(ia->ri_id)) {
rc = PTR_ERR(ia->ri_id);
Expand Down Expand Up @@ -815,6 +813,7 @@ rpcrdma_ep_connect(struct rpcrdma_ep *ep, struct rpcrdma_ia *ia)
goto out;
}
/* END TEMP */
rdma_destroy_qp(ia->ri_id);
rdma_destroy_id(ia->ri_id);
ia->ri_id = id;
}
Expand Down

0 comments on commit 1a95405

Please sign in to comment.