diff options
author | Alan Cox <alan@lxorguk.ukuu.org.uk> | 2006-06-25 08:47:44 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@g5.osdl.org> | 2006-06-25 13:01:06 -0400 |
commit | dbe217af3be08346f4b1abb885c2d9ec29c98fac (patch) | |
tree | 493ee2547ba3095d7aa468d6ddffc1a82f18ce56 /include/linux | |
parent | 8e3a67a99231f9f3f476bc3449e93c9a6a17f2e0 (diff) |
[PATCH] IDE CD end-of media error fix
This is a patch from Alan that fixes a real ide-cd.c regression causing
bogus "Media Check" failures for perfectly valid Fedora install ISOs, on
certain CD-ROM drives.
This is a forward port to 2.6.16 (from RHEL) of the minimal changes for the
end of media problem. It may not be sufficient for some controllers
(promise notably) and it does not touch the locking so the error path
locking is as horked as in mainstream.
From: Ingo Molnar <mingo@elte.hu>
I have ported the patch to 2.6.17-rc4 and tested it by provoking
end-of-media IO errors with an unaligned ISO image. Unlike the vanilla
kernel, the patched kernel interpreted the error condition correctly with
512 byte granularity:
hdc: command error: status=0x51 { DriveReady SeekComplete Error }
hdc: command error: error=0x54 { AbortedCommand LastFailedSense=0x05 }
ide: failed opcode was: unknown
ATAPI device hdc:
Error: Illegal request -- (Sense key=0x05)
Illegal mode for this track or incompatible medium -- (asc=0x64, ascq=0x00)
The failed "Read 10" packet command was:
"28 00 00 04 fb 78 00 00 06 00 00 00 00 00 00 00 "
end_request: I/O error, dev hdc, sector 1306080
Buffer I/O error on device hdc, logical block 163260
Buffer I/O error on device hdc, logical block 163261
Buffer I/O error on device hdc, logical block 163262
the unpatched kernel produces an incorrect error dump:
hdc: command error: status=0x51 { DriveReady SeekComplete Error }
hdc: command error: error=0x54 { AbortedCommand LastFailedSense=0x05 }
ide: failed opcode was: unknown
end_request: I/O error, dev hdc, sector 1306080
Buffer I/O error on device hdc, logical block 163260
hdc: command error: status=0x51 { DriveReady SeekComplete Error }
hdc: command error: error=0x54 { AbortedCommand LastFailedSense=0x05 }
ide: failed opcode was: unknown
end_request: I/O error, dev hdc, sector 1306088
Buffer I/O error on device hdc, logical block 163261
hdc: command error: status=0x51 { DriveReady SeekComplete Error }
hdc: command error: error=0x54 { AbortedCommand LastFailedSense=0x05 }
ide: failed opcode was: unknown
end_request: I/O error, dev hdc, sector 1306096
Buffer I/O error on device hdc, logical block 163262
I do not have the right type of CD-ROM drive to reproduce the end-of-media
data corruption bug myself, but this same patch in RHEL solved it.
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Cc: Alan Cox <alan@lxorguk.ukuu.org.uk>
Cc: Bartlomiej Zolnierkiewicz <B.Zolnierkiewicz@elka.pw.edu.pl>
Cc: Jens Axboe <axboe@suse.de>
Cc: Matt Mackall <mpm@selenic.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'include/linux')
-rw-r--r-- | include/linux/ide.h | 3 |
1 files changed, 3 insertions, 0 deletions
diff --git a/include/linux/ide.h b/include/linux/ide.h index 77e66d055f5b..ef7bef207f48 100644 --- a/include/linux/ide.h +++ b/include/linux/ide.h | |||
@@ -630,6 +630,7 @@ typedef struct ide_drive_s { | |||
630 | unsigned int usage; /* current "open()" count for drive */ | 630 | unsigned int usage; /* current "open()" count for drive */ |
631 | unsigned int failures; /* current failure count */ | 631 | unsigned int failures; /* current failure count */ |
632 | unsigned int max_failures; /* maximum allowed failure count */ | 632 | unsigned int max_failures; /* maximum allowed failure count */ |
633 | u64 probed_capacity;/* initial reported media capacity (ide-cd only currently) */ | ||
633 | 634 | ||
634 | u64 capacity64; /* total number of sectors */ | 635 | u64 capacity64; /* total number of sectors */ |
635 | 636 | ||
@@ -1005,6 +1006,8 @@ extern ide_hwif_t ide_hwifs[]; /* master data repository */ | |||
1005 | extern int noautodma; | 1006 | extern int noautodma; |
1006 | 1007 | ||
1007 | extern int ide_end_request (ide_drive_t *drive, int uptodate, int nrsecs); | 1008 | extern int ide_end_request (ide_drive_t *drive, int uptodate, int nrsecs); |
1009 | int ide_end_dequeued_request(ide_drive_t *drive, struct request *rq, | ||
1010 | int uptodate, int nr_sectors); | ||
1008 | 1011 | ||
1009 | /* | 1012 | /* |
1010 | * This is used on exit from the driver to designate the next irq handler | 1013 | * This is used on exit from the driver to designate the next irq handler |