ata FLUSHCACHE timeout errors? [patch]

Mark Powell M.S.Powell at salford.ac.uk
Thu Apr 16 09:52:15 UTC 2009


On Wed, 15 Apr 2009, James R. Van Artsdalen wrote:

> James R. Van Artsdalen wrote:
>> I am getting many FLUSHCACHE timeout errors during "zfs recv" operations.
>
> This patch fixes this. PR to be filed.
> In addition this causes any ata request that times out to print the
> timeout, since it's going to be the timeout itself that's likely wrong.

This is well known and had been repeated ad. inf.. Problem is, it never 
got addressed:

http://wiki.freebsd.org/JeremyChadwick/ATA_issues_and_troubleshooting

   Attached is an 8-CURRENT patch which makes the ata timeout a tuneable. 
Shamelessy ripped off the FreeNAS patch on the above url.
   Cheers.

-- 
Mark Powell - UNIX System Administrator - The University of Salford
Information & Learning Services, Clifford Whitworth Building,
Salford University, Manchester, M5 4WT, UK.
Tel: +44 161 295 6843  Fax: +44 161 295 5888  www.pgp.com for PGP key
-------------- next part --------------
--- ata-all.c.orig	2009-03-19 14:00:36.000000000 +0000
+++ ata-all.c	2009-03-19 14:04:55.000000000 +0000
@@ -75,6 +75,7 @@
 uma_zone_t ata_request_zone;
 uma_zone_t ata_composite_zone;
 int ata_wc = 1;
+int ata_to = 5;
 int ata_setmax = 0;
 int ata_dma_check_80pin = 1;
 
@@ -97,6 +98,9 @@
 TUNABLE_INT("hw.ata.wc", &ata_wc);
 SYSCTL_INT(_hw_ata, OID_AUTO, wc, CTLFLAG_RDTUN, &ata_wc, 0,
 	   "ATA disk write caching");
+TUNABLE_INT("hw.ata.to", &ata_to);
+SYSCTL_INT(_hw_ata, OID_AUTO, to, CTLFLAG_RW, &ata_to, 0,
+	   "ATA disk timeout vis-a-vis power-saving");
 TUNABLE_INT("hw.ata.setmax", &ata_setmax);
 SYSCTL_INT(_hw_ata, OID_AUTO, setmax, CTLFLAG_RDTUN, &ata_setmax, 0,
 	   "ATA disk set max native address");
--- ata-all.h.orig	2009-03-19 14:00:36.000000000 +0000
+++ ata-all.h	2009-03-19 14:05:31.000000000 +0000
@@ -545,6 +545,7 @@
 extern struct intr_config_hook *ata_delayed_attach;
 extern devclass_t ata_devclass;
 extern int ata_wc;
+extern int ata_to;
 extern int ata_setmax;
 extern int ata_dma_check_80pin;
 
--- ata-disk.c.orig	2009-03-19 14:00:36.000000000 +0000
+++ ata-disk.c	2009-03-19 14:06:41.000000000 +0000
@@ -230,7 +230,7 @@
     }
     request->dev = dev;
     request->flags = ATA_R_CONTROL;
-    request->timeout = 5;
+    request->timeout = ata_to;
     request->retries = 1;
     request->callback = ad_power_callback;
     request->u.ata.command = ATA_STANDBY_IMMEDIATE;
@@ -265,7 +265,7 @@
 	request->timeout = 31;
     }
     else {
-	request->timeout = 5;
+	request->timeout = ata_to;
     }
     request->retries = 2;
     request->data = bp->bio_data;
@@ -460,7 +460,7 @@
     request->u.ata.count = 0;
     request->u.ata.feature = 0;
     request->flags = ATA_R_CONTROL | ATA_R_QUIET;
-    request->timeout = 5;
+    request->timeout = ata_to;
     request->retries = 0;
     ata_queue_request(request);
     if (request->status & ATA_S_ERROR)
@@ -479,7 +479,7 @@
     request->u.ata.count = 1;
     request->u.ata.feature = 0;
     request->flags = ATA_R_CONTROL;
-    request->timeout = 5;
+    request->timeout = ata_to;
     request->retries = 0;
     ata_queue_request(request);
     if (request->status & ATA_S_ERROR)


More information about the freebsd-current mailing list