aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/ata
diff options
context:
space:
mode:
authorTejun Heo <htejun@gmail.com>2007-10-10 02:57:44 -0400
committerJeff Garzik <jeff@garzik.org>2007-10-15 15:24:54 -0400
commitf58db80267c24e15d959e372d23651a43443c5f3 (patch)
treebcbc79c4c4232b68a5a5b109f27083c2e55c64b1 /drivers/ata
parentf140f0f12fc8dc7264d2f97cbe663564e7d24f6d (diff)
libata: fix revalidation issuing after configuration commands
After commands which can change device configuration, EH is scheduled to revalidate and reconfigure the device. Host link was incorrectly used unconditionally when scheduling EH action. This resulted in bogus revalidation request and mismatched configuration between device and driver. Fix it. This bug was reported by Igor Durdanovic. Signed-off-by: Tejun Heo <htejun@gmail.com> Cc: Igor Durdanovic <idurdanovic@comcast.net> Signed-off-by: Jeff Garzik <jeff@garzik.org>
Diffstat (limited to 'drivers/ata')
-rw-r--r--drivers/ata/libata-scsi.c5
1 files changed, 3 insertions, 2 deletions
diff --git a/drivers/ata/libata-scsi.c b/drivers/ata/libata-scsi.c
index ea53e6a570b4..d63c81ed084f 100644
--- a/drivers/ata/libata-scsi.c
+++ b/drivers/ata/libata-scsi.c
@@ -1363,6 +1363,7 @@ nothing_to_do:
1363static void ata_scsi_qc_complete(struct ata_queued_cmd *qc) 1363static void ata_scsi_qc_complete(struct ata_queued_cmd *qc)
1364{ 1364{
1365 struct ata_port *ap = qc->ap; 1365 struct ata_port *ap = qc->ap;
1366 struct ata_eh_info *ehi = &qc->dev->link->eh_info;
1366 struct scsi_cmnd *cmd = qc->scsicmd; 1367 struct scsi_cmnd *cmd = qc->scsicmd;
1367 u8 *cdb = cmd->cmnd; 1368 u8 *cdb = cmd->cmnd;
1368 int need_sense = (qc->err_mask != 0); 1369 int need_sense = (qc->err_mask != 0);
@@ -1376,14 +1377,14 @@ static void ata_scsi_qc_complete(struct ata_queued_cmd *qc)
1376 case ATA_CMD_SET_FEATURES: 1377 case ATA_CMD_SET_FEATURES:
1377 if ((qc->tf.feature == SETFEATURES_WC_ON) || 1378 if ((qc->tf.feature == SETFEATURES_WC_ON) ||
1378 (qc->tf.feature == SETFEATURES_WC_OFF)) { 1379 (qc->tf.feature == SETFEATURES_WC_OFF)) {
1379 ap->link.eh_info.action |= ATA_EH_REVALIDATE; 1380 ehi->action |= ATA_EH_REVALIDATE;
1380 ata_port_schedule_eh(ap); 1381 ata_port_schedule_eh(ap);
1381 } 1382 }
1382 break; 1383 break;
1383 1384
1384 case ATA_CMD_INIT_DEV_PARAMS: /* CHS translation changed */ 1385 case ATA_CMD_INIT_DEV_PARAMS: /* CHS translation changed */
1385 case ATA_CMD_SET_MULTI: /* multi_count changed */ 1386 case ATA_CMD_SET_MULTI: /* multi_count changed */
1386 ap->link.eh_info.action |= ATA_EH_REVALIDATE; 1387 ehi->action |= ATA_EH_REVALIDATE;
1387 ata_port_schedule_eh(ap); 1388 ata_port_schedule_eh(ap);
1388 break; 1389 break;
1389 } 1390 }