[SCSI] libsas: mark all domain devices gone if root port disappears
If the top level expander is hot removed, mark all child devices as gone before unregistration to short circuit futile recovery. Signed-off-by: Dan Williams <dan.j.williams@intel.com> Signed-off-by: James Bottomley <JBottomley@Parallels.com>
This commit is contained in:

committed by
James Bottomley

parent
45c73b6519
commit
7d05919aad
@@ -299,12 +299,16 @@ void sas_unregister_dev(struct asd_sas_port *port, struct domain_device *dev)
|
||||
}
|
||||
}
|
||||
|
||||
void sas_unregister_domain_devices(struct asd_sas_port *port)
|
||||
void sas_unregister_domain_devices(struct asd_sas_port *port, int gone)
|
||||
{
|
||||
struct domain_device *dev, *n;
|
||||
|
||||
list_for_each_entry_safe_reverse(dev, n, &port->dev_list, dev_list_node)
|
||||
list_for_each_entry_safe_reverse(dev, n, &port->dev_list, dev_list_node) {
|
||||
if (gone)
|
||||
set_bit(SAS_DEV_GONE, &dev->state);
|
||||
sas_unregister_dev(port, dev);
|
||||
}
|
||||
|
||||
list_for_each_entry_safe(dev, n, &port->disco_list, disco_list_node)
|
||||
sas_unregister_dev(port, dev);
|
||||
|
||||
|
@@ -167,9 +167,7 @@ void sas_deform_port(struct asd_sas_phy *phy, int gone)
|
||||
dev->pathways--;
|
||||
|
||||
if (port->num_phys == 1) {
|
||||
if (dev && gone)
|
||||
set_bit(SAS_DEV_GONE, &dev->state);
|
||||
sas_unregister_domain_devices(port);
|
||||
sas_unregister_domain_devices(port, gone);
|
||||
sas_port_delete(port->port);
|
||||
port->port = NULL;
|
||||
} else {
|
||||
|
Reference in New Issue
Block a user