If MR_TargetIdToLdGet return >= 0xFF, it is invalid entry.
Consider that entry as invalid and do not access raid map for further operation.

Signed-off-by: Shivasharan S <[email protected]>
Signed-off-by: Kashyap Desai <[email protected]>
---
 drivers/scsi/megaraid/megaraid_sas.h        |  2 +-
 drivers/scsi/megaraid/megaraid_sas_fp.c     |  5 +++--
 drivers/scsi/megaraid/megaraid_sas_fusion.c | 25 ++++++++++++++-----------
 3 files changed, 18 insertions(+), 14 deletions(-)

diff --git a/drivers/scsi/megaraid/megaraid_sas.h 
b/drivers/scsi/megaraid/megaraid_sas.h
index f023e23..ec5f003 100644
--- a/drivers/scsi/megaraid/megaraid_sas.h
+++ b/drivers/scsi/megaraid/megaraid_sas.h
@@ -2448,7 +2448,7 @@ MR_BuildRaidContext(struct megasas_instance *instance,
                    struct IO_REQUEST_INFO *io_info,
                    struct RAID_CONTEXT *pRAID_Context,
                    struct MR_DRV_RAID_MAP_ALL *map, u8 **raidLUN);
-u8 MR_TargetIdToLdGet(u32 ldTgtId, struct MR_DRV_RAID_MAP_ALL *map);
+u16 MR_TargetIdToLdGet(u32 ldTgtId, struct MR_DRV_RAID_MAP_ALL *map);
 struct MR_LD_RAID *MR_LdRaidGet(u32 ld, struct MR_DRV_RAID_MAP_ALL *map);
 u16 MR_ArPdGet(u32 ar, u32 arm, struct MR_DRV_RAID_MAP_ALL *map);
 u16 MR_LdSpanArrayGet(u32 ld, u32 span, struct MR_DRV_RAID_MAP_ALL *map);
diff --git a/drivers/scsi/megaraid/megaraid_sas_fp.c 
b/drivers/scsi/megaraid/megaraid_sas_fp.c
index a0b0e68..9d5d485 100644
--- a/drivers/scsi/megaraid/megaraid_sas_fp.c
+++ b/drivers/scsi/megaraid/megaraid_sas_fp.c
@@ -165,7 +165,7 @@ u16 MR_GetLDTgtId(u32 ld, struct MR_DRV_RAID_MAP_ALL *map)
        return le16_to_cpu(map->raidMap.ldSpanMap[ld].ldRaid.targetId);
 }
 
-u8 MR_TargetIdToLdGet(u32 ldTgtId, struct MR_DRV_RAID_MAP_ALL *map)
+u16 MR_TargetIdToLdGet(u32 ldTgtId, struct MR_DRV_RAID_MAP_ALL *map)
 {
        return map->raidMap.ldTgtIdToLd[ldTgtId];
 }
@@ -1151,7 +1151,7 @@ MR_BuildRaidContext(struct megasas_instance *instance,
 {
        struct fusion_context *fusion;
        struct MR_LD_RAID  *raid;
-       u32         ld, stripSize, stripe_mask;
+       u32         stripSize, stripe_mask;
        u64         endLba, endStrip, endRow, start_row, start_strip;
        u64         regStart;
        u32         regSize;
@@ -1163,6 +1163,7 @@ MR_BuildRaidContext(struct megasas_instance *instance,
        u8          retval = 0;
        u8          startlba_span = SPAN_INVALID;
        u64 *pdBlock = &io_info->pdBlock;
+       u16         ld;
 
        ldStartBlock = io_info->ldStartBlock;
        numBlocks = io_info->numBlocks;
diff --git a/drivers/scsi/megaraid/megaraid_sas_fusion.c 
b/drivers/scsi/megaraid/megaraid_sas_fusion.c
index 2f523f2..3d4d4b8 100644
--- a/drivers/scsi/megaraid/megaraid_sas_fusion.c
+++ b/drivers/scsi/megaraid/megaraid_sas_fusion.c
@@ -1120,7 +1120,8 @@ megasas_sync_map_info(struct megasas_instance *instance)
        int i;
        struct megasas_cmd *cmd;
        struct megasas_dcmd_frame *dcmd;
-       u32 size_sync_info, num_lds;
+       u16 num_lds;
+       u32 size_sync_info;
        struct fusion_context *fusion;
        struct MR_LD_TARGET_SYNC *ci = NULL;
        struct MR_DRV_RAID_MAP_ALL *map;
@@ -1867,7 +1868,7 @@ megasas_set_pd_lba(struct MPI2_RAID_SCSI_IO_REQUEST 
*io_request, u8 cdb_len,
                   struct MR_DRV_RAID_MAP_ALL *local_map_ptr, u32 ref_tag)
 {
        struct MR_LD_RAID *raid;
-       u32 ld;
+       u16 ld;
        u64 start_blk = io_info->pdBlock;
        u8 *cdb = io_request->CDB.CDB32;
        u32 num_blocks = io_info->numBlocks;
@@ -2300,10 +2301,11 @@ megasas_build_ldio_fusion(struct megasas_instance 
*instance,
 
        local_map_ptr = fusion->ld_drv_map[(instance->map_id & 1)];
        ld = MR_TargetIdToLdGet(device_id, local_map_ptr);
-       raid = MR_LdRaidGet(ld, local_map_ptr);
 
-       if ((MR_TargetIdToLdGet(device_id, local_map_ptr) >=
-               instance->fw_supported_vd_count) || (!fusion->fast_path_io)) {
+       if (ld < instance->fw_supported_vd_count)
+               raid = MR_LdRaidGet(ld, local_map_ptr);
+
+       if (!raid || (!fusion->fast_path_io)) {
                io_request->RaidContext.raid_context.reg_lock_flags  = 0;
                fp_possible = false;
        } else {
@@ -2475,12 +2477,12 @@ static void megasas_build_ld_nonrw_fusion(struct 
megasas_instance *instance,
 {
        u32 device_id;
        struct MPI2_RAID_SCSI_IO_REQUEST *io_request;
-       u16 pd_index = 0;
+       u16 pd_index = 0, ld;
        struct MR_DRV_RAID_MAP_ALL *local_map_ptr;
        struct fusion_context *fusion = instance->ctrl_context;
        u8                          span, physArm;
        __le16                      devHandle;
-       u32                         ld, arRef, pd;
+       u32                         arRef, pd;
        struct MR_LD_RAID                  *raid;
        struct RAID_CONTEXT                *pRAID_Context;
        u8 fp_possible = 1;
@@ -2503,10 +2505,11 @@ static void megasas_build_ld_nonrw_fusion(struct 
megasas_instance *instance,
                ld = MR_TargetIdToLdGet(device_id, local_map_ptr);
                if (ld >= instance->fw_supported_vd_count)
                        fp_possible = 0;
-
-               raid = MR_LdRaidGet(ld, local_map_ptr);
-               if (!(raid->capability.fpNonRWCapable))
-                       fp_possible = 0;
+               else {
+                       raid = MR_LdRaidGet(ld, local_map_ptr);
+                       if (!(raid->capability.fpNonRWCapable))
+                               fp_possible = 0;
+               }
        } else
                fp_possible = 0;
 
-- 
2.8.3

Reply via email to