[PATCH] libata: fix class handling in ata_bus_probe()
authorTejun Heo <htejun@gmail.com>
Sun, 12 Mar 2006 16:57:01 +0000 (01:57 +0900)
committerJeff Garzik <jeff@garzik.org>
Sun, 12 Mar 2006 17:49:45 +0000 (12:49 -0500)
ata_bus_probe() didn't set classes[] properly for port disabled case
of ->phy_reset() compatibility path.  This patch moves classes[]
initialization and normalization out of ->probe_reset block such that
it applies to both ->probe_reset and ->phy_reset paths.

Signed-off-by: Tejun Heo <htejun@gmail.com>
Signed-off-by: Jeff Garzik <jeff@garzik.org>
drivers/scsi/libata-core.c

index 42d43b55fb8f6e0741d7496f2f1c97d8aafceeab..c17df3f22fd15a3c420b1fce6908c510e3881119 100644 (file)
@@ -1344,32 +1344,30 @@ static int ata_bus_probe(struct ata_port *ap)
 
        ata_port_probe(ap);
 
-       /* reset */
-       if (ap->ops->probe_reset) {
-               for (i = 0; i < ATA_MAX_DEVICES; i++)
-                       classes[i] = ATA_DEV_UNKNOWN;
+       /* reset and determine device classes */
+       for (i = 0; i < ATA_MAX_DEVICES; i++)
+               classes[i] = ATA_DEV_UNKNOWN;
 
+       if (ap->ops->probe_reset) {
                rc = ap->ops->probe_reset(ap, classes);
                if (rc) {
                        printk("ata%u: reset failed (errno=%d)\n", ap->id, rc);
                        return rc;
                }
-
-               for (i = 0; i < ATA_MAX_DEVICES; i++)
-                       if (classes[i] == ATA_DEV_UNKNOWN)
-                               classes[i] = ATA_DEV_NONE;
        } else {
                ap->ops->phy_reset(ap);
 
-               for (i = 0; i < ATA_MAX_DEVICES; i++) {
-                       if (!(ap->flags & ATA_FLAG_PORT_DISABLED))
+               if (!(ap->flags & ATA_FLAG_PORT_DISABLED))
+                       for (i = 0; i < ATA_MAX_DEVICES; i++)
                                classes[i] = ap->device[i].class;
-                       else
-                               ap->device[i].class = ATA_DEV_UNKNOWN;
-               }
+
                ata_port_probe(ap);
        }
 
+       for (i = 0; i < ATA_MAX_DEVICES; i++)
+               if (classes[i] == ATA_DEV_UNKNOWN)
+                       classes[i] = ATA_DEV_NONE;
+
        /* read IDENTIFY page and configure devices */
        for (i = 0; i < ATA_MAX_DEVICES; i++) {
                struct ata_device *dev = &ap->device[i];