]> err.no Git - linux-2.6/blobdiff - drivers/scsi/scsi_transport_sas.c
[SCSI] sem2mutex: scsi_transport_spi.c
[linux-2.6] / drivers / scsi / scsi_transport_sas.c
index 0cc766a9aa6585a5ffef2292b355478cd31b4235..e950435a11d8d6bc264e04e16b354dae07d7a6ad 100644 (file)
@@ -26,6 +26,8 @@
 #include <linux/init.h>
 #include <linux/module.h>
 #include <linux/err.h>
+#include <linux/slab.h>
+#include <linux/string.h>
 
 #include <scsi/scsi_device.h>
 #include <scsi/scsi_host.h>
@@ -685,7 +687,17 @@ sas_rphy_delete(struct sas_rphy *rphy)
        struct Scsi_Host *shost = dev_to_shost(parent->dev.parent);
        struct sas_host_attrs *sas_host = to_sas_host_attrs(shost);
 
-       scsi_remove_target(dev);
+       switch (rphy->identify.device_type) {
+       case SAS_END_DEVICE:
+               scsi_remove_target(dev);
+               break;
+       case SAS_EDGE_EXPANDER_DEVICE:
+       case SAS_FANOUT_EXPANDER_DEVICE:
+               device_for_each_child(dev, NULL, do_sas_phy_delete);
+               break;
+       default:
+               break;
+       }
 
        transport_remove_device(dev);
        device_del(dev);
@@ -695,6 +707,8 @@ sas_rphy_delete(struct sas_rphy *rphy)
        list_del(&rphy->list);
        spin_unlock(&sas_host->lock);
 
+       parent->rphy = NULL;
+
        put_device(&parent->dev);
 }
 EXPORT_SYMBOL(sas_rphy_delete);