Commit 4e0a5171 authored by Murthy Bhat's avatar Murthy Bhat Committed by Martin K. Petersen
Browse files

scsi: smartpqi: fix rare system hang during LUN reset



Correct a rare case where in a LUN reset occurs on a device and I/O
requests for other devices persist in the driver's internal request queue.

Part of a LUN reset involves waiting for our internal request queue to
empty before proceeding. The internal request queue contains requests not
yet sent down to the controller.

We were clearing the requests queued for the LUN undergoing a reset, but
not all of the queued requests. Causing a hang.

For all requests in our internal request queue:

   Complete requests with DID_RESET for queued requests for the device
   undergoing a reset.

   Complete requests with DID_REQUEUE for all other queued requests.

Reviewed-by: default avatarScott Benesh <scott.benesh@microchip.com>
Reviewed-by: default avatarScott Teel <scott.teel@microchip.com>
Reviewed-by: default avatarMike McGowen <mike.mcgowen@microchip.com>
Signed-off-by: default avatarMurthy Bhat <Murthy.Bhat@microchip.com>
Signed-off-by: default avatarDon Brace <don.brace@microchip.com>
Link: https://lore.kernel.org/r/20240827185501.692804-6-don.brace@microchip.com


Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
parent dbc39b84
Loading
Loading
Loading
Loading
+4 −6
Original line number Diff line number Diff line
@@ -6200,14 +6200,12 @@ static void pqi_fail_io_queued_for_device(struct pqi_ctrl_info *ctrl_info,
					continue;

				scsi_device = scmd->device->hostdata;
				if (scsi_device != device)
					continue;

				if ((u8)scmd->device->lun != lun)
					continue;

				list_del(&io_request->request_list_entry);
				if (scsi_device == device && (u8)scmd->device->lun == lun)
					set_host_byte(scmd, DID_RESET);
				else
					set_host_byte(scmd, DID_REQUEUE);
				pqi_free_io_request(io_request);
				scsi_dma_unmap(scmd);
				pqi_scsi_done(scmd);