Re: Weird RAID/SATA problem [ once was Re: 2.6.17-mm3 ]

From: Neil Brown
Date: Sat Jul 01 2006 - 09:33:37 EST


On Sunday July 2, reuben-lkml@xxxxxxxx wrote:
> BUG: warning at drivers/md/md.c:411/super_written_barrier()
>
> Call Trace:
> <IRQ> [<ffffffff80422231>] super_written_barrier+0x61/0x100
> [<ffffffff8023c000>] bio_endio+0x5a/0x6a
> [<ffffffff8022e24f>] __end_that_request_first+0x16f/0x4c9
> [<ffffffff8024afaa>] end_that_request_first+0xc/0xe
> [<ffffffff8034e825>] blk_ordered_complete_seq+0x7d/0x8c
> [<ffffffff8034e864>] post_flush_end_io+0x30/0x35
> [<ffffffff8034e748>] end_that_request_last+0xd8/0xf4
> [<ffffffff803d83a1>] scsi_end_request+0xb1/0xdd
> [<ffffffff803d87cd>] scsi_io_completion+0x3cd/0x3dc

I think the key decision to return an error is happening here in
scsi_io_completion.
Pooring over a disassembly might help show here, but sticking in a
bunch of printks is probably easier (for someone like me who has never
seen this code before anyway :-)

What does this patch produce?

NeilBrown

Signed-off-by: Neil Brown <neilb@xxxxxxx>


diff .prev/drivers/scsi/scsi_lib.c ./drivers/scsi/scsi_lib.c
--- .prev/drivers/scsi/scsi_lib.c 2006-07-01 23:22:46.000000000 +1000
+++ ./drivers/scsi/scsi_lib.c 2006-07-01 23:26:18.000000000 +1000
@@ -952,6 +952,7 @@ void scsi_io_completion(struct scsi_cmnd
* and quietly refuse further access.
*/
cmd->device->changed = 1;
+ printk("Unit Attention\n");
scsi_end_request(cmd, 0, this_count, 1);
return;
} else {
@@ -984,6 +985,8 @@ void scsi_io_completion(struct scsi_cmnd
scsi_requeue_command(q, cmd);
return;
} else {
+ printk("Illegal Request %d %d %d\n",
+ sshdr.asc, sshdr.ascq, cmd->cmnd[0]);
scsi_end_request(cmd, 0, this_count, 1);
return;
}
@@ -1012,6 +1015,7 @@ void scsi_io_completion(struct scsi_cmnd
"Device not ready: ");
scsi_print_sense_hdr("", &sshdr);
}
+ printk("Not ready\n");
scsi_end_request(cmd, 0, this_count, 1);
return;
case VOLUME_OVERFLOW:
@@ -1022,6 +1026,7 @@ void scsi_io_completion(struct scsi_cmnd
scsi_print_sense("", cmd);
}
/* See SSC3rXX or current. */
+ printk("Volume Overflow\n");
scsi_end_request(cmd, 0, this_count, 1);
return;
default:
@@ -1045,6 +1050,10 @@ void scsi_io_completion(struct scsi_cmnd
scsi_print_sense("", cmd);
}
}
+ printk("ouch. %d %d %d %d %d %d %d\n",
+ good_bytes, sense_valid, sense_deferred,
+ sshdr.sense_key, sshdr.asc, sshdr.ascq,
+ result);
scsi_end_request(cmd, 0, this_count, !result);
}
EXPORT_SYMBOL(scsi_io_completion);
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/