Patch "scsi: storvsc: properly set residual data length on errors" has been added to the 4.9-stable tree
Subsystems (3)
This is a note to let you know that I've just added the patch titled
scsi: storvsc: properly set residual data length on errors
to the 4.9-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
scsi-storvsc-properly-set-residual-data-length-on-errors.patch
and it can be found in the queue-4.9 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
40630f462824ee24bc00d692865c86c3828094e0Mon Sep 17 00:00:00 2001
From: Long Li <[email protected]>
Date: Wed, 14 Dec 2016 18:46:03 -0800
Subject: scsi: storvsc: properly set residual data length on errors
From: Long Li <[email protected]>
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.
--- drivers/scsi/storvsc_drv.c | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-)
drivers/scsi/storvsc_drv.c +13 -3
@@ -377,6 +377,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))
@@ -962,6 +963,7 @@ static void storvsc_command_completion(sstruct scsi_cmnd *scmnd = cmd_request->cmd;struct scsi_sense_hdr sense_hdr;struct vmscsi_request *vm_srb; +u32 data_transfer_length;struct Scsi_Host *host;u32 payload_sz = cmd_request->payload_sz;void *payload = cmd_request->payload;
@@ -969,6 +971,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; scmnd->result = vm_srb->scsi_status;
@@ -982,13 +985,20 @@ static void storvsc_command_completion(s &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->payload->range.len - - vm_srb->data_transfer_length); + cmd_request->payload->range.len - data_transfer_length); scmnd->scsi_done (scmnd);
Patches currently in stable-queue which might be from [email protected] are
queue-4.9/scsi-storvsc-use-tagged-srb-requests-if-supported-by-the-device.patch queue-4.9/scsi-storvsc-properly-set-residual-data-length-on-errors.patch queue-4.9/scsi-storvsc-properly-handle-srb_error-when-sense-message-is-present.patch