libata: fix PMP initialization
PATCH 1/1 libata: fix PMP initialization
Commit 842faa6c1a1d6faddf3377948e5cf214812c6c90 fixed error handling during attach by not committing detected device class to dev->class while attaching a new device. However, this change missed the PMP class check in the configuration loop causing a new PMP device to go through ata_dev_configure() as if it were an ATA or ATAPI device.
As PMP device doesn't have a regular IDENTIFY data, this makes ata_dev_configure() tries to configure a PMP device using an invalid data. For the most part, it wasn't too harmful and went unnoticed but this ends up clearing dev->flags which may have ATA_DFLAG_AN set by sata_pmp_attach(). This means that SATA_PMP_FEAT_NOTIFY ends up being disabled on PMPs and on PMPs which honor the flag breaks hotplug support.
This problem was discovered and reported by Ethan Hsiao.
--- drivers/ata/libata-eh.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
drivers/ata/libata-eh.c +4 -2
@@ -2981,12 +2981,14 @@ static int ata_eh_revalidate_and_attach(struct ata_link *link,* device detection messages backwards. */ ata_for_each_dev (dev, link,ALL ) { -if (!(new_mask & (1 << dev->devno)) || - dev->class ==ATA_DEV_PMP ) +if (!(new_mask & (1 << dev->devno)))continue ; dev->class = ehc->classes[dev->devno]; +if (dev->class ==ATA_DEV_PMP ) +continue ; + ehc->i.flags |=ATA_EHI_PRINTINFO ; rc =ata_dev_configure (dev); ehc->i.flags &= ~ATA_EHI_PRINTINFO ;
Jeff Garzik
AppliedQuoted 14 lines · Tejun Heo
Commit
842faa6c1a1d6faddf3377948e5cf214812c6c90fixed error handling during attach by not committing detected device class todev->classwhile attaching a new device. However, this change missed the PMP class check in the configuration loop causing a new PMP device to go throughata_dev_configure()as if it were an ATA or ATAPI device.As PMP device doesn't have a regular IDENTIFY data, this makes
ata_dev_configure()tries to configure a PMP device using an invalid data. For the most part, it wasn't too harmful and went unnoticed but this ends up clearingdev->flagswhich may haveATA_DFLAG_ANset bysata_pmp_attach(). This means thatSATA_PMP_FEAT_NOTIFYends up being disabled on PMPs and on PMPs which honor the flag breaks hotplug support.
Quoted 8 lines
This problem was discovered and reported by Ethan Hsiao.
Signed-off-by Tejun Heo<[email protected]>Reported-by Ethan Hsiao<[email protected]>--- drivers/ata/libata-eh.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
applied