Convert local SA to use the new SA cursor routines for walking a
list of attributes in an RMPP response returned by the SA.  This
replaces a local SA specific implementation.

Signed-off-by: Sean Hefty <[EMAIL PROTECTED]>
---
Index: core/local_sa.c
===================================================================
--- core/local_sa.c     (revision 8647)
+++ core/local_sa.c     (working copy)
@@ -194,60 +194,34 @@ static int insert_attr(struct index_root
 static void update_path_rec(struct sa_db_port *port,
                            struct ib_mad_recv_wc *mad_recv_wc)
 {
-       struct ib_mad_recv_buf *recv_buf;
-       struct ib_sa_mad *mad = (void *) mad_recv_wc->recv_buf.mad;
+       struct ib_sa_attr_cursor *cursor;
        struct ib_path_rec_info *path_info;
-       struct ib_path_rec ib_path, *path = NULL;
-       int i, attr_size, left, offset = 0;
 
-       attr_size = be16_to_cpu(mad->sa_hdr.attr_offset) * 8;
-       if (attr_size < sizeof ib_path)
+       cursor = ib_sa_create_cursor(mad_recv_wc);
+       if (IS_ERR(cursor))
                return;
 
+       path_info = kmalloc(sizeof *path_info, GFP_KERNEL);
+       if (!path_info)
+               goto free_cursor;
+
        down_write(&lock);
        port->update++;
-       list_for_each_entry(recv_buf, &mad_recv_wc->rmpp_list, list) {
-               for (i = 0; i < IB_MGMT_SA_DATA;) {
-                       mad = (struct ib_sa_mad *) recv_buf->mad;
-
-                       left = IB_MGMT_SA_DATA - i;
-                       if (left < sizeof ib_path) {
-                               /* copy first piece of the attribute */
-                               memcpy(&ib_path, &mad->data[i], left);
-                               path = &ib_path;
-                               offset = left;
-                               break;
-                       } else if (offset) {
-                               /* copy the second piece of the attribute */
-                               memcpy((void*) path + offset, &mad->data[i],
-                                      sizeof ib_path - offset);
-                               i += attr_size - offset;
-                               offset = 0;
-                       } else {
-                               path = (void *) &mad->data[i];
-                               i += attr_size;
-                       }
-
-                       if (!path->slid)
-                               goto unlock;
-
-                       path_info = kmalloc(sizeof *path_info, GFP_KERNEL);
-                       if (!path_info)
-                               goto unlock;
-
-                       ib_sa_unpack_attr(&path_info->rec, path,
-                                         IB_SA_ATTR_PATH_REC);
-
-                       if (insert_attr(&port->index, port->update,
-                                       path_info->rec.dgid.raw,
-                                       &path_info->cursor)) {
-                               kfree(path_info);
-                               goto unlock;
-                       }
-               }
+       while (ib_sa_get_next_attr(cursor, &path_info->rec)) {
+               if (insert_attr(&port->index, port->update,
+                               path_info->rec.dgid.raw,
+                               &path_info->cursor))
+                       break;
+
+               path_info = kmalloc(sizeof *path_info, GFP_KERNEL);
+               if (!path_info)
+                       break;
        }
-unlock:
+
        up_write(&lock);
+       kfree(path_info);
+free_cursor:
+       ib_sa_free_cursor(cursor);
 }
 
 static void recv_handler(struct ib_mad_agent *mad_agent,


_______________________________________________
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