libata: add no penalty retry request for EH device handling routines
authorTejun Heo <tj@kernel.org>
Thu, 29 Jan 2009 11:31:35 +0000 (20:31 +0900)
committerJeff Garzik <jgarzik@redhat.com>
Tue, 3 Feb 2009 04:04:19 +0000 (23:04 -0500)
Let -EAGAIN from EH device handling routines trigger EH retry without
consuming its tries count.  This will be used to implement link SPD
horkage which requires hardreset to adjust SPD without affecting other
EH decisions.  As it bypasses the forward progress guarantee provided
by the tries count, the requester is responsible for ensuring forward
progress.

Signed-off-by: Tejun Heo <tj@kernel.org>
Signed-off-by: Jeff Garzik <jgarzik@redhat.com>
drivers/ata/libata-eh.c

index caa1e9fde3c9e921593cad165b14081e4313b5fb..ce2ef04753390b2c95dacd591662efd3c1800ebb 100644 (file)
@@ -3035,7 +3035,11 @@ static int ata_eh_handle_dev_fail(struct ata_device *dev, int err)
 {
        struct ata_eh_context *ehc = &dev->link->eh_context;
 
-       ehc->tries[dev->devno]--;
+       /* -EAGAIN from EH routine indicates retry without prejudice.
+        * The requester is responsible for ensuring forward progress.
+        */
+       if (err != -EAGAIN)
+               ehc->tries[dev->devno]--;
 
        switch (err) {
        case -ENODEV: