Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=52aeeca9001d1b4037a8e5d0c001ebb5fdc61b37
Commit:     52aeeca9001d1b4037a8e5d0c001ebb5fdc61b37
Parent:     cec744fb2b78e9dcd377a6740f2de05227c7faef
Author:     Michael Reed <[EMAIL PROTECTED]>
AuthorDate: Mon Sep 17 15:11:39 2007 -0700
Committer:  James Bottomley <[EMAIL PROTECTED]>
CommitDate: Fri Oct 12 14:49:04 2007 -0400

    [SCSI] stale residual returned on write following BUSY retry
    
    A BUSY status returned on a write request results in a stale residual
    being returned when the write ultimately successfully completes.
    
    This can be reproduced as follows:
    
    1) issue immediate mode rewind to scsi tape drive
    2) issue write request
    
    The tape drive returns busy.  The low level driver detects underrun and
    sets the residual into the scsi command.  The low level driver responds
    with (DID_OK << 16) | scsi_status.  scsi_status is 8, hence
    status_byte(result) == 4, i.e., BUSY.
    
    scsi_softirq_done() calls scsi_decide_disposition() which returns
    ADD_TO_MLQUEUE.  scsi_softirq_done() then calls scsi_queue_insert()
    which, on the way to resubmitting the request to the driver, calls
    scsi_init_cmd_errh().
    
    The attached patch modifies scsi_init_cmd_errh() to clear the resid
    field.  This prevents a "stale" residual from being returned when the
    scsi command finally completes without a BUSY status.
    
    Signed-off-by: Michael Reed <[EMAIL PROTECTED]>
    Signed-off-by: James Bottomley <[EMAIL PROTECTED]>
---
 drivers/scsi/scsi_lib.c |    1 +
 1 files changed, 1 insertions(+), 0 deletions(-)

diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c
index 277f1b6..47d3cdd 100644
--- a/drivers/scsi/scsi_lib.c
+++ b/drivers/scsi/scsi_lib.c
@@ -449,6 +449,7 @@ EXPORT_SYMBOL_GPL(scsi_execute_async);
 static void scsi_init_cmd_errh(struct scsi_cmnd *cmd)
 {
        cmd->serial_number = 0;
+       cmd->resid = 0;
        memset(cmd->sense_buffer, 0, sizeof cmd->sense_buffer);
        if (cmd->cmd_len == 0)
                cmd->cmd_len = COMMAND_SIZE(cmd->cmnd[0]);
-
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to