Commit 534ead70 authored by Tejun Heo's avatar Tejun Heo Committed by Jeff Garzik

libata: retry FS IOs even if it has failed with AC_ERR_INVALID

libata currently doesn't retry if a command fails with AC_ERR_INVALID
assuming that retrying won't get it any further even if retried.
However, a failure may be classified as invalid through hardware
glitch (incorrect reading of the error register or firmware bug) and
there isn't whole lot to gain by not retrying as actually invalid
commands will be failed immediately.  Also, commands serving FS IOs
are extremely unlikely to be invalid.  Retry FS IOs even if it's
marked invalid.

Transient and incorrect invalid failure was seen while debugging
firmware related issue on Samsung n130 on bko#14314.

  http://bugzilla.kernel.org/show_bug.cgi?id=14314Signed-off-by: default avatarTejun Heo <tj@kernel.org>
Reported-by: default avatarJohannes Stezenbach <js@sig21.net>
Signed-off-by: default avatarJeff Garzik <jgarzik@redhat.com>
parent 24bc7347
...@@ -2028,8 +2028,9 @@ static void ata_eh_link_autopsy(struct ata_link *link) ...@@ -2028,8 +2028,9 @@ static void ata_eh_link_autopsy(struct ata_link *link)
qc->err_mask &= ~(AC_ERR_DEV | AC_ERR_OTHER); qc->err_mask &= ~(AC_ERR_DEV | AC_ERR_OTHER);
/* determine whether the command is worth retrying */ /* determine whether the command is worth retrying */
if (!(qc->err_mask & AC_ERR_INVALID) && if (qc->flags & ATA_QCFLAG_IO ||
((qc->flags & ATA_QCFLAG_IO) || qc->err_mask != AC_ERR_DEV)) (!(qc->err_mask & AC_ERR_INVALID) &&
qc->err_mask != AC_ERR_DEV))
qc->flags |= ATA_QCFLAG_RETRY; qc->flags |= ATA_QCFLAG_RETRY;
/* accumulate error info */ /* accumulate error info */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment