diff options
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/scsi/scsi.c | 9 |
1 files changed, 9 insertions, 0 deletions
diff --git a/drivers/scsi/scsi.c b/drivers/scsi/scsi.c index 110e776d1a07..36c92f961e15 100644 --- a/drivers/scsi/scsi.c +++ b/drivers/scsi/scsi.c | |||
@@ -855,9 +855,18 @@ void scsi_finish_command(struct scsi_cmnd *cmd) | |||
855 | 855 | ||
856 | good_bytes = scsi_bufflen(cmd); | 856 | good_bytes = scsi_bufflen(cmd); |
857 | if (cmd->request->cmd_type != REQ_TYPE_BLOCK_PC) { | 857 | if (cmd->request->cmd_type != REQ_TYPE_BLOCK_PC) { |
858 | int old_good_bytes = good_bytes; | ||
858 | drv = scsi_cmd_to_driver(cmd); | 859 | drv = scsi_cmd_to_driver(cmd); |
859 | if (drv->done) | 860 | if (drv->done) |
860 | good_bytes = drv->done(cmd); | 861 | good_bytes = drv->done(cmd); |
862 | /* | ||
863 | * USB may not give sense identifying bad sector and | ||
864 | * simply return a residue instead, so subtract off the | ||
865 | * residue if drv->done() error processing indicates no | ||
866 | * change to the completion length. | ||
867 | */ | ||
868 | if (good_bytes == old_good_bytes) | ||
869 | good_bytes -= scsi_get_resid(cmd); | ||
861 | } | 870 | } |
862 | scsi_io_completion(cmd, good_bytes); | 871 | scsi_io_completion(cmd, good_bytes); |
863 | } | 872 | } |