This was originally sent with the intention :
        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.

But when I followed Sean's suggestion to avoid using extra
flags, the result is not very appealing (see below). The
code is too complicated (multiple overwrites of 'status')
to do this neatly.

I suggest we drop this patch, as it is not easy to achieve
the above intention cleanly by either re-write method :)

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
@@ -1520,6 +1518,13 @@ static void addr_handler(int status, str
 
        atomic_inc(&id_priv->dev_remove);
 
+       if (status) { /* We got called with an error */
+               if (!cma_comp(id_priv, CMA_ADDR_QUERY)) /* Invalid state */
+                       goto out;
+               event = RDMA_CM_EVENT_ADDR_ERROR;
+               goto notify:
+       }
+
        /*
         * Grab mutex to block rdma_destroy_id() from removing the device while
         * we're trying to acquire it.
@@ -1529,9 +1534,8 @@ static void addr_handler(int status, str
                mutex_unlock(&lock);
                goto out;
        }
-
-       if (!status && !id_priv->cma_dev)
-               status = cma_acquire_dev(id_priv);
+       if (!id_priv->cma_dev)
+               status = cma_acquire_dev(id_priv); 
        mutex_unlock(&lock);
 
        if (status) {
@@ -1544,16 +1548,15 @@ static void addr_handler(int status, str
                event = RDMA_CM_EVENT_ADDR_RESOLVED;
        }
 
-       if (cma_notify_user(id_priv, event, status, NULL, 0)) {
+notify:
+       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;
-       }
+
 out:
        cma_release_remove(id_priv);
        cma_deref_id(id_priv);
+       if (cma_comp(id_priv, CMA_DESTROYING))
+               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