[PATCH/RFT] libata "DMA timeout" fix

From: Jeff Garzik
Date: Sat Feb 28 2004 - 14:12:44 EST



The desired effect of a DMA timeout should be to throw an I/O error, but that doesn't appear to be happening.

Those seeing DMA timeout messages, please test this patch.

Kernel hacker note: James B recommended that I implement my own scsi_done() function, which duplicates the real scsi_done() but omits the scsi_delete_timer() call. This is probably the best long term fix, but doing so involves exporting several currently-private bits of SCSI mid-layer, which I would rather not do. Probably best to create a __scsi_done() inside the SCSI mid-layer, and call that.

Jeff, the only user of ->eh_strategy_handler() in any kernel



===== drivers/scsi/libata-core.c 1.19 vs edited =====
--- 1.19/drivers/scsi/libata-core.c Wed Feb 25 22:41:13 2004
+++ edited/drivers/scsi/libata-core.c Sat Feb 28 14:03:18 2004
@@ -2130,6 +2130,14 @@
cmd->result = SAM_STAT_CHECK_CONDITION;
else
ata_to_sense_error(qc);
+
+ /* hack alert! we need this to get past the
+ * first check in scsi_done(). libata is the
+ * -only- user of ->eh_strategy_handler() in
+ * any kernel tree, which exposes some incorrect
+ * assumptions in the SCSI layer.
+ */
+ scsi_add_timer(cmd, 2000 * HZ, NULL);
} else {
cmd->result = SAM_STAT_GOOD;
}