rdma_bind_addr leaks a cma_dev reference count in failure
case.

Signed-off-by: Krishna Kumar <[EMAIL PROTECTED]>
--------
diff -ruNp org/drivers/infiniband/core/cma.c new/drivers/infiniband/core/cma.c
--- org/drivers/infiniband/core/cma.c   2006-10-09 17:13:41.000000000 +0530
+++ new/drivers/infiniband/core/cma.c   2006-10-09 19:42:31.000000000 +0530
@@ -1749,6 +1749,7 @@ static int cma_get_port(struct rdma_id_p
 int rdma_bind_addr(struct rdma_cm_id *id, struct sockaddr *addr)
 {
        struct rdma_id_private *id_priv;
+       int did_acquire_dev = 0;
        int ret;
 
        if (addr->sa_family != AF_INET)
@@ -1765,18 +1766,20 @@ int rdma_bind_addr(struct rdma_cm_id *id
                        ret = cma_acquire_dev(id_priv);
                        mutex_unlock(&lock);
                }
-               if (ret)
-                       goto err;
+               if (!ret)
+                       did_acquire_dev = 1;
+               else
+                       goto out;
        }
-
        memcpy(&id->route.addr.src_addr, addr, ip_addr_size(addr));
        ret = cma_get_port(id_priv);
-       if (ret)
-               goto err;
 
-       return 0;
-err:
-       cma_comp_exch(id_priv, CMA_ADDR_BOUND, CMA_IDLE);
+out:
+       if (ret) {
+               if (did_acquire_dev)
+                       cma_detach_from_dev(id_priv);
+               cma_comp_exch(id_priv, CMA_ADDR_BOUND, CMA_IDLE);
+       }
        return ret;
 }
 EXPORT_SYMBOL(rdma_bind_addr);

_______________________________________________
openib-general mailing list
openib-general@openib.org
http://openib.org/mailman/listinfo/openib-general

To unsubscribe, please visit http://openib.org/mailman/listinfo/openib-general

Reply via email to