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