lkml.org 
[lkml]   [2017]   [Jun]   [1]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Date
    Subject[PATCH 3.16 016/212] scsi: storvsc: properly set residual data length on errors
    3.16.44-rc1 review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Long Li <longli@microsoft.com>

    commit 40630f462824ee24bc00d692865c86c3828094e0 upstream.

    On I/O errors, the Windows driver doesn't set data_transfer_length
    on error conditions other than SRB_STATUS_DATA_OVERRUN.
    In these cases we need to set data_transfer_length to 0,
    indicating there is no data transferred. On SRB_STATUS_DATA_OVERRUN,
    data_transfer_length is set by the Windows driver to the actual data transferred.

    Reported-by: Shiva Krishna <Shiva.Krishna@nimblestorage.com>
    Signed-off-by: Long Li <longli@microsoft.com>
    Reviewed-by: K. Y. Srinivasan <kys@microsoft.com>
    Signed-off-by: K. Y. Srinivasan <kys@microsoft.com>
    Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
    [bwh: Backported to 3.16: adjust context]
    Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
    ---
    drivers/scsi/storvsc_drv.c | 16 +++++++++++++---
    1 file changed, 13 insertions(+), 3 deletions(-)

    --- a/drivers/scsi/storvsc_drv.c
    +++ b/drivers/scsi/storvsc_drv.c
    @@ -307,6 +307,7 @@ enum storvsc_request_type {
    #define SRB_STATUS_SUCCESS 0x01
    #define SRB_STATUS_ABORTED 0x02
    #define SRB_STATUS_ERROR 0x04
    +#define SRB_STATUS_DATA_OVERRUN 0x12

    #define SRB_STATUS(status) \
    (status & ~(SRB_STATUS_AUTOSENSE_VALID | SRB_STATUS_QUEUE_FROZEN))
    @@ -1084,6 +1085,7 @@ static void storvsc_command_completion(s
    void (*scsi_done_fn)(struct scsi_cmnd *);
    struct scsi_sense_hdr sense_hdr;
    struct vmscsi_request *vm_srb;
    + u32 data_transfer_length;
    struct stor_mem_pools *memp = scmnd->device->hostdata;
    struct Scsi_Host *host;
    struct storvsc_device *stor_dev;
    @@ -1093,6 +1095,7 @@ static void storvsc_command_completion(s
    host = stor_dev->host;

    vm_srb = &cmd_request->vstor_packet.vm_srb;
    + data_transfer_length = vm_srb->data_transfer_length;
    if (cmd_request->bounce_sgl_count) {
    if (vm_srb->data_in == READ_TYPE)
    copy_from_bounce_buffer(scsi_sglist(scmnd),
    @@ -1111,13 +1114,20 @@ static void storvsc_command_completion(s
    scsi_print_sense_hdr("storvsc", &sense_hdr);
    }

    - if (vm_srb->srb_status != SRB_STATUS_SUCCESS)
    + if (vm_srb->srb_status != SRB_STATUS_SUCCESS) {
    storvsc_handle_error(vm_srb, scmnd, host, sense_hdr.asc,
    sense_hdr.ascq);
    + /*
    + * The Windows driver set data_transfer_length on
    + * SRB_STATUS_DATA_OVERRUN. On other errors, this value
    + * is untouched. In these cases we set it to 0.
    + */
    + if (vm_srb->srb_status != SRB_STATUS_DATA_OVERRUN)
    + data_transfer_length = 0;
    + }

    scsi_set_resid(scmnd,
    - cmd_request->data_buffer.len -
    - vm_srb->data_transfer_length);
    + cmd_request->data_buffer.len - data_transfer_length);

    scsi_done_fn = scmnd->scsi_done;

    \
     
     \ /
      Last update: 2017-06-01 18:32    [W:4.473 / U:0.052 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site