Thanks for the audit.  I applied this version of your patch.  Does
this still look correct?

Index: infiniband/core/sa_query.c
===================================================================
--- infiniband/core/sa_query.c  (revision 1164)
+++ infiniband/core/sa_query.c  (working copy)
@@ -699,29 +710,28 @@
        sa_dev->start_port = s;
        sa_dev->end_port   = e;
 
-       for (i = s; i <= e; ++i) {
-               sa_dev->port[i - s].mr       = NULL;
-               sa_dev->port[i - s].sm_ah    = NULL;
-               sa_dev->port[i - s].port_num = i;
-               spin_lock_init(&sa_dev->port[i - s].ah_lock);
+       for (i = 0; i <= e - s; ++i) {
+               sa_dev->port[i].mr       = NULL;
+               sa_dev->port[i].sm_ah    = NULL;
+               sa_dev->port[i].port_num = i + s;
+               spin_lock_init(&sa_dev->port[i].ah_lock);
 
-               sa_dev->port[i - s].agent =
-                       ib_register_mad_agent(device, i, IB_QPT_GSI,
+               sa_dev->port[i].agent =
+                       ib_register_mad_agent(device, i + s, IB_QPT_GSI,
                                              NULL, 0, send_handler,
                                              recv_handler, sa_dev);
-               if (IS_ERR(sa_dev->port[i - s].agent))
+               if (IS_ERR(sa_dev->port[i].agent))
                        goto err;
 
-               sa_dev->port[i - s].mr = ib_get_dma_mr(sa_dev->port[i - 
s].agent->qp->pd,
-                                                      IB_ACCESS_LOCAL_WRITE);
-               if (IS_ERR(sa_dev->port[i - s].mr)) {
-                       /* Bump i so agent from this iter. is freed */
-                       ++i;
+               sa_dev->port[i].mr = ib_get_dma_mr(sa_dev->port[i].agent->qp->pd,
+                                                  IB_ACCESS_LOCAL_WRITE);
+               if (IS_ERR(sa_dev->port[i].mr)) {
+                       ib_unregister_mad_agent(sa_dev->port[i].agent);
                        goto err;
                }
 
-               INIT_WORK(&sa_dev->port[i - s].update_task,
-                         update_sm_ah, &sa_dev->port[i - s]);
+               INIT_WORK(&sa_dev->port[i].update_task,
+                         update_sm_ah, &sa_dev->port[i]);
        }
 
        /*
@@ -732,27 +742,20 @@
         */
 
        INIT_IB_EVENT_HANDLER(&sa_dev->event_handler, device, ib_sa_event);
-       if (ib_register_event_handler(&sa_dev->event_handler)) {
-               kfree(sa_dev);
+       if (ib_register_event_handler(&sa_dev->event_handler))
                goto err;
-       }
 
-       for (i = s; i <= e; ++i)
-               update_sm_ah(&sa_dev->port[i - s]);
+       for (i = 0; i <= e - s; ++i)
+               update_sm_ah(&sa_dev->port[i]);
 
        ib_set_client_data(device, &sa_client, sa_dev);
 
        return;
 
 err:
-       while (--i >= s) {
-               if (sa_dev->port[i - s].mr && !IS_ERR(sa_dev->port[i - s].mr))
-                       ib_dereg_mr(sa_dev->port[i - s].mr);
-
-               if (sa_dev->port[i - s].sm_ah)
-                       kref_put(&sa_dev->port[i].sm_ah->ref, free_sm_ah);
-
-               ib_unregister_mad_agent(sa_dev->port[i - s].agent);
+       while (--i >= 0) {
+               ib_dereg_mr(sa_dev->port[i].mr);
+               ib_unregister_mad_agent(sa_dev->port[i].agent);
        }
 
        kfree(sa_dev);
_______________________________________________
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