From 3cd85b80e65a33577b3d6a594cdc77e8de16a02c Mon Sep 17 00:00:00 2001 From: James Bottomley Date: Mon, 30 Mar 2009 16:55:51 +0000 Subject: [PATCH] --- yaml --- r: 142090 b: refs/heads/master c: a9bddd74630b2a1f2dedc537417c372b2d9edc76 h: refs/heads/master v: v3 --- [refs] | 2 +- trunk/drivers/scsi/scsi_lib.c | 17 ++++++++++++++++- trunk/drivers/scsi/sd.c | 6 ------ trunk/drivers/scsi/sr.c | 9 --------- 4 files changed, 17 insertions(+), 17 deletions(-) diff --git a/[refs] b/[refs] index f109be28de65..b4489d334c60 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: a2f5bfcf711aa72ad5587b533a1909334c2533a4 +refs/heads/master: a9bddd74630b2a1f2dedc537417c372b2d9edc76 diff --git a/trunk/drivers/scsi/scsi_lib.c b/trunk/drivers/scsi/scsi_lib.c index 4b13e36d3aa0..d1cb64ad1a3f 100644 --- a/trunk/drivers/scsi/scsi_lib.c +++ b/trunk/drivers/scsi/scsi_lib.c @@ -791,7 +791,22 @@ void scsi_io_completion(struct scsi_cmnd *cmd, unsigned int good_bytes) "%d bytes done.\n", req->nr_sectors, good_bytes)); - /* A number of bytes were successfully read. If there + /* + * Recovered errors need reporting, but they're always treated + * as success, so fiddle the result code here. For BLOCK_PC + * we already took a copy of the original into rq->errors which + * is what gets returned to the user + */ + if (sense_valid && sshdr.sense_key == RECOVERED_ERROR) { + if (!(req->cmd_flags & REQ_QUIET)) + scsi_print_sense("", cmd); + result = 0; + /* BLOCK_PC may have set error */ + error = 0; + } + + /* + * A number of bytes were successfully read. If there * are leftovers and there is some kind of error * (result != 0), retry the rest. */ diff --git a/trunk/drivers/scsi/sd.c b/trunk/drivers/scsi/sd.c index aeab5d9dff27..3fcb64b91c43 100644 --- a/trunk/drivers/scsi/sd.c +++ b/trunk/drivers/scsi/sd.c @@ -1051,12 +1051,6 @@ static int sd_done(struct scsi_cmnd *SCpnt) good_bytes = sd_completed_bytes(SCpnt); break; case RECOVERED_ERROR: - /* Inform the user, but make sure that it's not treated - * as a hard error. - */ - scsi_print_sense("sd", SCpnt); - SCpnt->result = 0; - memset(SCpnt->sense_buffer, 0, SCSI_SENSE_BUFFERSIZE); good_bytes = scsi_bufflen(SCpnt); break; case NO_SENSE: diff --git a/trunk/drivers/scsi/sr.c b/trunk/drivers/scsi/sr.c index e7fa3caead79..0e1a0f2d2ad5 100644 --- a/trunk/drivers/scsi/sr.c +++ b/trunk/drivers/scsi/sr.c @@ -309,15 +309,6 @@ static int sr_done(struct scsi_cmnd *SCpnt) break; case RECOVERED_ERROR: - - /* - * An error occured, but it recovered. Inform the - * user, but make sure that it's not treated as a - * hard error. - */ - scsi_print_sense("sr", SCpnt); - SCpnt->result = 0; - SCpnt->sense_buffer[0] = 0x0; good_bytes = this_count; break;