aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/scsi/scsi.c
diff options
context:
space:
mode:
authorDmitry Torokhov <dmitry.torokhov@gmail.com>2008-07-21 00:55:14 -0400
committerDmitry Torokhov <dmitry.torokhov@gmail.com>2008-07-21 00:55:14 -0400
commit908cf4b925e419bc74f3297b2f0e51d6f8a81da2 (patch)
tree6c2da79366d4695a9c2560ab18259eca8a2a25b4 /drivers/scsi/scsi.c
parent92c49890922d54cba4b1eadeb0b185773c2c9570 (diff)
parent14b395e35d1afdd8019d11b92e28041fad591b71 (diff)
Merge master.kernel.org:/pub/scm/linux/kernel/git/torvalds/linux-2.6 into next
Diffstat (limited to 'drivers/scsi/scsi.c')
-rw-r--r--drivers/scsi/scsi.c9
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}