scsi: mpi3mr: Enhance handling of devices removed after controller reset
authorRanjan Kumar <ranjan.kumar@broadcom.com>
Fri, 4 Aug 2023 10:42:47 +0000 (16:12 +0530)
committerMartin K. Petersen <martin.petersen@oracle.com>
Tue, 8 Aug 2023 01:41:48 +0000 (21:41 -0400)
Mark all of the devices that are exposed to the OS prior to a controller
reset and not detected by the controller after the reset as removed devices
and the I/Os to those devices are unblocked (and returned with
DID_NO_CONNECT) prior to removing the devices one after the other.

Signed-off-by: Ranjan Kumar <ranjan.kumar@broadcom.com>
Link: https://lore.kernel.org/r/20230804104248.118924-6-ranjan.kumar@broadcom.com
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/mpi3mr/mpi3mr_os.c

index fcf0888232e719dc44bdf88576d35b386d4bf5bf..89ba015c5d7e8d215d256aa92b3a65803b626a86 100644 (file)
@@ -1041,6 +1041,19 @@ mpi3mr_update_sdev(struct scsi_device *sdev, void *data)
 void mpi3mr_rfresh_tgtdevs(struct mpi3mr_ioc *mrioc)
 {
        struct mpi3mr_tgt_dev *tgtdev, *tgtdev_next;
+       struct mpi3mr_stgt_priv_data *tgt_priv;
+
+       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->host_exposed && tgtdev->starget &&
+                   tgtdev->starget->hostdata) {
+                       tgt_priv = tgtdev->starget->hostdata;
+                       tgt_priv->dev_removed = 1;
+                       atomic_set(&tgt_priv->block_io, 0);
+               }
+       }
 
        list_for_each_entry_safe(tgtdev, tgtdev_next, &mrioc->tgtdev_list,
            list) {