From 33376dd1362be2f63746a8b2feac2de43ca20dbe Mon Sep 17 00:00:00 2001 From: Ben Walker Date: Mon, 20 Nov 2017 11:16:06 -0700 Subject: [PATCH] nvmf: Add subsystem iterators Add functions to iterate the list of subsystems for a given target. Change-Id: Id3831f656033092224168b353788ae87238bf800 Signed-off-by: Ben Walker Reviewed-on: https://review.gerrithub.io/388294 Reviewed-by: Daniel Verkamp Tested-by: SPDK Automated Test System Reviewed-by: Changpeng Liu Reviewed-by: Jim Harris --- include/spdk/nvmf.h | 10 ++++++++++ lib/nvmf/subsystem.c | 37 +++++++++++++++++++++++++++++++++++++ 2 files changed, 47 insertions(+) diff --git a/include/spdk/nvmf.h b/include/spdk/nvmf.h index da90d03cc..cd5389f4c 100644 --- a/include/spdk/nvmf.h +++ b/include/spdk/nvmf.h @@ -148,6 +148,16 @@ struct spdk_nvmf_subsystem *spdk_nvmf_create_subsystem(struct spdk_nvmf_tgt *tgt struct spdk_nvmf_subsystem *spdk_nvmf_tgt_find_subsystem(struct spdk_nvmf_tgt *tgt, const char *subnqn); +/** + * Begin iterating over all known subsystems. If no subsystems are present, return NULL. + */ +struct spdk_nvmf_subsystem *spdk_nvmf_subsystem_get_first(struct spdk_nvmf_tgt *tgt); + +/** + * Continue iterating over all known subsystems. If no additional subsystems, return NULL. + */ +struct spdk_nvmf_subsystem *spdk_nvmf_subsystem_get_next(struct spdk_nvmf_subsystem *subsystem); + void spdk_nvmf_delete_subsystem(struct spdk_nvmf_subsystem *subsystem); /** diff --git a/lib/nvmf/subsystem.c b/lib/nvmf/subsystem.c index c5e544be8..e4be6fbd2 100644 --- a/lib/nvmf/subsystem.c +++ b/lib/nvmf/subsystem.c @@ -242,6 +242,43 @@ spdk_nvmf_delete_subsystem(struct spdk_nvmf_subsystem *subsystem) spdk_nvmf_subsystem_delete_done); } +struct spdk_nvmf_subsystem * +spdk_nvmf_subsystem_get_first(struct spdk_nvmf_tgt *tgt) +{ + struct spdk_nvmf_subsystem *subsystem; + uint32_t sid; + + for (sid = 0; sid < tgt->max_sid; sid++) { + subsystem = tgt->subsystems[sid]; + if (subsystem) { + return subsystem; + } + } + + return NULL; +} + +struct spdk_nvmf_subsystem * +spdk_nvmf_subsystem_get_next(struct spdk_nvmf_subsystem *subsystem) +{ + uint32_t sid; + struct spdk_nvmf_tgt *tgt; + + if (!subsystem) { + return NULL; + } + + tgt = subsystem->tgt; + + for (sid = subsystem->id + 1; sid < tgt->max_sid; sid++) { + subsystem = tgt->subsystems[sid]; + if (subsystem) { + return subsystem; + } + } + + return NULL; +} int spdk_nvmf_subsystem_add_host(struct spdk_nvmf_subsystem *subsystem, const char *hostnqn)