From 09ef0593d474b642ee68269ed7508177099c468e Mon Sep 17 00:00:00 2001 From: Ben Walker Date: Thu, 27 Jun 2019 04:24:12 -0700 Subject: [PATCH] nvmf: Leverage bdev uuid to correctly detected remove+add ns while paused Change-Id: Idbf00956394f7ee7ff7e27f2627785cd7146b01f Signed-off-by: Ben Walker Reviewed-on: https://review.gerrithub.io/c/spdk/spdk/+/459605 Tested-by: SPDK CI Jenkins Reviewed-by: Changpeng Liu Reviewed-by: Paul Luse Reviewed-by: Shuhei Matsumoto Reviewed-by: Seth Howell --- lib/nvmf/nvmf.c | 14 ++++++++++++-- lib/nvmf/nvmf_internal.h | 1 + 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/lib/nvmf/nvmf.c b/lib/nvmf/nvmf.c index 8365261f4..cecb47d4e 100644 --- a/lib/nvmf/nvmf.c +++ b/lib/nvmf/nvmf.c @@ -954,13 +954,23 @@ poll_group_update_subsystem(struct spdk_nvmf_poll_group *group, return -ENOMEM; } ns_info->channel = ch; - } else { - /* A namespace was present before and didn't change. */ + } else if (spdk_uuid_compare(&ns_info->uuid, spdk_bdev_get_uuid(ns->bdev)) != 0) { + /* A namespace was here before, but was replaced by a new one. */ + spdk_put_io_channel(ns_info->channel); + memset(ns_info, 0, sizeof(*ns_info)); + + ch = spdk_bdev_get_io_channel(ns->desc); + if (ch == NULL) { + SPDK_ERRLOG("Could not allocate I/O channel.\n"); + return -ENOMEM; + } + ns_info->channel = ch; } if (ns == NULL) { memset(ns_info, 0, sizeof(*ns_info)); } else { + ns_info->uuid = *spdk_bdev_get_uuid(ns->bdev); ns_info->crkey = ns->crkey; ns_info->rtype = ns->rtype; if (ns->holder) { diff --git a/lib/nvmf/nvmf_internal.h b/lib/nvmf/nvmf_internal.h index c74bbfbd8..4d075fac4 100644 --- a/lib/nvmf/nvmf_internal.h +++ b/lib/nvmf/nvmf_internal.h @@ -132,6 +132,7 @@ struct spdk_nvmf_reservation_info { struct spdk_nvmf_subsystem_pg_ns_info { struct spdk_io_channel *channel; + struct spdk_uuid uuid; /* current reservation key, no reservation if the value is 0 */ uint64_t crkey; /* reservation type */