nvme: fix RCU hole that allowed for endless looping in multipath round robin
authorChris Leech <cleech@redhat.com>
Mon, 21 Mar 2022 22:43:04 +0000 (15:43 -0700)
committerChristoph Hellwig <hch@lst.de>
Tue, 29 Mar 2022 07:29:06 +0000 (09:29 +0200)
commitd6d6742772d712ed2238f5071b96baf4924f5fad
tree6ad2d1225360875a18a3da8ef9a0e67ac9fecb0e
parent5974ea7ce0f9a5987fc8cf5e08ad6e3e70bb542e
nvme: fix RCU hole that allowed for endless looping in multipath round robin

Make nvme_ns_remove match the assumptions elsewhere.

1) !NVME_NS_READY needs to be srcu synchronized to make sure nothing is
   running in __nvme_find_path or nvme_round_robin_path that will
   re-assign this ns to current_path.

2) Any matching current_path entries need to be cleared before removing
   from the siblings list, to prevent calling nvme_round_robin_path with
   an "old" ns that's off list.

3) Finally the list_del_rcu can happen, and then synchronize again
   before releasing any reference counts.

Signed-off-by: Christoph Hellwig <hch@lst.de>
drivers/nvme/host/core.c