From 7f5864be205532fe530a57a320081d87f13eab64 Mon Sep 17 00:00:00 2001 From: Cunyin Chang Date: Thu, 14 Dec 2017 10:38:18 +0800 Subject: [PATCH] nvmf: Add public interface of remove ns from subsystem. Change-Id: I9c2746dd54a13f3dae0ac2bab1d5fced931e8591 Signed-off-by: Cunyin Chang Reviewed-on: https://review.gerrithub.io/391699 Tested-by: SPDK Automated Test System Reviewed-by: Ben Walker Reviewed-by: Daniel Verkamp --- include/spdk/nvmf.h | 10 +++++ lib/nvmf/nvmf.c | 17 +++++++ lib/nvmf/nvmf_internal.h | 3 +- lib/nvmf/subsystem.c | 44 +++++++++++++++++++ .../ctrlr_discovery.c/ctrlr_discovery_ut.c | 7 +++ test/unit/lib/nvmf/subsystem.c/subsystem_ut.c | 7 +++ 6 files changed, 87 insertions(+), 1 deletion(-) diff --git a/include/spdk/nvmf.h b/include/spdk/nvmf.h index cd5389f4c..6ab8d0a17 100644 --- a/include/spdk/nvmf.h +++ b/include/spdk/nvmf.h @@ -286,6 +286,16 @@ const struct spdk_nvme_transport_id *spdk_nvmf_listener_get_trid( uint32_t spdk_nvmf_subsystem_add_ns(struct spdk_nvmf_subsystem *subsystem, struct spdk_bdev *bdev, uint32_t nsid); +/** + * Remove a namespace from a subsytem. + * + * \param subsystem Subsystem the namespace belong to. + * \param nsid Namespace ID to be removed. + * + * \return 0 on success or -1 on failure. + */ +int spdk_nvmf_subsystem_remove_ns(struct spdk_nvmf_subsystem *subsystem, uint32_t nsid); + /** * Return the first allocated namespace in a subsystem. * diff --git a/lib/nvmf/nvmf.c b/lib/nvmf/nvmf.c index 87598814f..828f5614d 100644 --- a/lib/nvmf/nvmf.c +++ b/lib/nvmf/nvmf.c @@ -457,6 +457,23 @@ spdk_nvmf_poll_group_add_subsystem(struct spdk_nvmf_poll_group *group, return 0; } +int +spdk_nvmf_poll_group_remove_ns(struct spdk_nvmf_poll_group *group, + struct spdk_nvmf_ns *ns) +{ + struct spdk_nvmf_subsystem_poll_group *sgroup; + uint32_t nsid = ns->id - 1; + + sgroup = &group->sgroups[ns->subsystem->id]; + + if (sgroup->channels[nsid]) { + spdk_put_io_channel(sgroup->channels[nsid]); + sgroup->channels[nsid] = NULL; + } + + return 0; +} + int spdk_nvmf_poll_group_remove_subsystem(struct spdk_nvmf_poll_group *group, struct spdk_nvmf_subsystem *subsystem) diff --git a/lib/nvmf/nvmf_internal.h b/lib/nvmf/nvmf_internal.h index e3f1790b6..008a66023 100644 --- a/lib/nvmf/nvmf_internal.h +++ b/lib/nvmf/nvmf_internal.h @@ -220,7 +220,8 @@ int spdk_nvmf_poll_group_remove_subsystem(struct spdk_nvmf_poll_group *group, int spdk_nvmf_poll_group_add_ns(struct spdk_nvmf_poll_group *group, struct spdk_nvmf_subsystem *subsystem, struct spdk_nvmf_ns *ns); - +int spdk_nvmf_poll_group_remove_ns(struct spdk_nvmf_poll_group *group, + struct spdk_nvmf_ns *ns); void spdk_nvmf_request_exec(struct spdk_nvmf_request *req); int spdk_nvmf_request_complete(struct spdk_nvmf_request *req); int spdk_nvmf_request_abort(struct spdk_nvmf_request *req); diff --git a/lib/nvmf/subsystem.c b/lib/nvmf/subsystem.c index 4661a5f7c..bff5e9fc6 100644 --- a/lib/nvmf/subsystem.c +++ b/lib/nvmf/subsystem.c @@ -426,6 +426,50 @@ spdk_nvmf_listener_get_trid(struct spdk_nvmf_listener *listener) return &listener->trid; } +static void +spdk_nvmf_remove_ns_done(struct spdk_io_channel_iter *i, int status) +{ + struct spdk_nvmf_ns *ns = spdk_io_channel_iter_get_ctx(i); + struct spdk_nvmf_subsystem *subsystem = ns->subsystem; + + spdk_bdev_close(ns->desc); + ns->allocated = false; + subsystem->num_allocated_nsid--; +} + +static void +spdk_nvmf_subsystem_remove_ns_from_poll_group(struct spdk_io_channel_iter *i) +{ + struct spdk_nvmf_ns *ns = spdk_io_channel_iter_get_ctx(i); + struct spdk_io_channel *ch = spdk_io_channel_iter_get_channel(i); + struct spdk_nvmf_poll_group *group = spdk_io_channel_get_ctx(ch); + int rc; + + rc = spdk_nvmf_poll_group_remove_ns(group, ns); + spdk_for_each_channel_continue(i, rc); +} + +int +spdk_nvmf_subsystem_remove_ns(struct spdk_nvmf_subsystem *subsystem, uint32_t nsid) +{ + struct spdk_nvmf_ns *ns; + + if (nsid == 0 || nsid > subsystem->max_nsid) { + return -1; + } + + ns = &subsystem->ns[nsid - 1]; + if (ns->allocated == false) { + return -1; + } + + spdk_for_each_channel(ns->subsystem->tgt, + spdk_nvmf_subsystem_remove_ns_from_poll_group, + ns, + spdk_nvmf_remove_ns_done); + return 0; +} + static void spdk_nvmf_subsystem_add_ns_done(struct spdk_io_channel_iter *i, int status) { diff --git a/test/unit/lib/nvmf/ctrlr_discovery.c/ctrlr_discovery_ut.c b/test/unit/lib/nvmf/ctrlr_discovery.c/ctrlr_discovery_ut.c index 8e49d947f..784ac4d80 100644 --- a/test/unit/lib/nvmf/ctrlr_discovery.c/ctrlr_discovery_ut.c +++ b/test/unit/lib/nvmf/ctrlr_discovery.c/ctrlr_discovery_ut.c @@ -141,6 +141,13 @@ spdk_nvmf_poll_group_remove_subsystem(struct spdk_nvmf_poll_group *group, return 0; } +int +spdk_nvmf_poll_group_remove_ns(struct spdk_nvmf_poll_group *group, + struct spdk_nvmf_ns *ns) +{ + return 0; +} + int spdk_nvmf_poll_group_add_ns(struct spdk_nvmf_poll_group *group, struct spdk_nvmf_subsystem *subsystem, diff --git a/test/unit/lib/nvmf/subsystem.c/subsystem_ut.c b/test/unit/lib/nvmf/subsystem.c/subsystem_ut.c index 316a3bbe1..ce2f72ede 100644 --- a/test/unit/lib/nvmf/subsystem.c/subsystem_ut.c +++ b/test/unit/lib/nvmf/subsystem.c/subsystem_ut.c @@ -98,6 +98,13 @@ spdk_nvmf_poll_group_remove_subsystem(struct spdk_nvmf_poll_group *group, return 0; } +int +spdk_nvmf_poll_group_remove_ns(struct spdk_nvmf_poll_group *group, + struct spdk_nvmf_ns *ns) +{ + return 0; +} + int spdk_nvmf_poll_group_add_ns(struct spdk_nvmf_poll_group *group, struct spdk_nvmf_subsystem *subsystem,