mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-29 11:11:45 -04:00
[SCSI] libsas, libata: fix start of life for a sas ata_port
This changes the ordering of initialization and probing events from: 1/ allocate rphy in PORTE_BYTES_DMAED, DISCE_REVALIDATE_DOMAIN 2/ allocate ata_port and schedule port probe in DISCE_PROBE ...to: 1/ allocate ata_port in PORTE_BYTES_DMAED, DISCE_REVALIDATE_DOMAIN 2/ allocate rphy in PORTE_BYTES_DMAED, DISCE_REVALIDATE_DOMAIN 3/ schedule port probe in DISCE_PROBE This ordering prevents PHYE_SIGNAL_LOSS_EVENTS from sneaking in to destrory ata devices before they have been fully initialized: BUG: unable to handle kernel paging request at 0000000000003b10 IP: [<ffffffffa0053d7e>] sas_ata_end_eh+0x12/0x5e [libsas] ... [<ffffffffa004d1af>] sas_unregister_common_dev+0x78/0xc9 [libsas] [<ffffffffa004d4d4>] sas_unregister_dev+0x4f/0xad [libsas] [<ffffffffa004d5b1>] sas_unregister_domain_devices+0x7f/0xbf [libsas] [<ffffffffa004c487>] sas_deform_port+0x61/0x1b8 [libsas] [<ffffffffa004bed0>] sas_phye_loss_of_signal+0x29/0x2b [libsas] ...and kills the awkward "sata domain_device briefly existing in the domain without an ata_port" state. Reported-by: Michal Kosciowski <[email protected]> Signed-off-by: Dan Williams <[email protected]> Acked-by: Jeff Garzik <[email protected]> Signed-off-by: James Bottomley <[email protected]>
This commit is contained in:
parent
0f3fce5cc7
commit
b202445925
7 changed files with 54 additions and 48 deletions
|
|
@ -3839,18 +3839,25 @@ void ata_sas_port_stop(struct ata_port *ap)
|
|||
}
|
||||
EXPORT_SYMBOL_GPL(ata_sas_port_stop);
|
||||
|
||||
int ata_sas_async_port_init(struct ata_port *ap)
|
||||
/**
|
||||
* ata_sas_async_probe - simply schedule probing and return
|
||||
* @ap: Port to probe
|
||||
*
|
||||
* For batch scheduling of probe for sas attached ata devices, assumes
|
||||
* the port has already been through ata_sas_port_init()
|
||||
*/
|
||||
void ata_sas_async_probe(struct ata_port *ap)
|
||||
{
|
||||
int rc = ap->ops->port_start(ap);
|
||||
|
||||
if (!rc) {
|
||||
ap->print_id = atomic_inc_return(&ata_print_id);
|
||||
__ata_port_probe(ap);
|
||||
}
|
||||
|
||||
return rc;
|
||||
__ata_port_probe(ap);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(ata_sas_async_port_init);
|
||||
EXPORT_SYMBOL_GPL(ata_sas_async_probe);
|
||||
|
||||
int ata_sas_sync_probe(struct ata_port *ap)
|
||||
{
|
||||
return ata_port_probe(ap);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(ata_sas_sync_probe);
|
||||
|
||||
|
||||
/**
|
||||
* ata_sas_port_init - Initialize a SATA device
|
||||
|
|
@ -3867,12 +3874,10 @@ int ata_sas_port_init(struct ata_port *ap)
|
|||
{
|
||||
int rc = ap->ops->port_start(ap);
|
||||
|
||||
if (!rc) {
|
||||
ap->print_id = atomic_inc_return(&ata_print_id);
|
||||
rc = ata_port_probe(ap);
|
||||
}
|
||||
|
||||
return rc;
|
||||
if (rc)
|
||||
return rc;
|
||||
ap->print_id = atomic_inc_return(&ata_print_id);
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(ata_sas_port_init);
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue