aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTejun Heo <htejun@gmail.com>2007-10-26 03:19:26 -0400
committerJeff Garzik <jeff@garzik.org>2007-10-30 09:59:43 -0400
commite027bd36c146582cef382364e5c826db93d4427b (patch)
tree45f3d3db848a5bd44bcb2191db17cbfd30f4911a
parentf90f0828e57e97cb1ff19520d252882cfc6fb3c0 (diff)
libata: implement and use ATA_QCFLAG_QUIET
Implement ATA_QCFLAG_QUIET which indicates that there's no need to report if the command fails with AC_ERR_DEV and set it for passthrough commands. Combined with previous changes, this now makes device errors for all direct commands reported directly to the issuer without going through EH actions and reporting. Note that EH is still invoked after non-IO device errors to determine the nature of the error and resume command execution (some controller requires special care after error to continue). It just performs default maintenance after error, examines what's going on, realizes that it's none of its business and reports the command failure without logging any error messages. Signed-off-by: Tejun Heo <htejun@gmail.com> Signed-off-by: Jeff Garzik <jeff@garzik.org>
-rw-r--r--drivers/ata/libata-eh.c4
-rw-r--r--drivers/ata/libata-scsi.c4
-rw-r--r--include/linux/libata.h1
3 files changed, 6 insertions, 3 deletions
diff --git a/drivers/ata/libata-eh.c b/drivers/ata/libata-eh.c
index 3c6ad7d949c1..8d64f8fd8f1d 100644
--- a/drivers/ata/libata-eh.c
+++ b/drivers/ata/libata-eh.c
@@ -1878,7 +1878,9 @@ static void ata_eh_link_report(struct ata_link *link)
1878 for (tag = 0; tag < ATA_MAX_QUEUE; tag++) { 1878 for (tag = 0; tag < ATA_MAX_QUEUE; tag++) {
1879 struct ata_queued_cmd *qc = __ata_qc_from_tag(ap, tag); 1879 struct ata_queued_cmd *qc = __ata_qc_from_tag(ap, tag);
1880 1880
1881 if (!(qc->flags & ATA_QCFLAG_FAILED) || qc->dev->link != link) 1881 if (!(qc->flags & ATA_QCFLAG_FAILED) || qc->dev->link != link ||
1882 ((qc->flags & ATA_QCFLAG_QUIET) &&
1883 qc->err_mask == AC_ERR_DEV))
1882 continue; 1884 continue;
1883 if (qc->flags & ATA_QCFLAG_SENSE_VALID && !qc->err_mask) 1885 if (qc->flags & ATA_QCFLAG_SENSE_VALID && !qc->err_mask)
1884 continue; 1886 continue;
diff --git a/drivers/ata/libata-scsi.c b/drivers/ata/libata-scsi.c
index 6ef5ecb917ce..fc89590d3772 100644
--- a/drivers/ata/libata-scsi.c
+++ b/drivers/ata/libata-scsi.c
@@ -2767,8 +2767,8 @@ static unsigned int ata_scsi_pass_thru(struct ata_queued_cmd *qc)
2767 */ 2767 */
2768 qc->nbytes = scsi_bufflen(scmd); 2768 qc->nbytes = scsi_bufflen(scmd);
2769 2769
2770 /* request result TF */ 2770 /* request result TF and be quiet about device error */
2771 qc->flags |= ATA_QCFLAG_RESULT_TF; 2771 qc->flags |= ATA_QCFLAG_RESULT_TF | ATA_QCFLAG_QUIET;
2772 2772
2773 return 0; 2773 return 0;
2774 2774
diff --git a/include/linux/libata.h b/include/linux/libata.h
index 147ccc40c8af..1e277852ba42 100644
--- a/include/linux/libata.h
+++ b/include/linux/libata.h
@@ -221,6 +221,7 @@ enum {
221 ATA_QCFLAG_IO = (1 << 3), /* standard IO command */ 221 ATA_QCFLAG_IO = (1 << 3), /* standard IO command */
222 ATA_QCFLAG_RESULT_TF = (1 << 4), /* result TF requested */ 222 ATA_QCFLAG_RESULT_TF = (1 << 4), /* result TF requested */
223 ATA_QCFLAG_CLEAR_EXCL = (1 << 5), /* clear excl_link on completion */ 223 ATA_QCFLAG_CLEAR_EXCL = (1 << 5), /* clear excl_link on completion */
224 ATA_QCFLAG_QUIET = (1 << 6), /* don't report device error */
224 225
225 ATA_QCFLAG_FAILED = (1 << 16), /* cmd failed and is owned by EH */ 226 ATA_QCFLAG_FAILED = (1 << 16), /* cmd failed and is owned by EH */
226 ATA_QCFLAG_SENSE_VALID = (1 << 17), /* sense data valid */ 227 ATA_QCFLAG_SENSE_VALID = (1 << 17), /* sense data valid */