aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/ata
diff options
context:
space:
mode:
authorTejun Heo <tj@kernel.org>2011-05-25 06:23:56 -0400
committerJeff Garzik <jgarzik@pobox.com>2011-07-23 17:57:36 -0400
commit8ea7645c5a949f9d0ea86edc0778713b5e63ab74 (patch)
tree997f2828b26aa532284ce2cf96c03e951f1fb599 /drivers/ata
parent5b933e6340ac652fb1800480744ea8c9fa591bbf (diff)
libata: leave port thawed after reset failure
libata EH intentionally left a port frozen if it failed ata_eh_reset(). The intention was avoiding continuous loop of resets when the controller or attached device is flaky and reporting spurious hotplug events. Once port enters this state, it can be recovered with manual rescan, which seemed reasonable. However, outside of my convoluted test setup, there have been very few reports justifying this choice while there have been more cases where the automatic freezing of the port after hotplug attempt of a faulty device caused confusion and led to unnecessary resets. This patch changes the behavior so that the port is thawed after reset failure. This change doesn't necessarily solve but makes it easier and more intuitive to work around hotplug related problems (ie. re-pluggin or power cycling the device) as reported in the followings. https://bugzilla.kernel.org/show_bug.cgi?id=34712 http://thread.gmane.org/gmane.linux.kernel/1123265/focus=49548 Signed-off-by: Tejun Heo <tj@kernel.org> Reported-by: Reartes Guillermo <rtguille@gmail.com> Reported-by: Bruce Stenning <b.stenning@indigovision.com> Signed-off-by: Jeff Garzik <jgarzik@pobox.com>
Diffstat (limited to 'drivers/ata')
-rw-r--r--drivers/ata/libata-eh.c11
1 files changed, 10 insertions, 1 deletions
diff --git a/drivers/ata/libata-eh.c b/drivers/ata/libata-eh.c
index 16fa45755c18..ed16fbedaabd 100644
--- a/drivers/ata/libata-eh.c
+++ b/drivers/ata/libata-eh.c
@@ -2883,8 +2883,17 @@ int ata_eh_reset(struct ata_link *link, int classify,
2883 sata_scr_read(link, SCR_STATUS, &sstatus)) 2883 sata_scr_read(link, SCR_STATUS, &sstatus))
2884 rc = -ERESTART; 2884 rc = -ERESTART;
2885 2885
2886 if (rc == -ERESTART || try >= max_tries) 2886 if (rc == -ERESTART || try >= max_tries) {
2887 /*
2888 * Thaw host port even if reset failed, so that the port
2889 * can be retried on the next phy event. This risks
2890 * repeated EH runs but seems to be a better tradeoff than
2891 * shutting down a port after a botched hotplug attempt.
2892 */
2893 if (ata_is_host_link(link))
2894 ata_eh_thaw_port(ap);
2887 goto out; 2895 goto out;
2896 }
2888 2897
2889 now = jiffies; 2898 now = jiffies;
2890 if (time_before(now, deadline)) { 2899 if (time_before(now, deadline)) {