From 34d6e17598c30f8c87a12f77410b057599b0d320 Mon Sep 17 00:00:00 2001 From: Ben Walker Date: Fri, 18 Aug 2017 15:38:33 -0700 Subject: [PATCH] nvmf: spdk_nvmf_tgt_init is now spdk_nvmf_tgt_create This new function returns a reference to the target object. This sets the library up to support multiple targets in the future. Change-Id: Id803dbcbb166eca33d8d5c381d9db97628606f3e Signed-off-by: Ben Walker Reviewed-on: https://review.gerrithub.io/374877 Tested-by: SPDK Automated Test System Reviewed-by: Daniel Verkamp Reviewed-by: Jim Harris --- app/nvmf_tgt/conf.c | 8 +++---- app/nvmf_tgt/nvmf_tgt.c | 4 +++- app/nvmf_tgt/nvmf_tgt.h | 2 ++ include/spdk/nvmf.h | 17 ++++++++++++-- lib/nvmf/nvmf.c | 52 +++++++++++++++++++++-------------------- 5 files changed, 51 insertions(+), 32 deletions(-) diff --git a/app/nvmf_tgt/conf.c b/app/nvmf_tgt/conf.c index 795949df9..fec431536 100644 --- a/app/nvmf_tgt/conf.c +++ b/app/nvmf_tgt/conf.c @@ -181,10 +181,10 @@ spdk_nvmf_parse_nvmf_tgt(void) } g_spdk_nvmf_tgt_conf.acceptor_poll_rate = acceptor_poll_rate; - rc = spdk_nvmf_tgt_init(&opts); - if (rc != 0) { - SPDK_ERRLOG("spdk_nvmf_tgt_init() failed\n"); - return rc; + g_tgt = spdk_nvmf_tgt_create(&opts); + if (!g_tgt) { + SPDK_ERRLOG("spdk_nvmf_tgt_create() failed\n"); + return -1; } rc = spdk_add_nvmf_discovery_subsystem(); diff --git a/app/nvmf_tgt/nvmf_tgt.c b/app/nvmf_tgt/nvmf_tgt.c index bea578f0e..e2768c77a 100644 --- a/app/nvmf_tgt/nvmf_tgt.c +++ b/app/nvmf_tgt/nvmf_tgt.c @@ -40,6 +40,8 @@ #include "spdk/log.h" #include "spdk/nvme.h" +struct spdk_nvmf_tgt *g_tgt = NULL; + static struct spdk_poller *g_acceptor_poller = NULL; static TAILQ_HEAD(, nvmf_tgt_subsystem) g_subsystems = TAILQ_HEAD_INITIALIZER(g_subsystems); @@ -63,7 +65,7 @@ subsystem_delete_event(void *arg1, void *arg2) spdk_nvmf_delete_subsystem(subsystem); if (g_subsystems_shutdown && TAILQ_EMPTY(&g_subsystems)) { - spdk_nvmf_tgt_fini(); + spdk_nvmf_tgt_destroy(g_tgt); /* Finished shutting down all subsystems - continue the shutdown process. */ shutdown_complete(); } diff --git a/app/nvmf_tgt/nvmf_tgt.h b/app/nvmf_tgt/nvmf_tgt.h index 57ece5a18..e6c889f53 100644 --- a/app/nvmf_tgt/nvmf_tgt.h +++ b/app/nvmf_tgt/nvmf_tgt.h @@ -63,6 +63,8 @@ struct nvmf_tgt_subsystem { extern struct spdk_nvmf_tgt_conf g_spdk_nvmf_tgt_conf; +extern struct spdk_nvmf_tgt *g_tgt; + struct nvmf_tgt_subsystem * nvmf_tgt_subsystem_first(void); diff --git a/include/spdk/nvmf.h b/include/spdk/nvmf.h index a33a27678..5e4a855aa 100644 --- a/include/spdk/nvmf.h +++ b/include/spdk/nvmf.h @@ -48,6 +48,8 @@ #define MAX_VIRTUAL_NAMESPACE 16 #define MAX_SN_LEN 20 +struct spdk_nvmf_tgt; + struct spdk_nvmf_tgt_opts { uint16_t max_queue_depth; uint16_t max_qpairs_per_ctrlr; @@ -57,9 +59,20 @@ struct spdk_nvmf_tgt_opts { void spdk_nvmf_tgt_opts_init(struct spdk_nvmf_tgt_opts *opts); -int spdk_nvmf_tgt_init(struct spdk_nvmf_tgt_opts *opts); +/** + * Construct an NVMe-oF target + * + * \param opts Options + * \return An spdk_nvmf_tgt on success, NULL on failure. + */ +struct spdk_nvmf_tgt *spdk_nvmf_tgt_create(struct spdk_nvmf_tgt_opts *opts); -int spdk_nvmf_tgt_fini(void); +/** + * Destroy an NVMe-oF target + * + * \param tgt The target to destroy. This releases all resources. + */ +void spdk_nvmf_tgt_destroy(struct spdk_nvmf_tgt *tgt); int spdk_nvmf_check_pools(void); diff --git a/lib/nvmf/nvmf.c b/lib/nvmf/nvmf.c index 1d474a004..a28f2f878 100644 --- a/lib/nvmf/nvmf.c +++ b/lib/nvmf/nvmf.c @@ -62,52 +62,54 @@ spdk_nvmf_tgt_opts_init(struct spdk_nvmf_tgt_opts *opts) opts->max_io_size = SPDK_NVMF_DEFAULT_MAX_IO_SIZE; } -int -spdk_nvmf_tgt_init(struct spdk_nvmf_tgt_opts *opts) +struct spdk_nvmf_tgt * +spdk_nvmf_tgt_create(struct spdk_nvmf_tgt_opts *opts) { + struct spdk_nvmf_tgt *tgt; + + tgt = &g_nvmf_tgt; + if (!opts) { - spdk_nvmf_tgt_opts_init(&g_nvmf_tgt.opts); + spdk_nvmf_tgt_opts_init(&tgt->opts); } else { - g_nvmf_tgt.opts = *opts; + tgt->opts = *opts; } - g_nvmf_tgt.discovery_genctr = 0; - g_nvmf_tgt.discovery_log_page = NULL; - g_nvmf_tgt.discovery_log_page_size = 0; - g_nvmf_tgt.current_subsystem_id = 0; - TAILQ_INIT(&g_nvmf_tgt.subsystems); - TAILQ_INIT(&g_nvmf_tgt.listen_addrs); - TAILQ_INIT(&g_nvmf_tgt.transports); + tgt->discovery_genctr = 0; + tgt->discovery_log_page = NULL; + tgt->discovery_log_page_size = 0; + tgt->current_subsystem_id = 0; + TAILQ_INIT(&tgt->subsystems); + TAILQ_INIT(&tgt->listen_addrs); + TAILQ_INIT(&tgt->transports); SPDK_TRACELOG(SPDK_TRACE_NVMF, "Max Queue Pairs Per Controller: %d\n", - g_nvmf_tgt.opts.max_qpairs_per_ctrlr); - SPDK_TRACELOG(SPDK_TRACE_NVMF, "Max Queue Depth: %d\n", g_nvmf_tgt.opts.max_queue_depth); + tgt->opts.max_qpairs_per_ctrlr); + SPDK_TRACELOG(SPDK_TRACE_NVMF, "Max Queue Depth: %d\n", tgt->opts.max_queue_depth); SPDK_TRACELOG(SPDK_TRACE_NVMF, "Max In Capsule Data: %d bytes\n", - g_nvmf_tgt.opts.in_capsule_data_size); - SPDK_TRACELOG(SPDK_TRACE_NVMF, "Max I/O Size: %d bytes\n", g_nvmf_tgt.opts.max_io_size); + tgt->opts.in_capsule_data_size); + SPDK_TRACELOG(SPDK_TRACE_NVMF, "Max I/O Size: %d bytes\n", tgt->opts.max_io_size); - return 0; + return tgt; } -int -spdk_nvmf_tgt_fini(void) +void +spdk_nvmf_tgt_destroy(struct spdk_nvmf_tgt *tgt) { struct spdk_nvmf_listen_addr *listen_addr, *listen_addr_tmp; struct spdk_nvmf_transport *transport, *transport_tmp; - TAILQ_FOREACH_SAFE(listen_addr, &g_nvmf_tgt.listen_addrs, link, listen_addr_tmp) { - TAILQ_REMOVE(&g_nvmf_tgt.listen_addrs, listen_addr, link); - g_nvmf_tgt.discovery_genctr++; + TAILQ_FOREACH_SAFE(listen_addr, &tgt->listen_addrs, link, listen_addr_tmp) { + TAILQ_REMOVE(&tgt->listen_addrs, listen_addr, link); + tgt->discovery_genctr++; spdk_nvmf_listen_addr_destroy(listen_addr); } - TAILQ_FOREACH_SAFE(transport, &g_nvmf_tgt.transports, link, transport_tmp) { - TAILQ_REMOVE(&g_nvmf_tgt.transports, transport, link); + TAILQ_FOREACH_SAFE(transport, &tgt->transports, link, transport_tmp) { + TAILQ_REMOVE(&tgt->transports, transport, link); spdk_nvmf_transport_destroy(transport); } - - return 0; } struct spdk_nvmf_transport *