[SCSI] libsas: async ata scanning
libsas ata error handling is already async but this does not help the scan case. Move initial link recovery out from under host->scan_mutex, and delay synchronization with eh until after all port probe/recovery work has been queued. Device ordering is maintained with scan order by still calling sas_rphy_add() in order of domain discovery. Since we now scan the domain list when invoking libata-eh we need to be careful to check for fully initialized ata ports. Acked-by: Jack Wang <jack_wang@usish.com> Acked-by: Jeff Garzik <jgarzik@redhat.com> 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
92625f9bff
commit
9508a66f89
@@ -207,22 +207,22 @@ static void sas_probe_devices(struct work_struct *work)
|
||||
|
||||
clear_bit(DISCE_PROBE, &port->disc.pending);
|
||||
|
||||
list_for_each_entry_safe(dev, n, &port->disco_list, disco_list_node) {
|
||||
int err;
|
||||
|
||||
/* devices must be domain members before link recovery and probe */
|
||||
list_for_each_entry(dev, &port->disco_list, disco_list_node) {
|
||||
spin_lock_irq(&port->dev_list_lock);
|
||||
list_add_tail(&dev->dev_list_node, &port->dev_list);
|
||||
spin_unlock_irq(&port->dev_list_lock);
|
||||
}
|
||||
|
||||
sas_probe_sata(port);
|
||||
|
||||
list_for_each_entry_safe(dev, n, &port->disco_list, disco_list_node) {
|
||||
int err;
|
||||
|
||||
err = sas_rphy_add(dev->rphy);
|
||||
|
||||
if (err) {
|
||||
SAS_DPRINTK("%s: for %s device %16llx returned %d\n",
|
||||
__func__, dev->parent ? "exp-attached" :
|
||||
"direct-attached",
|
||||
SAS_ADDR(dev->sas_addr), err);
|
||||
sas_unregister_dev(port, dev);
|
||||
} else
|
||||
if (err)
|
||||
sas_fail_probe(dev, __func__, err);
|
||||
else
|
||||
list_del_init(&dev->disco_list_node);
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user