Commit d4054239 authored by Christoph Hellwig's avatar Christoph Hellwig Committed by James Bottomley

[SCSI] sas: fix removal of devices behind expanders

We need to iterate over all children when removing and expander, else
stale objects will be around after host removal.  This fixes the oops
Eric Moore saw when removing and reloading mptsas.

Also don't try the scsi_remove_target call unless operating on an end
device.  The current unconditional call is harmless but confusing.
Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
Signed-off-by: default avatarJames Bottomley <James.Bottomley@SteelEye.com>
parent 745caf71
...@@ -687,7 +687,17 @@ sas_rphy_delete(struct sas_rphy *rphy) ...@@ -687,7 +687,17 @@ sas_rphy_delete(struct sas_rphy *rphy)
struct Scsi_Host *shost = dev_to_shost(parent->dev.parent); struct Scsi_Host *shost = dev_to_shost(parent->dev.parent);
struct sas_host_attrs *sas_host = to_sas_host_attrs(shost); 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); transport_remove_device(dev);
device_del(dev); device_del(dev);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment