scsi: mpi3mr: Block devices are not removed even when VDs are offlined
authorRanjan Kumar <ranjan.kumar@broadcom.com>
Wed, 13 Mar 2024 10:07:40 +0000 (15:37 +0530)
committerMartin K. Petersen <martin.petersen@oracle.com>
Mon, 25 Mar 2024 22:14:32 +0000 (18:14 -0400)
The driver did not remove the virtual disk that was exposed as hidden and
offline after the controller was reset.

Drive is removed from OS when firmware sends "device added" event with
hidden bit set or access status indicating inability to accept I/Os.

Signed-off-by: Ranjan Kumar <ranjan.kumar@broadcom.com>
Signed-off-by: Sathya Prakash <sathya.prakash@broadcom.com>
Link: https://lore.kernel.org/r/20240313100746.128951-2-ranjan.kumar@broadcom.com
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/mpi3mr/mpi3mr.h
drivers/scsi/mpi3mr/mpi3mr_os.c

index 3de1ee05c44e4cfb3663acf13c98e2e8ff44bdbd..06359915a48d4b8c1daf7c4cc471b92024aa5f6a 100644 (file)
@@ -1348,7 +1348,7 @@ void mpi3mr_wait_for_host_io(struct mpi3mr_ioc *mrioc, u32 timeout);
 void mpi3mr_cleanup_fwevt_list(struct mpi3mr_ioc *mrioc);
 void mpi3mr_flush_host_io(struct mpi3mr_ioc *mrioc);
 void mpi3mr_invalidate_devhandles(struct mpi3mr_ioc *mrioc);
-void mpi3mr_rfresh_tgtdevs(struct mpi3mr_ioc *mrioc);
+void mpi3mr_refresh_tgtdevs(struct mpi3mr_ioc *mrioc);
 void mpi3mr_flush_delayed_cmd_lists(struct mpi3mr_ioc *mrioc);
 void mpi3mr_check_rh_fault_ioc(struct mpi3mr_ioc *mrioc, u32 reason_code);
 void mpi3mr_print_fault_info(struct mpi3mr_ioc *mrioc);
index 73c831a97d276a6f446ad22986cbc0e463fa4e9d..bfd32354b662f0d66ca187061300ee7d7121f9f1 100644 (file)
@@ -1029,7 +1029,7 @@ mpi3mr_update_sdev(struct scsi_device *sdev, void *data)
 }
 
 /**
- * mpi3mr_rfresh_tgtdevs - Refresh target device exposure
+ * mpi3mr_refresh_tgtdevs - Refresh target device exposure
  * @mrioc: Adapter instance reference
  *
  * This is executed post controller reset to identify any
@@ -1039,7 +1039,7 @@ mpi3mr_update_sdev(struct scsi_device *sdev, void *data)
  * Return: Nothing.
  */
 
-void mpi3mr_rfresh_tgtdevs(struct mpi3mr_ioc *mrioc)
+void mpi3mr_refresh_tgtdevs(struct mpi3mr_ioc *mrioc)
 {
        struct mpi3mr_tgt_dev *tgtdev, *tgtdev_next;
        struct mpi3mr_stgt_priv_data *tgt_priv;
@@ -1047,8 +1047,8 @@ void mpi3mr_rfresh_tgtdevs(struct mpi3mr_ioc *mrioc)
        dprint_reset(mrioc, "refresh target devices: check for removals\n");
        list_for_each_entry_safe(tgtdev, tgtdev_next, &mrioc->tgtdev_list,
            list) {
-               if ((tgtdev->dev_handle == MPI3MR_INVALID_DEV_HANDLE) &&
-                    tgtdev->is_hidden &&
+               if (((tgtdev->dev_handle == MPI3MR_INVALID_DEV_HANDLE) ||
+                    tgtdev->is_hidden) &&
                     tgtdev->host_exposed && tgtdev->starget &&
                     tgtdev->starget->hostdata) {
                        tgt_priv = tgtdev->starget->hostdata;
@@ -2010,7 +2010,7 @@ static void mpi3mr_fwevt_bh(struct mpi3mr_ioc *mrioc,
                        mpi3mr_refresh_sas_ports(mrioc);
                        mpi3mr_refresh_expanders(mrioc);
                }
-               mpi3mr_rfresh_tgtdevs(mrioc);
+               mpi3mr_refresh_tgtdevs(mrioc);
                ioc_info(mrioc,
                    "scan for non responding and newly added devices after soft reset completed\n");
                break;