diff options
author | Tom Talpey <talpey@netapp.com> | 2008-10-09 15:01:31 -0400 |
---|---|---|
committer | Trond Myklebust <Trond.Myklebust@netapp.com> | 2008-10-10 15:13:02 -0400 |
commit | 1a954051b0cf79bd67e5f9db40333e3a9b1d05d2 (patch) | |
tree | 48a0e5f876776865552cfce522ebee604da30fbb /net/sunrpc/xprtrdma/verbs.c | |
parent | 926449ba66ce2a45c619bbe755b00d6bdbf0d83e (diff) |
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>
Diffstat (limited to 'net/sunrpc/xprtrdma/verbs.c')
-rw-r--r-- | net/sunrpc/xprtrdma/verbs.c | 9 |
1 files changed, 4 insertions, 5 deletions
diff --git a/net/sunrpc/xprtrdma/verbs.c b/net/sunrpc/xprtrdma/verbs.c index d94f379f36d7..a63d0c0ec017 100644 --- a/net/sunrpc/xprtrdma/verbs.c +++ b/net/sunrpc/xprtrdma/verbs.c | |||
@@ -338,10 +338,8 @@ connected: | |||
338 | wake_up_all(&ep->rep_connect_wait); | 338 | wake_up_all(&ep->rep_connect_wait); |
339 | break; | 339 | break; |
340 | default: | 340 | default: |
341 | ia->ri_async_rc = -EINVAL; | 341 | dprintk("RPC: %s: unexpected CM event %d\n", |
342 | dprintk("RPC: %s: unexpected CM event %X\n", | ||
343 | __func__, event->event); | 342 | __func__, event->event); |
344 | complete(&ia->ri_done); | ||
345 | break; | 343 | break; |
346 | } | 344 | } |
347 | 345 | ||
@@ -355,6 +353,8 @@ rpcrdma_create_id(struct rpcrdma_xprt *xprt, | |||
355 | struct rdma_cm_id *id; | 353 | struct rdma_cm_id *id; |
356 | int rc; | 354 | int rc; |
357 | 355 | ||
356 | init_completion(&ia->ri_done); | ||
357 | |||
358 | id = rdma_create_id(rpcrdma_conn_upcall, xprt, RDMA_PS_TCP); | 358 | id = rdma_create_id(rpcrdma_conn_upcall, xprt, RDMA_PS_TCP); |
359 | if (IS_ERR(id)) { | 359 | if (IS_ERR(id)) { |
360 | rc = PTR_ERR(id); | 360 | rc = PTR_ERR(id); |
@@ -427,8 +427,6 @@ rpcrdma_ia_open(struct rpcrdma_xprt *xprt, struct sockaddr *addr, int memreg) | |||
427 | struct ib_device_attr devattr; | 427 | struct ib_device_attr devattr; |
428 | struct rpcrdma_ia *ia = &xprt->rx_ia; | 428 | struct rpcrdma_ia *ia = &xprt->rx_ia; |
429 | 429 | ||
430 | init_completion(&ia->ri_done); | ||
431 | |||
432 | ia->ri_id = rpcrdma_create_id(xprt, ia, addr); | 430 | ia->ri_id = rpcrdma_create_id(xprt, ia, addr); |
433 | if (IS_ERR(ia->ri_id)) { | 431 | if (IS_ERR(ia->ri_id)) { |
434 | rc = PTR_ERR(ia->ri_id); | 432 | rc = PTR_ERR(ia->ri_id); |
@@ -815,6 +813,7 @@ retry: | |||
815 | goto out; | 813 | goto out; |
816 | } | 814 | } |
817 | /* END TEMP */ | 815 | /* END TEMP */ |
816 | rdma_destroy_qp(ia->ri_id); | ||
818 | rdma_destroy_id(ia->ri_id); | 817 | rdma_destroy_id(ia->ri_id); |
819 | ia->ri_id = id; | 818 | ia->ri_id = id; |
820 | } | 819 | } |