block: set rq->resid_len to blk_rq_bytes() on issue
authorTejun Heo <tj@kernel.org>
Tue, 19 May 2009 09:33:05 +0000 (18:33 +0900)
committerJens Axboe <jens.axboe@oracle.com>
Tue, 19 May 2009 09:36:08 +0000 (11:36 +0200)
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>
block/blk-core.c
drivers/block/ub.c
drivers/ide/ide-cd.c
drivers/ide/ide-tape.c
drivers/message/fusion/mptsas.c
drivers/scsi/libsas/sas_expander.c
drivers/scsi/libsas/sas_host_smp.c
drivers/scsi/mpt2sas/mpt2sas_transport.c

index a2d97de1a12c361e5e3dd0b8517dc7e6a6ede7c6..e3f7e6a3a09576b7167383abdbe9722cab532134 100644 (file)
@@ -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);
index f32781cff45666d4da0c1f2869d9c532a81f32e0..e67bbae9547d1b3ac42cbbd1a243911789dbb94b 100644 (file)
@@ -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) {
index 4c7792fd5f934edddbcf623bacd860e25a426289..081aed6781cc182e9cda15ea8b90e908bad5d84e 100644 (file)
@@ -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 {
@@ -718,8 +719,7 @@ out_end:
 
                /* 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;
                }
index e16604562f281e7485be4a858e1f96ac1e619e60..683ff37d4079471ebe9b202ca2631b3e3164e33c 100644 (file)
@@ -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;
index 4e6fcf06a6f2d541300e38bdeeea6b766424cdff..79f5433359f9b3fc1b346cb78b5d11dcd60d15de 100644 (file)
@@ -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__);
index 531af9ed719912cfad5d24ea3380145c5c132268..54fa1e42dc4d2dfba29cdf52afd52d909af67139 100644 (file)
@@ -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;
index be9a951b977d8a471b7851523607ae13fb3e8b99..1bc3b75679947ac1d8bcca33d132835cf16854f8 100644 (file)
@@ -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;
index af95a449930ea18ffddd7a0d33673ea8b7704eb3..5c65da519e39af511334816c18977912a4920637 100644 (file)
@@ -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__));