Commit 1bdf6e93 authored by Don Brace's avatar Don Brace Committed by Martin K. Petersen

scsi: smartpqi: Correct driver removal with HBA disks

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@brunhildaReviewed-by: default avatarScott Benesh <scott.benesh@microchip.com>
Reviewed-by: default avatarScott Teel <scott.teel@microchip.com>
Signed-off-by: default avatarDon Brace <don.brace@microchip.com>
Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
parent a364a3ea
...@@ -345,10 +345,9 @@ static inline void pqi_device_remove_start(struct pqi_scsi_dev *device) ...@@ -345,10 +345,9 @@ static inline void pqi_device_remove_start(struct pqi_scsi_dev *device)
device->in_remove = true; device->in_remove = true;
} }
static inline bool pqi_device_in_remove(struct pqi_ctrl_info *ctrl_info, static inline bool pqi_device_in_remove(struct pqi_scsi_dev *device)
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) 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, ...@@ -5347,8 +5346,7 @@ static int pqi_scsi_queue_command(struct Scsi_Host *shost,
atomic_inc(&device->scsi_cmds_outstanding); atomic_inc(&device->scsi_cmds_outstanding);
if (pqi_ctrl_offline(ctrl_info) || pqi_device_in_remove(ctrl_info, if (pqi_ctrl_offline(ctrl_info) || pqi_device_in_remove(device)) {
device)) {
set_host_byte(scmd, DID_NO_CONNECT); set_host_byte(scmd, DID_NO_CONNECT);
pqi_scsi_done(scmd); pqi_scsi_done(scmd);
return 0; return 0;
...@@ -8031,8 +8029,6 @@ static void pqi_pci_remove(struct pci_dev *pci_dev) ...@@ -8031,8 +8029,6 @@ static void pqi_pci_remove(struct pci_dev *pci_dev)
if (!ctrl_info) if (!ctrl_info)
return; return;
ctrl_info->in_shutdown = true;
pqi_remove_ctrl(ctrl_info); pqi_remove_ctrl(ctrl_info);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment