diff options
author | James Bottomley <James.Bottomley@HansenPartnership.com> | 2009-03-30 12:55:51 -0400 |
---|---|---|
committer | James Bottomley <James.Bottomley@HansenPartnership.com> | 2009-04-03 10:22:55 -0400 |
commit | a9bddd74630b2a1f2dedc537417c372b2d9edc76 (patch) | |
tree | d086a3d0770536bc0910ea9ad9eb4a35be273848 /drivers/scsi/scsi_lib.c | |
parent | a2f5bfcf711aa72ad5587b533a1909334c2533a4 (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.c | 17 |
1 files changed, 16 insertions, 1 deletions
diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c index 4b13e36d3aa0..d1cb64ad1a3f 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 | */ |