aboutsummaryrefslogtreecommitdiffstats
path: root/net
diff options
context:
space:
mode:
authorTom Talpey <talpey@netapp.com>2008-10-09 15:01:31 -0400
committerTrond Myklebust <Trond.Myklebust@netapp.com>2008-10-10 15:13:02 -0400
commit1a954051b0cf79bd67e5f9db40333e3a9b1d05d2 (patch)
tree48a0e5f876776865552cfce522ebee604da30fbb /net
parent926449ba66ce2a45c619bbe755b00d6bdbf0d83e (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')
-rw-r--r--net/sunrpc/xprtrdma/verbs.c9
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 }