• James Bottomley's avatar
    [SCSI] scsi_lib: fix DID_RESET status problems · 79ed2429
    James Bottomley authored
    Andrew Vaszquez said:
    > There's a problem that is causing commands returned by the LLD with
    > a DID_RESET status to be reissued with cleared cmd->sdb data which
    > in our tests are manifesting in firmware detected overruns.  Here's
    > a snippet of a READ_10 scsi_cmnd upon completion by the storage
    The problem is caused by:
    commit b60af5b0
    Author: Alan Stern <stern@rowland.harvard.edu>
    Date:   Mon Nov 3 15:56:47 2008 -0500
        [SCSI] simplify scsi_io_completion()
    Because scsi_release_buffers() is called before commands that go
    through the ACTION_RETRY and ACTION_DELAYED_RETRY legs are requeued.
    However, they're not re-prepared, so nothing ever reallocates the
    buffer resources to them.  Fix this by releasing the buffers only if
    we're not going to go down these legs (but scsi_release_buffers() on
    all legs including two in scsi_end_request(); this latter needs a
    special version __scsi_release_buffers() because the final one can be
    called after the request has been freed, so the bidi test in
    scsi_release_buffers(), which touches the request has to be skipped).
    Reported-by: default avatarAndrew Vasquez <andrew.vasquez@qlogic.com>
    Signed-off-by: default avatarJames Bottomley <James.Bottomley@HansenPartnership.com>
scsi_lib.c 69.5 KB