aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/scsi/scsi_lib.c
diff options
context:
space:
mode:
authorJames Bottomley <James.Bottomley@HansenPartnership.com>2009-03-30 12:55:51 -0400
committerJames Bottomley <James.Bottomley@HansenPartnership.com>2009-04-03 10:22:55 -0400
commita9bddd74630b2a1f2dedc537417c372b2d9edc76 (patch)
treed086a3d0770536bc0910ea9ad9eb4a35be273848 /drivers/scsi/scsi_lib.c
parenta2f5bfcf711aa72ad5587b533a1909334c2533a4 (diff)
[SCSI] fix recovered error handling
We have a problem with recovered error handling in that any command which goes down as BLOCK_PC but which returns a sense code of RECOVERED ERROR gets completed with -EIO. For actual SG_IO commands, this doesn't matter at all, since the error return code gets dropped in favour of req->errors which contain the SCSI completion code. However, if this command is part of the block system, then it will pay attention to the returned error code. In particularly if a SYNCHRONIZE CACHE from a barrier command completes with RECOVERED ERROR, the resulting -EIO on the barrier causes block to error the request and return it to the filesystem. Fix this by converting the -EIO for recovered error to zero, plus remove the printing of this from sd and sr so the message isn't double printed. Signed-off-by: James Bottomley <James.Bottomley@HansenPartnership.com>
Diffstat (limited to 'drivers/scsi/scsi_lib.c')
-rw-r--r--drivers/scsi/scsi_lib.c17
1 files changed, 16 insertions, 1 deletions
diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c
index 4b13e36d3aa..d1cb64ad1a3 100644
--- a/drivers/scsi/scsi_lib.c
+++ b/drivers/scsi/scsi_lib.c
@@ -791,7 +791,22 @@ void scsi_io_completion(struct scsi_cmnd *cmd, unsigned int good_bytes)
791 "%d bytes done.\n", 791 "%d bytes done.\n",
792 req->nr_sectors, good_bytes)); 792 req->nr_sectors, good_bytes));
793 793
794 /* A number of bytes were successfully read. If there 794 /*
795 * Recovered errors need reporting, but they're always treated
796 * as success, so fiddle the result code here. For BLOCK_PC
797 * we already took a copy of the original into rq->errors which
798 * is what gets returned to the user
799 */
800 if (sense_valid && sshdr.sense_key == RECOVERED_ERROR) {
801 if (!(req->cmd_flags & REQ_QUIET))
802 scsi_print_sense("", cmd);
803 result = 0;
804 /* BLOCK_PC may have set error */
805 error = 0;
806 }
807
808 /*
809 * A number of bytes were successfully read. If there
795 * are leftovers and there is some kind of error 810 * are leftovers and there is some kind of error
796 * (result != 0), retry the rest. 811 * (result != 0), retry the rest.
797 */ 812 */