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;
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();

View File

@ -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();
}

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 *g_tgt;
struct nvmf_tgt_subsystem *
nvmf_tgt_subsystem_first(void);

View File

@ -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);

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;
}
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 *