Commit becf0996 authored by Fedor Kukso's avatar Fedor Kukso Committed by Tomasz Zawadzki
Browse files

bdev/nvme: fix hang in destruct when NS replaced after reconnect



When an NVMe-oF controller reconnects, SPDK may create a new struct spdk_nvme_ns
for the same NSID while the bdev still holds a pointer to the previous namespace
object.

Fixes: #3714

Change-Id: I1992868dd514c63370977ccc552c986500bb9568
Signed-off-by: default avatarFedor Kukso <kukso.f@xinnor.io>
Reviewed-on: https://review.spdk.io/c/spdk/spdk/+/26433


Community-CI: Mellanox Build Bot
Tested-by: default avatarSPDK Automated Test System <spdkbot@gmail.com>
Reviewed-by: default avatarJim Harris <jim.harris@nvidia.com>
Reviewed-by: default avatarChangpeng Liu <changpeliu@tencent.com>
parent a0b98cc6
Loading
Loading
Loading
Loading
+4 −1
Original line number Diff line number Diff line
@@ -1917,7 +1917,10 @@ bdev_nvme_destruct(void *ctx)

		assert(nvme_ns->id > 0);

		if (nvme_ctrlr_get_ns(nvme_ns->ctrlr, nvme_ns->id) == NULL) {
		/* A new namespace object with the same NSID may have been created after reconnect.
		 * In that case, ignore the new one and continue destroying the original namespace.
		 */
		if (nvme_ctrlr_get_ns(nvme_ns->ctrlr, nvme_ns->id) != nvme_ns) {
			pthread_mutex_unlock(&nvme_ns->ctrlr->mutex);

			nvme_ctrlr_put_ref(nvme_ns->ctrlr);