aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/scsi
diff options
context:
space:
mode:
authorDan Williams <dan.j.williams@intel.com>2012-01-10 17:39:13 -0500
committerJames Bottomley <JBottomley@Parallels.com>2012-02-29 16:20:55 -0500
commit7d05919aad080074453de880822fe5805875645f (patch)
treedf78c12a7bfc9acaefd91d2a8852dca17c178790 /drivers/scsi
parent45c73b65194173e77030d5b95abe5b63a402d268 (diff)
[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>
Diffstat (limited to 'drivers/scsi')
-rw-r--r--drivers/scsi/libsas/sas_discover.c8
-rw-r--r--drivers/scsi/libsas/sas_port.c4
2 files changed, 7 insertions, 5 deletions
diff --git a/drivers/scsi/libsas/sas_discover.c b/drivers/scsi/libsas/sas_discover.c
index 789b50861bb9..b91866a8233b 100644
--- a/drivers/scsi/libsas/sas_discover.c
+++ b/drivers/scsi/libsas/sas_discover.c
@@ -299,12 +299,16 @@ void sas_unregister_dev(struct asd_sas_port *port, struct domain_device *dev)
299 } 299 }
300} 300}
301 301
302void sas_unregister_domain_devices(struct asd_sas_port *port) 302void sas_unregister_domain_devices(struct asd_sas_port *port, int gone)
303{ 303{
304 struct domain_device *dev, *n; 304 struct domain_device *dev, *n;
305 305
306 list_for_each_entry_safe_reverse(dev, n, &port->dev_list, dev_list_node) 306 list_for_each_entry_safe_reverse(dev, n, &port->dev_list, dev_list_node) {
307 if (gone)
308 set_bit(SAS_DEV_GONE, &dev->state);
307 sas_unregister_dev(port, dev); 309 sas_unregister_dev(port, dev);
310 }
311
308 list_for_each_entry_safe(dev, n, &port->disco_list, disco_list_node) 312 list_for_each_entry_safe(dev, n, &port->disco_list, disco_list_node)
309 sas_unregister_dev(port, dev); 313 sas_unregister_dev(port, dev);
310 314
diff --git a/drivers/scsi/libsas/sas_port.c b/drivers/scsi/libsas/sas_port.c
index 31adcd1b4191..59ee8a0a6ea9 100644
--- a/drivers/scsi/libsas/sas_port.c
+++ b/drivers/scsi/libsas/sas_port.c
@@ -167,9 +167,7 @@ void sas_deform_port(struct asd_sas_phy *phy, int gone)
167 dev->pathways--; 167 dev->pathways--;
168 168
169 if (port->num_phys == 1) { 169 if (port->num_phys == 1) {
170 if (dev && gone) 170 sas_unregister_domain_devices(port, gone);
171 set_bit(SAS_DEV_GONE, &dev->state);
172 sas_unregister_domain_devices(port);
173 sas_port_delete(port->port); 171 sas_port_delete(port->port);
174 port->port = NULL; 172 port->port = NULL;
175 } else { 173 } else {