Skip to content

Commit

Permalink
block: set rq->resid_len to blk_rq_bytes() on issue
Browse files Browse the repository at this point in the history
In commit c3a4d78, 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 <[email protected]>
Acked-by: Borislav Petkov <[email protected]>
Cc: Boaz Harrosh <[email protected]>
Cc: James Bottomley <[email protected]>
Cc: Pete Zaitcev <[email protected]>
Cc: Bartlomiej Zolnierkiewicz <[email protected]>
Cc: Sergei Shtylyov <[email protected]>
Cc: Eric Moore <[email protected]>
Cc: Darrick J. Wong <[email protected]>
Signed-off-by: Jens Axboe <[email protected]>
  • Loading branch information
htejun authored and Jens Axboe committed May 19, 2009
1 parent 3755100 commit 5f49f63
Show file tree
Hide file tree
Showing 8 changed files with 18 additions and 13 deletions.
5 changes: 3 additions & 2 deletions block/blk-core.c
Original file line number Diff line number Diff line change
Expand Up @@ -1783,9 +1783,10 @@ void blk_start_request(struct request *req)
blk_dequeue_request(req);

/*
* We are now handing the request to the hardware, add the
* timeout handler.
* We are now handing the request to the hardware, initialize
* resid_len to full count and add the timeout handler.
*/
req->resid_len = blk_rq_bytes(req);
blk_add_timer(req);
}
EXPORT_SYMBOL(blk_start_request);
Expand Down
6 changes: 4 additions & 2 deletions drivers/block/ub.c
Original file line number Diff line number Diff line change
Expand Up @@ -781,8 +781,10 @@ static void ub_rw_cmd_done(struct ub_dev *sc, struct ub_scsi_cmd *cmd)

if (cmd->error == 0) {
if (blk_pc_request(rq)) {
if (cmd->act_len < blk_rq_bytes(rq))
rq->resid_len = blk_rq_bytes(rq) - cmd->act_len;
if (cmd->act_len >= rq->resid_len)
rq->resid_len = 0;
else
rq->resid_len -= cmd->act_len;
scsi_status = 0;
} else {
if (cmd->act_len != cmd->len) {
Expand Down
4 changes: 2 additions & 2 deletions drivers/ide/ide-cd.c
Original file line number Diff line number Diff line change
Expand Up @@ -699,6 +699,7 @@ static ide_startstop_t cdrom_newpc_intr(ide_drive_t *drive)

out_end:
if (blk_pc_request(rq) && rc == 0) {
rq->resid_len = 0;
blk_end_request_all(rq, 0);
hwif->rq = NULL;
} else {
Expand All @@ -718,8 +719,7 @@ static ide_startstop_t cdrom_newpc_intr(ide_drive_t *drive)

/* make sure it's fully ended */
if (blk_fs_request(rq) == 0) {
rq->resid_len = blk_rq_bytes(rq) -
(cmd->nbytes - cmd->nleft);
rq->resid_len -= cmd->nbytes - cmd->nleft;
if (uptodate == 0 && (cmd->tf_flags & IDE_TFLAG_WRITE))
rq->resid_len += cmd->last_xfer_len;
}
Expand Down
2 changes: 1 addition & 1 deletion drivers/ide/ide-tape.c
Original file line number Diff line number Diff line change
Expand Up @@ -380,7 +380,7 @@ static int ide_tape_callback(ide_drive_t *drive, int dsc)
}

tape->first_frame += blocks;
rq->resid_len = blk_rq_bytes(rq) - blocks * tape->blk_size;
rq->resid_len -= blocks * tape->blk_size;

if (pc->error) {
uptodate = 0;
Expand Down
3 changes: 2 additions & 1 deletion drivers/message/fusion/mptsas.c
Original file line number Diff line number Diff line change
Expand Up @@ -1357,7 +1357,8 @@ static int mptsas_smp_handler(struct Scsi_Host *shost, struct sas_rphy *rphy,
smprep = (SmpPassthroughReply_t *)ioc->sas_mgmt.reply;
memcpy(req->sense, smprep, sizeof(*smprep));
req->sense_len = sizeof(*smprep);
rsp->resid_len = blk_rq_bytes(rsp) - smprep->ResponseDataLength;
req->resid_len = 0;
rsp->resid_len -= smprep->ResponseDataLength;
} else {
printk(MYIOC_s_ERR_FMT "%s: smp passthru reply failed to be returned\n",
ioc->name, __func__);
Expand Down
4 changes: 4 additions & 0 deletions drivers/scsi/libsas/sas_expander.c
Original file line number Diff line number Diff line change
Expand Up @@ -1937,7 +1937,11 @@ int sas_smp_handler(struct Scsi_Host *shost, struct sas_rphy *rphy,
if (ret > 0) {
/* positive number is the untransferred residual */
rsp->resid_len = ret;
req->resid_len = 0;
ret = 0;
} else if (ret == 0) {
rsp->resid_len = 0;
req->resid_len = 0;
}

return ret;
Expand Down
3 changes: 0 additions & 3 deletions drivers/scsi/libsas/sas_host_smp.c
Original file line number Diff line number Diff line change
Expand Up @@ -176,9 +176,6 @@ int sas_smp_host_handler(struct Scsi_Host *shost, struct request *req,
resp_data[1] = req_data[1];
resp_data[2] = SMP_RESP_FUNC_UNK;

req->resid_len = blk_rq_bytes(req);
rsp->resid_len = blk_rq_bytes(rsp);

switch (req_data[1]) {
case SMP_REPORT_GENERAL:
req->resid_len -= 8;
Expand Down
4 changes: 2 additions & 2 deletions drivers/scsi/mpt2sas/mpt2sas_transport.c
Original file line number Diff line number Diff line change
Expand Up @@ -1170,8 +1170,8 @@ transport_smp_handler(struct Scsi_Host *shost, struct sas_rphy *rphy,

memcpy(req->sense, mpi_reply, sizeof(*mpi_reply));
req->sense_len = sizeof(*mpi_reply);
rsp->resid_len = blk_rq_bytes(rsp) -
mpi_reply->ResponseDataLength;
req->resid_len = 0;
rsp->resid_len -= mpi_reply->ResponseDataLength;
} else {
dtransportprintk(ioc, printk(MPT2SAS_DEBUG_FMT
"%s - no reply\n", ioc->name, __func__));
Expand Down

0 comments on commit 5f49f63

Please sign in to comment.