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>
This commit is contained in:
Родитель
f90f0828e5
Коммит
e027bd36c1
|
@ -1878,7 +1878,9 @@ static void ata_eh_link_report(struct ata_link *link)
|
||||||
for (tag = 0; tag < ATA_MAX_QUEUE; tag++) {
|
for (tag = 0; tag < ATA_MAX_QUEUE; tag++) {
|
||||||
struct ata_queued_cmd *qc = __ata_qc_from_tag(ap, tag);
|
struct ata_queued_cmd *qc = __ata_qc_from_tag(ap, tag);
|
||||||
|
|
||||||
if (!(qc->flags & ATA_QCFLAG_FAILED) || qc->dev->link != link)
|
if (!(qc->flags & ATA_QCFLAG_FAILED) || qc->dev->link != link ||
|
||||||
|
((qc->flags & ATA_QCFLAG_QUIET) &&
|
||||||
|
qc->err_mask == AC_ERR_DEV))
|
||||||
continue;
|
continue;
|
||||||
if (qc->flags & ATA_QCFLAG_SENSE_VALID && !qc->err_mask)
|
if (qc->flags & ATA_QCFLAG_SENSE_VALID && !qc->err_mask)
|
||||||
continue;
|
continue;
|
||||||
|
|
|
@ -2767,8 +2767,8 @@ static unsigned int ata_scsi_pass_thru(struct ata_queued_cmd *qc)
|
||||||
*/
|
*/
|
||||||
qc->nbytes = scsi_bufflen(scmd);
|
qc->nbytes = scsi_bufflen(scmd);
|
||||||
|
|
||||||
/* request result TF */
|
/* request result TF and be quiet about device error */
|
||||||
qc->flags |= ATA_QCFLAG_RESULT_TF;
|
qc->flags |= ATA_QCFLAG_RESULT_TF | ATA_QCFLAG_QUIET;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
|
|
@ -221,6 +221,7 @@ enum {
|
||||||
ATA_QCFLAG_IO = (1 << 3), /* standard IO command */
|
ATA_QCFLAG_IO = (1 << 3), /* standard IO command */
|
||||||
ATA_QCFLAG_RESULT_TF = (1 << 4), /* result TF requested */
|
ATA_QCFLAG_RESULT_TF = (1 << 4), /* result TF requested */
|
||||||
ATA_QCFLAG_CLEAR_EXCL = (1 << 5), /* clear excl_link on completion */
|
ATA_QCFLAG_CLEAR_EXCL = (1 << 5), /* clear excl_link on completion */
|
||||||
|
ATA_QCFLAG_QUIET = (1 << 6), /* don't report device error */
|
||||||
|
|
||||||
ATA_QCFLAG_FAILED = (1 << 16), /* cmd failed and is owned by EH */
|
ATA_QCFLAG_FAILED = (1 << 16), /* cmd failed and is owned by EH */
|
||||||
ATA_QCFLAG_SENSE_VALID = (1 << 17), /* sense data valid */
|
ATA_QCFLAG_SENSE_VALID = (1 << 17), /* sense data valid */
|
||||||
|
|
Загрузка…
Ссылка в новой задаче