linux/drivers/nvme/host
Daniel Wagner 888bcd6c58 nvme-fc: rely on state transitions to handle connectivity loss
commit f13409bb3f upstream.

It's not possible to call nvme_state_ctrl_state with holding a spin
lock, because nvme_state_ctrl_state calls cancel_delayed_work_sync
when fastfail is enabled.

Instead syncing the ASSOC_FLAG and state transitions using a lock, it's
possible to only rely on the state machine transitions. That means
nvme_fc_ctrl_connectivity_loss should unconditionally call
nvme_reset_ctrl which avoids the read race on the ctrl state variable.
Actually, it's not necessary to test in which state the ctrl is, the
reset work will only scheduled when the state machine is in LIVE state.

In nvme_fc_create_association, the LIVE state can only be entered if it
was previously CONNECTING. If this is not possible then the reset
handler got triggered. Thus just error out here.

Fixes: ee59e3820c ("nvme-fc: do not ignore connectivity loss during connecting")
Closes: https://lore.kernel.org/all/denqwui6sl5erqmz2gvrwueyxakl5txzbbiu3fgebryzrfxunm@iwxuthct377m/
Reported-by: Shinichiro Kawasaki <shinichiro.kawasaki@wdc.com>
Tested-by: Shin'ichiro Kawasaki <shinichiro.kawasaki@wdc.com>
Reviewed-by: Sagi Grimberg <sagi@grimberg.me>
Signed-off-by: Daniel Wagner <wagi@kernel.org>
Signed-off-by: Keith Busch <kbusch@kernel.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
History 2025-03-22 12:54:28 -07:00
..
apple.c block: change blk_mq_add_to_batch() third argument type to bool 2025-03-22 12:54:27 -07:00
auth.c move asm/unaligned.h to linux/unaligned.h 2024-10-02 17:23:23 -04:00
constants.c nvme: fix status magic numbers 2024-06-24 12:53:42 -07:00
core.c nvme: move error logging from nvme_end_req() to __nvme_end_req() 2025-03-22 12:54:26 -07:00
fabrics.c nvme-tcp: check for invalidated or revoked key 2024-08-22 13:25:07 -07:00
fabrics.h nvme-pci: do not directly handle subsys reset fallout 2024-06-26 07:02:22 -07:00
fault_inject.c fault-inject: improve build for CONFIG_FAULT_INJECTION=n 2024-09-01 20:43:33 -07:00
fc.c nvme-fc: rely on state transitions to handle connectivity loss 2025-03-22 12:54:28 -07:00
fc.h nvme-fc: Update header and host for common definitions for LS handling 2020-05-09 16:18:33 -06:00
hwmon.c move asm/unaligned.h to linux/unaligned.h 2024-10-02 17:23:23 -04:00
ioctl.c nvme-ioctl: fix leaked requests on mapping error 2025-03-13 13:02:01 +01:00
Kconfig nvme-tcp: fix link failure for TCP auth 2024-09-10 07:41:07 -07:00
Makefile nvme: rework NVME_AUTH Kconfig selection 2023-10-12 08:04:49 -07:00
multipath.c nvme/multipath: Fix RCU list traversal to use SRCU primitive 2024-12-05 14:03:05 +01:00
nvme.h nvme-pci: add support for sgl metadata 2025-03-13 13:02:01 +01:00
pci.c block: change blk_mq_add_to_batch() third argument type to bool 2025-03-22 12:54:27 -07:00
pr.c move asm/unaligned.h to linux/unaligned.h 2024-10-02 17:23:23 -04:00
rdma.c nvme-rdma: unquiesce admin_q before destroy it 2024-12-14 20:03:17 +01:00
sysfs.c nvme: make nvme_tls_attrs_group static 2025-02-17 10:04:59 +01:00
tcp.c nvme-tcp: Fix a C2HTermReq error message 2025-03-13 13:02:18 +01:00
trace.c move asm/unaligned.h to linux/unaligned.h 2024-10-02 17:23:23 -04:00
trace.h nvme: fix async event trace event 2023-04-13 08:59:04 +02:00
zns.c block: Remove REQ_OP_ZONE_RESET_ALL emulation 2024-07-05 00:42:04 -06:00