forked from Minki/linux
libata: implement ATA_QCFLAG_RETRY
Currently whether a command should be retried after failure is determined inside ata_eh_finish(). Add ATA_QCFLAG_RETRY and move the logic into ata_eh_autopsy(). This makes things clearer and helps extending retry determination logic. Signed-off-by: Tejun Heo <htejun@gmail.com> Signed-off-by: Jeff Garzik <jeff@garzik.org>
This commit is contained in:
parent
a5987e0a1b
commit
03faab7827
@ -1785,6 +1785,11 @@ static void ata_eh_link_autopsy(struct ata_link *link)
|
||||
if (qc->flags & ATA_QCFLAG_SENSE_VALID)
|
||||
qc->err_mask &= ~(AC_ERR_DEV | AC_ERR_OTHER);
|
||||
|
||||
/* determine whether the command is worth retrying */
|
||||
if (!(qc->err_mask & AC_ERR_INVALID) &&
|
||||
((qc->flags & ATA_QCFLAG_IO) || qc->err_mask != AC_ERR_DEV))
|
||||
qc->flags |= ATA_QCFLAG_RETRY;
|
||||
|
||||
/* accumulate error info */
|
||||
ehc->i.dev = qc->dev;
|
||||
all_err_mask |= qc->err_mask;
|
||||
@ -2783,18 +2788,11 @@ void ata_eh_finish(struct ata_port *ap)
|
||||
/* FIXME: Once EH migration is complete,
|
||||
* generate sense data in this function,
|
||||
* considering both err_mask and tf.
|
||||
*
|
||||
* There's no point in retrying invalid
|
||||
* (detected by libata) and non-IO device
|
||||
* errors (rejected by device). Finish them
|
||||
* immediately.
|
||||
*/
|
||||
if ((qc->err_mask & AC_ERR_INVALID) ||
|
||||
(!(qc->flags & ATA_QCFLAG_IO) &&
|
||||
qc->err_mask == AC_ERR_DEV))
|
||||
ata_eh_qc_complete(qc);
|
||||
else
|
||||
if (qc->flags & ATA_QCFLAG_RETRY)
|
||||
ata_eh_qc_retry(qc);
|
||||
else
|
||||
ata_eh_qc_complete(qc);
|
||||
} else {
|
||||
if (qc->flags & ATA_QCFLAG_SENSE_VALID) {
|
||||
ata_eh_qc_complete(qc);
|
||||
|
@ -224,6 +224,7 @@ enum {
|
||||
ATA_QCFLAG_RESULT_TF = (1 << 4), /* result TF requested */
|
||||
ATA_QCFLAG_CLEAR_EXCL = (1 << 5), /* clear excl_link on completion */
|
||||
ATA_QCFLAG_QUIET = (1 << 6), /* don't report device error */
|
||||
ATA_QCFLAG_RETRY = (1 << 7), /* retry after failure */
|
||||
|
||||
ATA_QCFLAG_FAILED = (1 << 16), /* cmd failed and is owned by EH */
|
||||
ATA_QCFLAG_SENSE_VALID = (1 << 17), /* sense data valid */
|
||||
|
Loading…
Reference in New Issue
Block a user