Russell King hit a case where quantisation errors accumulated such that the cycle time was shorter than rather than equal to the active/recovery time. The code already knows how to stretch times to fit the cycle time but does not know about the reverse. Signed-off-by: Alan Cox <alan@xxxxxxxxxx> diff -u --new-file --recursive --exclude-from /usr/src/exclude linux.vanilla-2.6.21-rc6-mm1/drivers/ata/libata-core.c linux-2.6.21-rc6-mm1/drivers/ata/libata-core.c --- linux.vanilla-2.6.21-rc6-mm1/drivers/ata/libata-core.c 2007-04-12 14:15:03.000000000 +0100 +++ linux-2.6.21-rc6-mm1/drivers/ata/libata-core.c 2007-04-23 10:47:49.543967256 +0100 @@ -2405,6 +2619,12 @@ t->active += (t->cycle - (t->active + t->recover)) / 2; t->recover = t->cycle - t->active; } + + /* In a few cases quantisation may produce enough errors to + leave t->cycle too low for the sum of active and recovery + if so we must correct this */ + if (t->active + t->recover > t->cycle) + t->cycle = t->active + t->recover; return 0; } - To unsubscribe from this list: send the line "unsubscribe linux-ide" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html