scsi: smartpqi: Correct driver removal with HBA disks
authorDon Brace <don.brace@microchip.com>
Wed, 11 Nov 2020 20:24:39 +0000 (14:24 -0600)
committerMartin K. Petersen <martin.petersen@oracle.com>
Tue, 17 Nov 2020 04:03:10 +0000 (23:03 -0500)
Correct rmmod hangs when using HBA disks with write cache enabled.

Do not set controller flag "in_shutdown" during rmmod. SCSI SYNCHRONIZE
CACHE(10) and SCSI SYNCHRONIZE CACHE(16) requests were blocked with
SCSI_MLQUEUE_HOST_BUSY.

Link: https://lore.kernel.org/r/160512627928.2359.10698615071827614781.stgit@brunhilda
Reviewed-by: Scott Benesh <scott.benesh@microchip.com>
Reviewed-by: Scott Teel <scott.teel@microchip.com>
Signed-off-by: Don Brace <don.brace@microchip.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/smartpqi/smartpqi_init.c

index 9d02296..531f108 100644 (file)
@@ -345,10 +345,9 @@ static inline void pqi_device_remove_start(struct pqi_scsi_dev *device)
        device->in_remove = true;
 }
 
-static inline bool pqi_device_in_remove(struct pqi_ctrl_info *ctrl_info,
-                                       struct pqi_scsi_dev *device)
+static inline bool pqi_device_in_remove(struct pqi_scsi_dev *device)
 {
-       return device->in_remove && !ctrl_info->in_shutdown;
+       return device->in_remove;
 }
 
 static inline void pqi_ctrl_shutdown_start(struct pqi_ctrl_info *ctrl_info)
@@ -5347,8 +5346,7 @@ static int pqi_scsi_queue_command(struct Scsi_Host *shost,
 
        atomic_inc(&device->scsi_cmds_outstanding);
 
-       if (pqi_ctrl_offline(ctrl_info) || pqi_device_in_remove(ctrl_info,
-                                                               device)) {
+       if (pqi_ctrl_offline(ctrl_info) || pqi_device_in_remove(device)) {
                set_host_byte(scmd, DID_NO_CONNECT);
                pqi_scsi_done(scmd);
                return 0;
@@ -8031,8 +8029,6 @@ static void pqi_pci_remove(struct pci_dev *pci_dev)
        if (!ctrl_info)
                return;
 
-       ctrl_info->in_shutdown = true;
-
        pqi_remove_ctrl(ctrl_info);
 }