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 <benjamin.walker@intel.com>
Reviewed-on: https://review.gerrithub.io/374877
Tested-by: SPDK Automated Test System <sys_sgsw@intel.com>
Reviewed-by: Daniel Verkamp <daniel.verkamp@intel.com>
Reviewed-by: Jim Harris <james.r.harris@intel.com>
This commit is contained in:
Ben Walker 2017-08-18 15:38:33 -07:00 committed by Jim Harris
parent 02b640bfdf
commit 34d6e17598
5 changed files with 51 additions and 32 deletions

View File

@ -181,10 +181,10 @@ spdk_nvmf_parse_nvmf_tgt(void)
} }
g_spdk_nvmf_tgt_conf.acceptor_poll_rate = acceptor_poll_rate; g_spdk_nvmf_tgt_conf.acceptor_poll_rate = acceptor_poll_rate;
rc = spdk_nvmf_tgt_init(&opts); g_tgt = spdk_nvmf_tgt_create(&opts);
if (rc != 0) { if (!g_tgt) {
SPDK_ERRLOG("spdk_nvmf_tgt_init() failed\n"); SPDK_ERRLOG("spdk_nvmf_tgt_create() failed\n");
return rc; return -1;
} }
rc = spdk_add_nvmf_discovery_subsystem(); rc = spdk_add_nvmf_discovery_subsystem();

View File

@ -40,6 +40,8 @@
#include "spdk/log.h" #include "spdk/log.h"
#include "spdk/nvme.h" #include "spdk/nvme.h"
struct spdk_nvmf_tgt *g_tgt = NULL;
static struct spdk_poller *g_acceptor_poller = NULL; static struct spdk_poller *g_acceptor_poller = NULL;
static TAILQ_HEAD(, nvmf_tgt_subsystem) g_subsystems = TAILQ_HEAD_INITIALIZER(g_subsystems); 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); spdk_nvmf_delete_subsystem(subsystem);
if (g_subsystems_shutdown && TAILQ_EMPTY(&g_subsystems)) { 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. */ /* Finished shutting down all subsystems - continue the shutdown process. */
shutdown_complete(); shutdown_complete();
} }

View File

@ -63,6 +63,8 @@ struct nvmf_tgt_subsystem {
extern struct spdk_nvmf_tgt_conf g_spdk_nvmf_tgt_conf; extern struct spdk_nvmf_tgt_conf g_spdk_nvmf_tgt_conf;
extern struct spdk_nvmf_tgt *g_tgt;
struct nvmf_tgt_subsystem * struct nvmf_tgt_subsystem *
nvmf_tgt_subsystem_first(void); nvmf_tgt_subsystem_first(void);

View File

@ -48,6 +48,8 @@
#define MAX_VIRTUAL_NAMESPACE 16 #define MAX_VIRTUAL_NAMESPACE 16
#define MAX_SN_LEN 20 #define MAX_SN_LEN 20
struct spdk_nvmf_tgt;
struct spdk_nvmf_tgt_opts { struct spdk_nvmf_tgt_opts {
uint16_t max_queue_depth; uint16_t max_queue_depth;
uint16_t max_qpairs_per_ctrlr; 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); 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); int spdk_nvmf_check_pools(void);

View File

@ -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; opts->max_io_size = SPDK_NVMF_DEFAULT_MAX_IO_SIZE;
} }
int struct spdk_nvmf_tgt *
spdk_nvmf_tgt_init(struct spdk_nvmf_tgt_opts *opts) spdk_nvmf_tgt_create(struct spdk_nvmf_tgt_opts *opts)
{ {
struct spdk_nvmf_tgt *tgt;
tgt = &g_nvmf_tgt;
if (!opts) { if (!opts) {
spdk_nvmf_tgt_opts_init(&g_nvmf_tgt.opts); spdk_nvmf_tgt_opts_init(&tgt->opts);
} else { } else {
g_nvmf_tgt.opts = *opts; tgt->opts = *opts;
} }
g_nvmf_tgt.discovery_genctr = 0; tgt->discovery_genctr = 0;
g_nvmf_tgt.discovery_log_page = NULL; tgt->discovery_log_page = NULL;
g_nvmf_tgt.discovery_log_page_size = 0; tgt->discovery_log_page_size = 0;
g_nvmf_tgt.current_subsystem_id = 0; tgt->current_subsystem_id = 0;
TAILQ_INIT(&g_nvmf_tgt.subsystems); TAILQ_INIT(&tgt->subsystems);
TAILQ_INIT(&g_nvmf_tgt.listen_addrs); TAILQ_INIT(&tgt->listen_addrs);
TAILQ_INIT(&g_nvmf_tgt.transports); TAILQ_INIT(&tgt->transports);
SPDK_TRACELOG(SPDK_TRACE_NVMF, "Max Queue Pairs Per Controller: %d\n", SPDK_TRACELOG(SPDK_TRACE_NVMF, "Max Queue Pairs Per Controller: %d\n",
g_nvmf_tgt.opts.max_qpairs_per_ctrlr); tgt->opts.max_qpairs_per_ctrlr);
SPDK_TRACELOG(SPDK_TRACE_NVMF, "Max Queue Depth: %d\n", g_nvmf_tgt.opts.max_queue_depth); 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", SPDK_TRACELOG(SPDK_TRACE_NVMF, "Max In Capsule Data: %d bytes\n",
g_nvmf_tgt.opts.in_capsule_data_size); 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); SPDK_TRACELOG(SPDK_TRACE_NVMF, "Max I/O Size: %d bytes\n", tgt->opts.max_io_size);
return 0; return tgt;
} }
int void
spdk_nvmf_tgt_fini(void) spdk_nvmf_tgt_destroy(struct spdk_nvmf_tgt *tgt)
{ {
struct spdk_nvmf_listen_addr *listen_addr, *listen_addr_tmp; struct spdk_nvmf_listen_addr *listen_addr, *listen_addr_tmp;
struct spdk_nvmf_transport *transport, *transport_tmp; struct spdk_nvmf_transport *transport, *transport_tmp;
TAILQ_FOREACH_SAFE(listen_addr, &g_nvmf_tgt.listen_addrs, link, listen_addr_tmp) { TAILQ_FOREACH_SAFE(listen_addr, &tgt->listen_addrs, link, listen_addr_tmp) {
TAILQ_REMOVE(&g_nvmf_tgt.listen_addrs, listen_addr, link); TAILQ_REMOVE(&tgt->listen_addrs, listen_addr, link);
g_nvmf_tgt.discovery_genctr++; tgt->discovery_genctr++;
spdk_nvmf_listen_addr_destroy(listen_addr); spdk_nvmf_listen_addr_destroy(listen_addr);
} }
TAILQ_FOREACH_SAFE(transport, &g_nvmf_tgt.transports, link, transport_tmp) { TAILQ_FOREACH_SAFE(transport, &tgt->transports, link, transport_tmp) {
TAILQ_REMOVE(&g_nvmf_tgt.transports, transport, link); TAILQ_REMOVE(&tgt->transports, transport, link);
spdk_nvmf_transport_destroy(transport); spdk_nvmf_transport_destroy(transport);
} }
return 0;
} }
struct spdk_nvmf_transport * struct spdk_nvmf_transport *