James Smart pointed out that if you insert and remove a HBA driver a few
times, eventually the system oopses.

The reason is that the transport classes all kfree their attribute
containers, but don't actually unregister them first (so we have freed
memory on the container list).  The attached should fix this.

James

===== drivers/scsi/scsi_transport_fc.c 1.15 vs edited =====
--- 1.15/drivers/scsi/scsi_transport_fc.c       2005-02-01 10:45:41 -06:00
+++ edited/drivers/scsi/scsi_transport_fc.c     2005-02-01 13:24:03 -06:00
@@ -846,6 +846,9 @@
 void fc_release_transport(struct scsi_transport_template *t)
 {
        struct fc_internal *i = to_fc_internal(t);
+
+       attribute_container_unregister(&i->t.target_attrs);
+       attribute_container_unregister(&i->t.host_attrs);
 
        kfree(i);
 }
===== drivers/scsi/scsi_transport_iscsi.c 1.3 vs edited =====
--- 1.3/drivers/scsi/scsi_transport_iscsi.c     2005-02-01 10:45:41 -06:00
+++ edited/drivers/scsi/scsi_transport_iscsi.c  2005-02-01 13:23:55 -06:00
@@ -356,6 +356,10 @@
 void iscsi_release_transport(struct scsi_transport_template *t)
 {
        struct iscsi_internal *i = to_iscsi_internal(t);
+
+       attribute_container_unregister(&i->t.target_attrs);
+       attribute_container_unregister(&i->t.host_attrs);
+
        kfree(i);
 }
 
===== drivers/scsi/scsi_transport_spi.c 1.24 vs edited =====
--- 1.24/drivers/scsi/scsi_transport_spi.c      2005-02-01 10:45:41 -06:00
+++ edited/drivers/scsi/scsi_transport_spi.c    2005-02-01 13:24:05 -06:00
@@ -921,6 +921,9 @@
 {
        struct spi_internal *i = to_spi_internal(t);
 
+       attribute_container_unregister(&i->t.target_attrs);
+       attribute_container_unregister(&i->t.host_attrs);
+
        kfree(i);
 }
 EXPORT_SYMBOL(spi_release_transport);


-
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to