From fc9a6a8aede9cf1509ef6cb260f31a02ca9b800c Mon Sep 17 00:00:00 2001 From: James Bottomley Date: Sat, 8 Mar 2008 18:24:17 -0600 Subject: [PATCH] --- yaml --- r: 101493 b: refs/heads/master c: 427e59f09fdba387547106de7bab980b7fff77be h: refs/heads/master i: 101491: 6e0dfe683e06b5721b6f3036fef6deb89a87cf03 v: v3 --- [refs] | 2 +- trunk/drivers/scsi/scsi.c | 9 +++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/[refs] b/[refs] index 621bdb3fc093..6d84fc5d3c7b 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 19c4158bcdf42ee3b2394342caf14f8471d2c78e +refs/heads/master: 427e59f09fdba387547106de7bab980b7fff77be diff --git a/trunk/drivers/scsi/scsi.c b/trunk/drivers/scsi/scsi.c index 110e776d1a07..36c92f961e15 100644 --- a/trunk/drivers/scsi/scsi.c +++ b/trunk/drivers/scsi/scsi.c @@ -855,9 +855,18 @@ void scsi_finish_command(struct scsi_cmnd *cmd) good_bytes = scsi_bufflen(cmd); if (cmd->request->cmd_type != REQ_TYPE_BLOCK_PC) { + int old_good_bytes = good_bytes; drv = scsi_cmd_to_driver(cmd); if (drv->done) good_bytes = drv->done(cmd); + /* + * USB may not give sense identifying bad sector and + * simply return a residue instead, so subtract off the + * residue if drv->done() error processing indicates no + * change to the completion length. + */ + if (good_bytes == old_good_bytes) + good_bytes -= scsi_get_resid(cmd); } scsi_io_completion(cmd, good_bytes); }