Skip to content

Commit 32c79c2

Browse files
David Strahanmartinkpetersen
authored andcommitted
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>
1 parent 0af2f6b commit 32c79c2

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
@@ -67,6 +67,7 @@ static struct pqi_cmd_priv *pqi_cmd_priv(struct scsi_cmnd *cmd)
6767
static void pqi_verify_structures(void);
6868
static void pqi_take_ctrl_offline(struct pqi_ctrl_info *ctrl_info,
6969
enum pqi_ctrl_shutdown_reason ctrl_shutdown_reason);
70+
static void pqi_take_ctrl_devices_offline(struct pqi_ctrl_info *ctrl_info);
7071
static void pqi_ctrl_offline_worker(struct work_struct *work);
7172
static int pqi_scan_scsi_devices(struct pqi_ctrl_info *ctrl_info);
7273
static void pqi_scan_start(struct Scsi_Host *shost);
@@ -9128,6 +9129,7 @@ static void pqi_take_ctrl_offline_deferred(struct pqi_ctrl_info *ctrl_info)
91289129
pqi_ctrl_wait_until_quiesced(ctrl_info);
91299130
pqi_fail_all_outstanding_requests(ctrl_info);
91309131
pqi_ctrl_unblock_requests(ctrl_info);
9132+
pqi_take_ctrl_devices_offline(ctrl_info);
91319133
}
91329134

91339135
static void pqi_ctrl_offline_worker(struct work_struct *work)
@@ -9202,6 +9204,27 @@ static void pqi_take_ctrl_offline(struct pqi_ctrl_info *ctrl_info,
92029204
schedule_work(&ctrl_info->ctrl_offline_work);
92039205
}
92049206

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

0 commit comments

Comments
 (0)