Skip to content

Commit 4cb8aff

Browse files
committed
scsi: smartpqi: Take drives offline when controller is offline
JIRA: https://issues.redhat.com/browse/RHEL-96279 commit 32c79c2 Author: David Strahan <david.strahan@microchip.com> Date: Wed Apr 23 13:32:25 2025 -0500 scsi: smartpqi: Take drives offline when controller is offline During a controller lockup, the physical and logical drives under the locked up controller are still listed at the OS level. I.e. the controller is offline but the status of each drive is 'running'. When the controller is unexpectedly taken offline, show its drives as offline. Reviewed-by: Scott Benesh <scott.benesh@microchip.com> Reviewed-by: Mike McGowen <mike.mcgowen@microchip.com> Signed-off-by: David Strahan <david.strahan@microchip.com> Co-developed-by: Don Brace <don.brace@microchip.com> Signed-off-by: Don Brace <don.brace@microchip.com> Link: https://lore.kernel.org/r/20250423183229.538572-2-don.brace@microchip.com Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com> Signed-off-by: Don Brace <dbrace@redhat.com>
1 parent a3dc24b commit 4cb8aff

File tree

1 file changed

+23
-0
lines changed

1 file changed

+23
-0
lines changed

drivers/scsi/smartpqi/smartpqi_init.c

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ static struct pqi_cmd_priv *pqi_cmd_priv(struct scsi_cmnd *cmd)
6868
static void pqi_verify_structures(void);
6969
static void pqi_take_ctrl_offline(struct pqi_ctrl_info *ctrl_info,
7070
enum pqi_ctrl_shutdown_reason ctrl_shutdown_reason);
71+
static void pqi_take_ctrl_devices_offline(struct pqi_ctrl_info *ctrl_info);
7172
static void pqi_ctrl_offline_worker(struct work_struct *work);
7273
static int pqi_scan_scsi_devices(struct pqi_ctrl_info *ctrl_info);
7374
static void pqi_scan_start(struct Scsi_Host *shost);
@@ -9129,6 +9130,7 @@ static void pqi_take_ctrl_offline_deferred(struct pqi_ctrl_info *ctrl_info)
91299130
pqi_ctrl_wait_until_quiesced(ctrl_info);
91309131
pqi_fail_all_outstanding_requests(ctrl_info);
91319132
pqi_ctrl_unblock_requests(ctrl_info);
9133+
pqi_take_ctrl_devices_offline(ctrl_info);
91329134
}
91339135

91349136
static void pqi_ctrl_offline_worker(struct work_struct *work)
@@ -9203,6 +9205,27 @@ static void pqi_take_ctrl_offline(struct pqi_ctrl_info *ctrl_info,
92039205
schedule_work(&ctrl_info->ctrl_offline_work);
92049206
}
92059207

9208+
static void pqi_take_ctrl_devices_offline(struct pqi_ctrl_info *ctrl_info)
9209+
{
9210+
int rc;
9211+
unsigned long flags;
9212+
struct pqi_scsi_dev *device;
9213+
9214+
spin_lock_irqsave(&ctrl_info->scsi_device_list_lock, flags);
9215+
list_for_each_entry(device, &ctrl_info->scsi_device_list, scsi_device_list_entry) {
9216+
rc = list_is_last(&device->scsi_device_list_entry, &ctrl_info->scsi_device_list);
9217+
if (rc)
9218+
continue;
9219+
9220+
/*
9221+
* Is the sdev pointer NULL?
9222+
*/
9223+
if (device->sdev)
9224+
scsi_device_set_state(device->sdev, SDEV_OFFLINE);
9225+
}
9226+
spin_unlock_irqrestore(&ctrl_info->scsi_device_list_lock, flags);
9227+
}
9228+
92069229
static void pqi_print_ctrl_info(struct pci_dev *pci_dev,
92079230
const struct pci_device_id *id)
92089231
{

0 commit comments

Comments
 (0)