Fixing issue of not setting residual bytes correctly.

Signed-off-by: Shivasharan S <shivasharan.srikanteshw...@broadcom.com>
Signed-off-by: Kashyap Desai <kashyap.de...@broadcom.com>
Reviewed-by: Hannes Reinecke <h...@suse.com>
Reviewed-by: Tomas Henzl <the...@redhat.com>
---
 drivers/scsi/megaraid/megaraid_sas_fusion.c | 10 ++++++++++
 1 file changed, 10 insertions(+)

diff --git a/drivers/scsi/megaraid/megaraid_sas_fusion.c 
b/drivers/scsi/megaraid/megaraid_sas_fusion.c
index edbecc5..4628671 100644
--- a/drivers/scsi/megaraid/megaraid_sas_fusion.c
+++ b/drivers/scsi/megaraid/megaraid_sas_fusion.c
@@ -1445,6 +1445,7 @@ map_cmd_status(struct fusion_context *fusion,
        struct scsi_cmnd *scmd, u8 status, u8 ext_status,
                        u32 data_length, u8 *sense)
 {
+       int resid;
 
        switch (status) {
 
@@ -1467,6 +1468,15 @@ map_cmd_status(struct fusion_context *fusion,
                               SCSI_SENSE_BUFFERSIZE);
                        scmd->result |= DRIVER_SENSE << 24;
                }
+
+               /*
+                * If the  IO request is partially completed, then MR FW will
+                * update "io_request->DataLength" field with actual number of
+                * bytes transferred.Driver will set residual bytes count in
+                * SCSI command structure.
+                */
+               resid = (scsi_bufflen(scmd) - data_length);
+               scsi_set_resid(scmd, resid);
                break;
 
        case MFI_STAT_LD_OFFLINE:
-- 
2.8.3

Reply via email to