diff options
author | Mark Lord <liml@rtr.ca> | 2008-04-23 22:36:25 -0400 |
---|---|---|
committer | Jeff Garzik <jgarzik@redhat.com> | 2008-04-25 01:11:37 -0400 |
commit | a6116c9e60978a6deaa20691c67ffed727e50df1 (patch) | |
tree | 39d51e37b3d953ae9573e7418293ba8696efa133 /drivers/ata | |
parent | 1dc55e876182a13dcc5991c3aab893f38455d8a7 (diff) |
libata-eh set tf flags in NCQ EH result_tf
Fix mis-reporting of NCQ errors by ensuring that result_tf->flags
is properly initialized in libata-eh. This allows ata_gen_ata_sense()
to report the failed block number correctly to SCSI after a media error
during NCQ.
This patch may also be a candidate for backporting to earlier kernels.
Without this fix, SCSI will fail I/O on the entire request rather
than just the bad sector. That can be bad for a request that was
merged from many independent read reads from different tasks.
Signed-off-by: Mark Lord <mlord@pobox.com>
Signed-off-by: Jeff Garzik <jgarzik@redhat.com>
Diffstat (limited to 'drivers/ata')
-rw-r--r-- | drivers/ata/libata-eh.c | 1 |
1 files changed, 1 insertions, 0 deletions
diff --git a/drivers/ata/libata-eh.c b/drivers/ata/libata-eh.c index d94359a24d41..61dcd0026c64 100644 --- a/drivers/ata/libata-eh.c +++ b/drivers/ata/libata-eh.c | |||
@@ -1402,6 +1402,7 @@ static void ata_eh_analyze_ncq_error(struct ata_link *link) | |||
1402 | /* we've got the perpetrator, condemn it */ | 1402 | /* we've got the perpetrator, condemn it */ |
1403 | qc = __ata_qc_from_tag(ap, tag); | 1403 | qc = __ata_qc_from_tag(ap, tag); |
1404 | memcpy(&qc->result_tf, &tf, sizeof(tf)); | 1404 | memcpy(&qc->result_tf, &tf, sizeof(tf)); |
1405 | qc->result_tf.flags = ATA_TFLAG_ISADDR | ATA_TFLAG_LBA | ATA_TFLAG_LBA48; | ||
1405 | qc->err_mask |= AC_ERR_DEV | AC_ERR_NCQ; | 1406 | qc->err_mask |= AC_ERR_DEV | AC_ERR_NCQ; |
1406 | ehc->i.err_mask &= ~AC_ERR_DEV; | 1407 | ehc->i.err_mask &= ~AC_ERR_DEV; |
1407 | } | 1408 | } |