]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
scsi: smartpqi: fix volume size updates
authorDon Brace <don.brace@microchip.com>
Tue, 27 Aug 2024 18:55:00 +0000 (13:55 -0500)
committerMartin K. Petersen <martin.petersen@oracle.com>
Thu, 29 Aug 2024 02:10:34 +0000 (22:10 -0400)
Correct logical volume size changes by moving the check for a volume rescan
outside of the check for a queue depth change.

Signed-off-by: Don Brace <don.brace@microchip.com>
Link: https://lore.kernel.org/r/20240827185501.692804-7-don.brace@microchip.com
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/smartpqi/smartpqi_init.c

index d1d117d5d08dcbbdc2c822aec1f14425ff7e4670..0dab30753f0ac082da6f8555c13472cdef09c9c8 100644 (file)
@@ -2303,17 +2303,23 @@ static void pqi_update_device_list(struct pqi_ctrl_info *ctrl_info,
         * queue depth, device size.
         */
        list_for_each_entry(device, &ctrl_info->scsi_device_list, scsi_device_list_entry) {
+               /*
+                * Check for queue depth change.
+                */
                if (device->sdev && device->queue_depth != device->advertised_queue_depth) {
                        device->advertised_queue_depth = device->queue_depth;
                        scsi_change_queue_depth(device->sdev, device->advertised_queue_depth);
-                       spin_lock_irqsave(&ctrl_info->scsi_device_list_lock, flags);
-                       if (pqi_volume_rescan_needed(device)) {
-                               device->rescan = false;
-                               spin_unlock_irqrestore(&ctrl_info->scsi_device_list_lock, flags);
-                               scsi_rescan_device(device->sdev);
-                       } else {
-                               spin_unlock_irqrestore(&ctrl_info->scsi_device_list_lock, flags);
-                       }
+               }
+               spin_lock_irqsave(&ctrl_info->scsi_device_list_lock, flags);
+               /*
+                * Check for changes in the device, such as size.
+                */
+               if (pqi_volume_rescan_needed(device)) {
+                       device->rescan = false;
+                       spin_unlock_irqrestore(&ctrl_info->scsi_device_list_lock, flags);
+                       scsi_rescan_device(device->sdev);
+               } else {
+                       spin_unlock_irqrestore(&ctrl_info->scsi_device_list_lock, flags);
                }
        }