GIT: unionfs2-2.6.27.y: libata: retry FS IOs even if it has failed with AC_ERR_INVALID

Erez Zadok ezk at fsl.cs.sunysb.edu
Thu Aug 12 23:15:23 EDT 2010


commit ce58c0ab4bcf38482dfc095af0c4ed55a5a88698
Author: Tejun Heo <tj at kernel.org>
Date:   Thu Jan 14 16:18:09 2010 +0900

    libata: retry FS IOs even if it has failed with AC_ERR_INVALID
    
    commit 534ead709235b967b659947c55d9130873a432c4 upstream.
    
    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=14314
    
    Signed-off-by: Tejun Heo <tj at kernel.org>
    Reported-by: Johannes Stezenbach <js at sig21.net>
    Signed-off-by: Jeff Garzik <jgarzik at redhat.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh at suse.de>

diff --git a/drivers/ata/libata-eh.c b/drivers/ata/libata-eh.c
index 3882e7e..9358fa6 100644
--- a/drivers/ata/libata-eh.c
+++ b/drivers/ata/libata-eh.c
@@ -1901,8 +1901,9 @@ static void ata_eh_link_autopsy(struct ata_link *link)
 			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))
+		if (qc->flags & ATA_QCFLAG_IO ||
+		    (!(qc->err_mask & AC_ERR_INVALID) &&
+		     qc->err_mask != AC_ERR_DEV))
 			qc->flags |= ATA_QCFLAG_RETRY;
 
 		/* accumulate error info */


More information about the unionfs-cvs mailing list