blk_sg_io_err.patch - discussed here
http://marc.theaimsgroup.com/?l=linux-scsi&m=108617935710955&w=2
diff -arup linux-2.6.7-rc2/drivers/block/scsi_ioctl.c linux-2.6.7-rc2-work/drivers/block/scsi_ioctl.c
--- linux-2.6.7-rc2/drivers/block/scsi_ioctl.c 2004-05-29 23:26:48.000000000 -0700
+++ linux-2.6.7-rc2-work/drivers/block/scsi_ioctl.c 2004-06-02 04:32:27.000000000 -0700
@@ -185,11 +185,11 @@ static int sg_io(request_queue_t *q, str
blk_execute_rq(q, bd_disk, rq);
/* write to all output members */
- hdr->status = rq->errors;
- hdr->masked_status = (hdr->status >> 1) & 0x1f;
- hdr->msg_status = 0;
- hdr->host_status = 0;
- hdr->driver_status = 0;
+ hdr->status = 0xff & rq->errors;
+ hdr->masked_status = status_byte(rq->errors);
+ hdr->msg_status = msg_byte(rq->errors);
+ hdr->host_status = host_byte(rq->errors);
+ hdr->driver_status = driver_byte(rq->errors);
hdr->info = 0;
if (hdr->masked_status || hdr->host_status || hdr->driver_status)
hdr->info |= SG_INFO_CHECK;
diff -arup linux-2.6.7-rc2/drivers/scsi/scsi_lib.c linux-2.6.7-rc2-work/drivers/scsi/scsi_lib.c
--- linux-2.6.7-rc2/drivers/scsi/scsi_lib.c 2004-05-29 23:26:10.000000000 -0700
+++ linux-2.6.7-rc2-work/drivers/scsi/scsi_lib.c 2004-06-02 02:51:16.000000000 -0700
@@ -708,8 +708,7 @@ void scsi_io_completion(struct scsi_cmnd
}
if (blk_pc_request(req)) { /* SG_IO ioctl from block level */
- req->errors = (driver_byte(result) & DRIVER_SENSE) ?
- (CHECK_CONDITION << 1) : (result & 0xff);
+ req->errors = result;
if (result) {
clear_errors = 0;
if (cmd->sense_buffer[0] & 0x70) {