forked from Minki/linux
scsi: smartpqi: Avoid failing I/Os for offline devices
Prevent kernel crash by failing outstanding I/O request when the OS takes device offline. When posted I/Os to the controller's inbound queue are not picked by the controller, the driver will halt the controller and take the controller offline. When the driver takes the controller offline, the driver will fail all the outstanding requests which can sometimes lead to an OS crash. Link: https://lore.kernel.org/r/20210928235442.201875-7-don.brace@microchip.com Reviewed-by: Scott Benesh <scott.benesh@microchip.com> Reviewed-by: Scott Teel <scott.teel@microchip.com> Acked-by: John Donnelly <john.p.donnelly@oracle.com> Signed-off-by: Mahesh Rajashekhara <mahesh.rajashekhara@microchip.com> Signed-off-by: Don Brace <don.brace@microchip.com> Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
This commit is contained in:
parent
be76f90668
commit
4f3cefc308
@ -8544,6 +8544,7 @@ static void pqi_fail_all_outstanding_requests(struct pqi_ctrl_info *ctrl_info)
|
||||
unsigned int i;
|
||||
struct pqi_io_request *io_request;
|
||||
struct scsi_cmnd *scmd;
|
||||
struct scsi_device *sdev;
|
||||
|
||||
for (i = 0; i < ctrl_info->max_io_slots; i++) {
|
||||
io_request = &ctrl_info->io_request_pool[i];
|
||||
@ -8552,7 +8553,13 @@ static void pqi_fail_all_outstanding_requests(struct pqi_ctrl_info *ctrl_info)
|
||||
|
||||
scmd = io_request->scmd;
|
||||
if (scmd) {
|
||||
set_host_byte(scmd, DID_NO_CONNECT);
|
||||
sdev = scmd->device;
|
||||
if (!sdev || !scsi_device_online(sdev)) {
|
||||
pqi_free_io_request(io_request);
|
||||
continue;
|
||||
} else {
|
||||
set_host_byte(scmd, DID_NO_CONNECT);
|
||||
}
|
||||
} else {
|
||||
io_request->status = -ENXIO;
|
||||
io_request->error_info =
|
||||
|
Loading…
Reference in New Issue
Block a user