mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-04 18:09:57 +00:00
RPC/RDMA: fix connect/reconnect resource leak.
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>
This commit is contained in:
parent
926449ba66
commit
1a954051b0
1 changed files with 4 additions and 5 deletions
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue