If addr_handler() got invoked with an error status,
do not set id_priv->state to success followed by
resettting it to the old value (redundant code).
Also encapsulate some common code.

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-10 15:45:27.000000000 +0530
+++ new/drivers/infiniband/core/cma.c   2006-10-10 15:59:53.000000000 +0530
@@ -1515,6 +1515,8 @@ static void addr_handler(int status, str
 {
        struct rdma_id_private *id_priv = context;
        enum rdma_cm_event_type event;
+       int did_comp_exch = 0;
+       int destroy = 0;
 
        atomic_inc(&id_priv->dev_remove);
 
@@ -1523,17 +1525,20 @@ static void addr_handler(int status, str
         * we're trying to acquire it.
         */
        mutex_lock(&lock);
-       if (!cma_comp_exch(id_priv, CMA_ADDR_QUERY, CMA_ADDR_RESOLVED)) {
-               mutex_unlock(&lock);
-               goto out;
+       if (!status) {
+               if (!cma_comp_exch(id_priv, CMA_ADDR_QUERY,
+                                  CMA_ADDR_RESOLVED)) {
+                       mutex_unlock(&lock);
+                       goto out;
+               }
+               did_comp_exch = 1;
+               if (!id_priv->cma_dev)
+                       status = cma_acquire_dev(id_priv);
        }
-
-       if (!status && !id_priv->cma_dev)
-               status = cma_acquire_dev(id_priv);
        mutex_unlock(&lock);
-
        if (status) {
-               if (!cma_comp_exch(id_priv, CMA_ADDR_RESOLVED, CMA_ADDR_BOUND))
+               if (did_comp_exch && !cma_comp_exch(id_priv, CMA_ADDR_RESOLVED,
+                                                   CMA_ADDR_BOUND))
                        goto out;
                event = RDMA_CM_EVENT_ADDR_ERROR;
        } else {
@@ -1544,14 +1549,13 @@ static void addr_handler(int status, str
 
        if (cma_notify_user(id_priv, event, status, NULL, 0)) {
                cma_exch(id_priv, CMA_DESTROYING);
-               cma_release_remove(id_priv);
-               cma_deref_id(id_priv);
-               rdma_destroy_id(&id_priv->id);
-               return;
+               destroy = 1;
        }
 out:
        cma_release_remove(id_priv);
        cma_deref_id(id_priv);
+       if (destroy)
+               rdma_destroy_id(&id_priv->id);
 }
 
 static int cma_resolve_loopback(struct rdma_id_private *id_priv)

_______________________________________________
openib-general mailing list
[email protected]
http://openib.org/mailman/listinfo/openib-general

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

Reply via email to