nvmf: Correctly unregister nvmf tgt as an I/O device

Change-Id: I9552354d620986c2a3d6b071f32b587e9e683198
Signed-off-by: Ben Walker <benjamin.walker@intel.com>
Reviewed-on: https://review.gerrithub.io/413861
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 2018-06-05 15:34:04 -07:00 committed by Jim Harris
parent f4f839ecd3
commit 8c9508f9b3
5 changed files with 44 additions and 5 deletions

View File

@ -20,6 +20,11 @@ The spdk_mem_map_translate() function now takes a size parameter to indicate the
the memory region. This can be used by environment implementations to validate the
requested translation.
### NVMe Over Fabrics
The spdk_nvmf_tgt_destroy() function is now asynchronous and takes a callback
as a parameter.
### git pre-commit and pre-push hooks
The pre-commit hook will run `scripts/check_format.sh` and verify there are no formating

View File

@ -85,12 +85,16 @@ void spdk_nvmf_tgt_opts_init(struct spdk_nvmf_tgt_opts *opts);
*/
struct spdk_nvmf_tgt *spdk_nvmf_tgt_create(struct spdk_nvmf_tgt_opts *opts);
typedef void (spdk_nvmf_tgt_destroy_done_fn)(void *ctx, int status);
/**
* 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);
void spdk_nvmf_tgt_destroy(struct spdk_nvmf_tgt *tgt,
spdk_nvmf_tgt_destroy_done_fn cb_fn,
void *cb_arg);
/**
* Function to be called once the target is listening.

View File

@ -216,6 +216,13 @@ nvmf_tgt_subsystem_stopped(struct spdk_nvmf_subsystem *subsystem,
nvmf_tgt_advance_state();
}
static void
nvmf_tgt_destroy_done(void *ctx, int status)
{
g_tgt_state = NVMF_TGT_STOPPED;
nvmf_tgt_advance_state();
}
static void
nvmf_tgt_advance_state(void)
{
@ -303,8 +310,7 @@ nvmf_tgt_advance_state(void)
nvmf_tgt_destroy_poll_group_done);
break;
case NVMF_TGT_FINI_FREE_RESOURCES:
spdk_nvmf_tgt_destroy(g_spdk_nvmf_tgt);
g_tgt_state = NVMF_TGT_STOPPED;
spdk_nvmf_tgt_destroy(g_spdk_nvmf_tgt, nvmf_tgt_destroy_done, NULL);
break;
case NVMF_TGT_STOPPED:
spdk_subsystem_fini_next();

View File

@ -202,10 +202,13 @@ spdk_nvmf_tgt_create(struct spdk_nvmf_tgt_opts *opts)
return tgt;
}
void
spdk_nvmf_tgt_destroy(struct spdk_nvmf_tgt *tgt)
static void
spdk_nvmf_tgt_destroy_cb(void *io_device)
{
struct spdk_nvmf_tgt *tgt = io_device;
struct spdk_nvmf_transport *transport, *transport_tmp;
spdk_nvmf_tgt_destroy_done_fn *destroy_cb_fn;
void *destroy_cb_arg;
uint32_t i;
if (tgt->discovery_log_page) {
@ -226,7 +229,25 @@ spdk_nvmf_tgt_destroy(struct spdk_nvmf_tgt *tgt)
spdk_nvmf_transport_destroy(transport);
}
destroy_cb_fn = tgt->destroy_cb_fn;
destroy_cb_arg = tgt->destroy_cb_arg;
free(tgt);
if (destroy_cb_fn) {
destroy_cb_fn(destroy_cb_arg, 0);
}
}
void
spdk_nvmf_tgt_destroy(struct spdk_nvmf_tgt *tgt,
spdk_nvmf_tgt_destroy_done_fn cb_fn,
void *cb_arg)
{
tgt->destroy_cb_fn = cb_fn;
tgt->destroy_cb_arg = cb_arg;
spdk_io_device_unregister(tgt, spdk_nvmf_tgt_destroy_cb);
}
struct spdk_nvmf_tgt_listen_ctx {

View File

@ -75,6 +75,9 @@ struct spdk_nvmf_tgt {
struct spdk_nvmf_discovery_log_page *discovery_log_page;
size_t discovery_log_page_size;
TAILQ_HEAD(, spdk_nvmf_transport) transports;
spdk_nvmf_tgt_destroy_done_fn *destroy_cb_fn;
void *destroy_cb_arg;
};
struct spdk_nvmf_host {