[PATCH] Fix cdrom error handling in 2.6

Erik Andersen
2003-08-23T01:21:57Z

In both 2.4 and in 2.6, error handling for bad cdrom media is
wrong. And it is my fault I'm afraid, since I botched an earlier
fix for the problem by putting the fix in the wrong spot.

My kids have a "Jumpstart Toddlers" cd they have long since
completely killed, which makes a great test disc. Without this
fix, the best time projection I can get for completing a dd type
sector copy is about 2 years... Most of that is spent thrashing
about in kernel space trying to re-read sectors we already know
are not correctable.... After the fix, I was able to rip a copy
the CD (or rather muddle through it getting lots of EIO errors)
in about 15 minutes.

Attached is the fix for 2.6.x,

-Erik

--
Erik B. Andersen http://codepoet-consulting.com/
--This message was written using 73% post-consumer electrons--

--- linux-2.6.0-test3/drivers/ide/ide-cd.c.orig 2003-08-22 19:04:36.000000000 -0600
+++ linux-2.6.0-test3/drivers/ide/ide-cd.c 2003-08-22 19:04:49.000000000 -0600
@@ -794,16 +794,16 @@
request or data protect error.*/
ide_dump_status (drive, "command error", stat);
do_end_request = 1;
- } else if ((err & ~ABRT_ERR) != 0) {
- /* Go to the default handler
- for other errors. */
- DRIVER(drive)->error(drive, "cdrom_decode_status",stat);
- return 1;
} else if (sense_key == MEDIUM_ERROR) {
/* No point in re-trying a zillion times on a bad
* sector... If we got here the error is not correctable */
ide_dump_status (drive, "media error (bad sector)", stat);
do_end_request = 1;
+ } else if ((err & ~ABRT_ERR) != 0) {
+ /* Go to the default handler
+ for other errors. */
+ DRIVER(drive)->error(drive, "cdrom_decode_status",stat);
+ return 1;
} else if ((++rq->errors > ERROR_MAX)) {
/* We've racked up too many retries. Abort. */
do_end_request = 1;