SDP doesn't remove cached SA path records if the device is removed.
Minor nit: flush_workqueue() doesn't need to be called before
destroy_workqueue().

Signed-off-by: Ralph Campbell <[EMAIL PROTECTED]>

Index: sdp_proto.h
===================================================================
--- sdp_proto.h (revision 5193)
+++ sdp_proto.h (working copy)
@@ -405,6 +405,8 @@
 
 void sdp_link_addr_cleanup(void);
 
+void sdp_link_device_remove_one(struct ib_device *device);
+
 /*
  * Function types
  */
Index: sdp_conn.c
===================================================================
--- sdp_conn.c  (revision 5193)
+++ sdp_conn.c  (working copy)
@@ -178,8 +178,8 @@
        }
 
        sdp_conn_inet_error(conn, error);
-       return;
 }
+
 /*
  * sdp_inet_accept_q_put - put a conn into a listen conn's accept Q.
  */
@@ -1861,6 +1861,8 @@
 
        ib_destroy_cm_id(hca->listen_id);
 
+       sdp_link_device_remove_one(device);
+
        list_for_each_entry_safe(port, tmp, &hca->port_list, list) {
                list_del(&port->list);
                kfree(port);
Index: sdp_link.c
===================================================================
--- sdp_link.c  (revision 5193)
+++ sdp_link.c  (working copy)
@@ -234,9 +234,9 @@
 static void sdp_path_info_destroy(struct sdp_path_info *info, int status)
 {
        struct sdp_path_wait *wait, *tmp;
-       /* TODO: replace by list_del once we have proper locking */
-       list_del_init(&info->info_list);
 
+       list_del(&info->info_list);
+
        list_for_each_entry_safe(wait, tmp, &info->wait_list, list)
                sdp_path_wait_complete(wait, info, status);
 
@@ -747,6 +747,24 @@
 }
 
 /*
+ * Remove any cached path information for the given device.
+ */
+void sdp_link_device_remove_one(struct ib_device *device)
+{
+       struct sdp_path_info *info;
+
+       down(&sdp_link_mutex);
+
+       list_for_each_entry(info, &info_list, info_list)
+               if (info->ca == device) {
+                       sdp_path_info_destroy(info, -ENODEV);
+                       break;
+               }
+
+       up(&sdp_link_mutex);
+}
+
+/*
  * primary initialization/cleanup functions
  */
 static struct packet_type sdp_arp_type = {
@@ -829,7 +847,6 @@
         * destroy work queue
         */
        cancel_delayed_work(&link_timer);
-       flush_workqueue(link_wq);
        destroy_workqueue(link_wq);
        /*
         * clear objects

-- 
Ralph Campbell <[EMAIL PROTECTED]>

_______________________________________________
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