Patchwork [#upstream-fixes] libata: fix PMP initialization

login
register
mail settings
Submitter Tejun Heo
Date Oct. 15, 2009, 2:37 p.m.
Message ID <4AD733AC.4020808@kernel.org>
Download mbox | patch
Permalink /patch/36116/
State Not Applicable
Delegated to: David Miller
Headers show

Comments

Tejun Heo - Oct. 15, 2009, 2:37 p.m.
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.

Signed-off-by: Tejun Heo <tj@kernel.org>
Reported-by: Ethan Hsiao <ethanhsiao@jmicron.com>
Cc: stable@kernel.org
---
 drivers/ata/libata-eh.c |    6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

--
To unsubscribe from this list: send the line "unsubscribe linux-ide" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Jeff Garzik - Oct. 16, 2009, 10:27 a.m.
On 10/15/2009 10:37 AM, Tejun Heo wrote:
> 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.
>
> Signed-off-by: Tejun Heo<tj@kernel.org>
> Reported-by: Ethan Hsiao<ethanhsiao@jmicron.com>
> Cc: stable@kernel.org
> ---
>   drivers/ata/libata-eh.c |    6 ++++--
>   1 file changed, 4 insertions(+), 2 deletions(-)

applied


--
To unsubscribe from this list: send the line "unsubscribe linux-ide" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Patch

diff --git a/drivers/ata/libata-eh.c b/drivers/ata/libata-eh.c
index 0a97822..bba2ae5 100644
--- a/drivers/ata/libata-eh.c
+++ b/drivers/ata/libata-eh.c
@@ -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;