diff options
author | Tejun Heo <tj@kernel.org> | 2009-05-19 05:33:05 -0400 |
---|---|---|
committer | Jens Axboe <jens.axboe@oracle.com> | 2009-05-19 05:36:08 -0400 |
commit | 5f49f63178360b07a095bd33b0d850d60edf7590 (patch) | |
tree | 23764399405214c115543eb5dec59982cf0baa26 /drivers/block | |
parent | 3755100dd5f66761aaaa7ae44c70b319a7c78a56 (diff) |
block: set rq->resid_len to blk_rq_bytes() on issue
In commit c3a4d78c580de4edc9ef0f7c59812fb02ceb037f, while introducing
rq->resid_len, the default value of residue count was changed from
full count to zero. The conversion was done under the assumption that
when a request fails residue count wasn't defined. However, Boaz and
James pointed out that this wasn't true and the residue count should
be preserved for failed requests too.
This patchset restores the original behavior by setting rq->resid_len
to blk_rq_bytes(rq) on request start and restoring explicit clearing
in affected drivers. While at it, take advantage of the fact that
rq->resid_len is set to full count where applicable.
* ide-cd: rq->resid_len cleared on pc success
* mptsas: req->resid_len cleared on success
* sas_expander: rsp/req->resid_len cleared on success
* mpt2sas_transport: req->resid_len cleared on success
* ide-cd, ide-tape, mptsas, sas_host_smp, mpt2sas_transport, ub: take
advantage of initial full count to simplify code
Boaz Harrosh spotted bug in resid_len initialization. Fixed as
suggested.
Signed-off-by: Tejun Heo <tj@kernel.org>
Acked-by: Borislav Petkov <petkovbb@googlemail.com>
Cc: Boaz Harrosh <bharrosh@panasas.com>
Cc: James Bottomley <James.Bottomley@HansenPartnership.com>
Cc: Pete Zaitcev <zaitcev@redhat.com>
Cc: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
Cc: Sergei Shtylyov <sshtylyov@ru.mvista.com>
Cc: Eric Moore <Eric.Moore@lsi.com>
Cc: Darrick J. Wong <djwong@us.ibm.com>
Signed-off-by: Jens Axboe <jens.axboe@oracle.com>
Diffstat (limited to 'drivers/block')
-rw-r--r-- | drivers/block/ub.c | 6 |
1 files changed, 4 insertions, 2 deletions
diff --git a/drivers/block/ub.c b/drivers/block/ub.c index f32781cff456..e67bbae9547d 100644 --- a/drivers/block/ub.c +++ b/drivers/block/ub.c | |||
@@ -781,8 +781,10 @@ static void ub_rw_cmd_done(struct ub_dev *sc, struct ub_scsi_cmd *cmd) | |||
781 | 781 | ||
782 | if (cmd->error == 0) { | 782 | if (cmd->error == 0) { |
783 | if (blk_pc_request(rq)) { | 783 | if (blk_pc_request(rq)) { |
784 | if (cmd->act_len < blk_rq_bytes(rq)) | 784 | if (cmd->act_len >= rq->resid_len) |
785 | rq->resid_len = blk_rq_bytes(rq) - cmd->act_len; | 785 | rq->resid_len = 0; |
786 | else | ||
787 | rq->resid_len -= cmd->act_len; | ||
786 | scsi_status = 0; | 788 | scsi_status = 0; |
787 | } else { | 789 | } else { |
788 | if (cmd->act_len != cmd->len) { | 790 | if (cmd->act_len != cmd->len) { |