nvmet-fc: defer cleanup using RCU properly
authorDaniel Wagner <dwagner@suse.de>
Wed, 31 Jan 2024 08:51:04 +0000 (09:51 +0100)
committerKeith Busch <kbusch@kernel.org>
Thu, 1 Feb 2024 15:44:46 +0000 (07:44 -0800)
commit4049dc96b8de7aeb3addcea039446e464726a525
tree67271aebd870c8932cc8794b66df2007f4a434ed
parentc691e6d7e13dab81ac8c7489c83b5dea972522a5
nvmet-fc: defer cleanup using RCU properly

When the target executes a disconnect and the host triggers a reconnect
immediately, the reconnect command still finds an existing association.

The reconnect crashes later on because nvmet_fc_delete_target_assoc
blindly removes resources while the reconnect code wants to use it.

To address this, nvmet_fc_find_target_assoc should not be able to
lookup an association which is being removed. The association list
is already under RCU lifetime management, so let's properly use it
and remove the association from the list and wait for a grace period
before cleaning up all. This means we also can drop the RCU management
on the queues, because this is now handled via the association itself.

A second step split the execution context so that the initial disconnect
command can complete without running the reconnect code in the same
context. As usual, this is done by deferring the ->done to a workqueue.

Reviewed-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Hannes Reinecke <hare@suse.de>
Signed-off-by: Daniel Wagner <dwagner@suse.de>
Signed-off-by: Keith Busch <kbusch@kernel.org>
drivers/nvme/target/fc.c