linux-uconsole/include/scsi
Mike Christie 45226fac4d scsi: iscsi: Fix conn cleanup and stop race during iscsid restart
[ Upstream commit 7c6e99c181 ]

If iscsid is doing a stop_conn at the same time the kernel is starting
error recovery we can hit a race that allows the cleanup work to run on a
valid connection. In the race, iscsi_if_stop_conn sees the cleanup bit set,
but it calls flush_work on the clean_work before iscsi_conn_error_event has
queued it. The flush then returns before the queueing and so the
cleanup_work can run later and disconnect/stop a conn while it's in a
connected state.

The patch:

Commit 0ab710458d ("scsi: iscsi: Perform connection failure entirely in
kernel space")

added the late stop_conn call bug originally, and the patch:

Commit 23d6fefbb3 ("scsi: iscsi: Fix in-kernel conn failure handling")

attempted to fix it but only fixed the normal EH case and left the above
race for the iscsid restart case. For the normal EH case we don't hit the
race because we only signal userspace to start recovery after we have done
the queueing, so the flush will always catch the queued work or see it
completed.

For iscsid restart cases like boot, we can hit the race because iscsid will
call down to the kernel before the kernel has signaled any error, so both
code paths can be running at the same time. This adds a lock around the
setting of the cleanup bit and queueing so they happen together.

Link: https://lore.kernel.org/r/20220408001314.5014-6-michael.christie@oracle.com
Fixes: 0ab710458d ("scsi: iscsi: Perform connection failure entirely in kernel space")
Tested-by: Manish Rangankar <mrangankar@marvell.com>
Reviewed-by: Lee Duncan <lduncan@suse.com>
Reviewed-by: Chris Leech <cleech@redhat.com>
Signed-off-by: Mike Christie <michael.christie@oracle.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
2022-04-20 09:23:17 +02:00
..
fc scsi: fc: Correct RHBA attributes length 2021-07-14 16:56:52 +02:00
fc_encode.h treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 335 2019-06-05 17:37:06 +02:00
fc_frame.h treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 335 2019-06-05 17:37:06 +02:00
fcoe_sysfs.h treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 335 2019-06-05 17:37:06 +02:00
iscsi_if.h scsi: iscsi: Add support for asynchronous iSCSI session destruction 2020-03-11 23:07:57 -04:00
iscsi_proto.h scsi: Revert "target: iscsi: Wait for all commands to finish before freeing a session" 2020-02-14 17:13:54 -05:00
iser.h
libfc.h scsi: libfc: Whitespace cleanup in libfc.h 2019-07-29 20:43:06 -04:00
libfcoe.h Fix misc new gcc warnings 2021-05-11 14:47:36 +02:00
libiscsi.h scsi: iscsi: Stop queueing during ep_disconnect 2022-04-20 09:23:15 +02:00
libiscsi_tcp.h SCSI misc on 20190709 2019-07-11 15:14:01 -07:00
libsas.h scsi: libsas: Introduce a _gfp() variant of event notifiers 2021-03-25 09:04:11 +01:00
sas.h scsi: libsas: Replace zero-length array with flexible-array 2020-05-11 22:26:32 -04:00
sas_ata.h treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 156 2019-05-30 11:26:35 -07:00
scsi.h scsi: libsas: Remove scsi_to_u32() 2019-01-29 00:46:22 -05:00
scsi_bsg_iscsi.h scsi: Replace zero-length array with flexible-array member 2020-03-11 23:07:56 -04:00
scsi_cmnd.h scsi: core: Clean up allocation and freeing of sgtables 2020-10-07 21:48:27 -04:00
scsi_common.h scsi: target: core: Add CONTROL field for trace events 2020-10-02 18:36:19 -04:00
scsi_dbg.h scsi: core: Reduce memory required for SCSI logging 2019-08-07 21:47:29 -04:00
scsi_device.h scsi: core: Only re-run queue in scsi_end_request() if device queue is busy 2020-09-15 22:20:11 -04:00
scsi_devinfo.h
scsi_dh.h treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 156 2019-05-30 11:26:35 -07:00
scsi_driver.h scsi: return blk_status_t from scsi_init_io and ->init_command 2018-11-09 19:17:14 -07:00
scsi_eh.h scsi: core: save/restore command resid for error handling 2019-10-03 21:43:04 -04:00
scsi_host.h scsi: Add host and host template flag 'host_tagset' 2020-10-06 08:33:44 -06:00
scsi_ioctl.h scsi: Replace zero-length array with flexible-array member 2020-03-11 23:07:56 -04:00
scsi_proto.h
scsi_request.h
scsi_tcq.h scsi: core: Only return started requests from scsi_host_find_tag() 2020-07-24 22:09:56 -04:00
scsi_transport.h SCSI misc on 20190709 2019-07-11 15:14:01 -07:00
scsi_transport_fc.h scsi: fc: Add 256GBit speed setting to SCSI FC transport 2020-09-02 22:49:07 -04:00
scsi_transport_iscsi.h scsi: iscsi: Fix conn cleanup and stop race during iscsid restart 2022-04-20 09:23:17 +02:00
scsi_transport_sas.h
scsi_transport_spi.h treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 156 2019-05-30 11:26:35 -07:00
scsi_transport_srp.h
scsicam.h scsi: simplify scsi_partsize 2020-03-24 07:57:07 -06:00
sg.h scsi: docs: convert scsi-generic.txt to ReST 2020-03-11 23:08:02 -04:00
srp.h scsi: Replace zero-length array with flexible-array member 2020-03-11 23:07:56 -04:00
viosrp.h treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 157 2019-05-30 11:26:37 -07:00