megasas_get_map_info() might fail, after which it'll be
pointless to call megasas_sync_map_info().
So update megasas_get_map_info() to correctly handle errors
and call megasas_sync_map_info() only if no error occurred.

Cc: Kashyap Desai <kashyap.de...@lsi.com>
Cc: Adam Radford <aradf...@gmail.com>
Signed-off-by: Hannes Reinecke <h...@suse.de>
---
 drivers/scsi/megaraid/megaraid_sas_base.c   |  5 ++--
 drivers/scsi/megaraid/megaraid_sas_fusion.c | 41 ++++++++++++++++-------------
 2 files changed, 26 insertions(+), 20 deletions(-)

diff --git a/drivers/scsi/megaraid/megaraid_sas_base.c 
b/drivers/scsi/megaraid/megaraid_sas_base.c
index 95d4e5c..d17a097 100644
--- a/drivers/scsi/megaraid/megaraid_sas_base.c
+++ b/drivers/scsi/megaraid/megaraid_sas_base.c
@@ -4689,8 +4689,9 @@ megasas_resume(struct pci_dev *pdev)
                        megasas_free_cmds_fusion(instance);
                        goto fail_init_mfi;
                }
-               if (!megasas_get_map_info(instance))
-                       megasas_sync_map_info(instance);
+               if (megasas_get_map_info(instance) < 0)
+                       goto fail_init_mfi;
+               megasas_sync_map_info(instance);
        }
        break;
        default:
diff --git a/drivers/scsi/megaraid/megaraid_sas_fusion.c 
b/drivers/scsi/megaraid/megaraid_sas_fusion.c
index 5c30f9d..be6de80 100644
--- a/drivers/scsi/megaraid/megaraid_sas_fusion.c
+++ b/drivers/scsi/megaraid/megaraid_sas_fusion.c
@@ -773,15 +773,16 @@ u8
 megasas_get_map_info(struct megasas_instance *instance)
 {
        struct fusion_context *fusion = instance->ctrl_context;
+       int rc;
 
        fusion->fast_path_io = 0;
-       if (!megasas_get_ld_map_info(instance)) {
-               if (MR_ValidateMapInfo(instance)) {
-                       fusion->fast_path_io = 1;
-                       return 0;
-               }
-       }
-       return 1;
+       rc = megasas_get_ld_map_info(instance);
+       if (rc < 0)
+               return rc;
+
+       if (MR_ValidateMapInfo(instance))
+               fusion->fast_path_io = 1;
+       return 0;
 }
 
 /*
@@ -807,6 +808,14 @@ megasas_sync_map_info(struct megasas_instance *instance)
        dma_addr_t ci_h = 0;
        u32 size_map_info;
 
+       fusion = instance->ctrl_context;
+       if (!fusion)
+               return -ENXIO;
+
+       if (!fusion->fast_path_io)
+               return 0;
+
+
        cmd = megasas_get_cmd(instance);
 
        if (!cmd) {
@@ -815,13 +824,6 @@ megasas_sync_map_info(struct megasas_instance *instance)
                return -ENOMEM;
        }
 
-       fusion = instance->ctrl_context;
-
-       if (!fusion) {
-               megasas_return_cmd(instance, cmd);
-               return 1;
-       }
-
        map = fusion->ld_map[instance->map_id & 1];
 
        num_lds = le32_to_cpu(map->raidMap.ldCount);
@@ -1030,8 +1032,10 @@ megasas_init_adapter_fusion(struct megasas_instance 
*instance)
                }
        }
 
-       if (!megasas_get_map_info(instance))
-               megasas_sync_map_info(instance);
+       if (megasas_get_map_info(instance) < 0)
+               goto fail_map_info;
+
+       megasas_sync_map_info(instance);
 
        return 0;
 
@@ -2457,8 +2461,9 @@ int megasas_reset_fusion(struct Scsi_Host *shost)
                               sizeof(struct LD_LOAD_BALANCE_INFO)
                               *MAX_LOGICAL_DRIVES);
 
-                       if (!megasas_get_map_info(instance))
-                               megasas_sync_map_info(instance);
+                       if (megasas_get_map_info(instance) < 0)
+                               break;
+                       megasas_sync_map_info(instance);
 
                        /* Adapter reset completed successfully */
                        printk(KERN_WARNING "megaraid_sas: Reset "
-- 
1.7.12.4

--
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to