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 the memory region. This can be used by environment implementations to validate the
requested translation. 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 ### git pre-commit and pre-push hooks
The pre-commit hook will run `scripts/check_format.sh` and verify there are no formating 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); 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. * Destroy an NVMe-oF target.
* *
* \param tgt The target to destroy. This releases all resources. * \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. * 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(); 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 static void
nvmf_tgt_advance_state(void) nvmf_tgt_advance_state(void)
{ {
@ -303,8 +310,7 @@ nvmf_tgt_advance_state(void)
nvmf_tgt_destroy_poll_group_done); nvmf_tgt_destroy_poll_group_done);
break; break;
case NVMF_TGT_FINI_FREE_RESOURCES: case NVMF_TGT_FINI_FREE_RESOURCES:
spdk_nvmf_tgt_destroy(g_spdk_nvmf_tgt); spdk_nvmf_tgt_destroy(g_spdk_nvmf_tgt, nvmf_tgt_destroy_done, NULL);
g_tgt_state = NVMF_TGT_STOPPED;
break; break;
case NVMF_TGT_STOPPED: case NVMF_TGT_STOPPED:
spdk_subsystem_fini_next(); spdk_subsystem_fini_next();

View File

@ -202,10 +202,13 @@ spdk_nvmf_tgt_create(struct spdk_nvmf_tgt_opts *opts)
return tgt; return tgt;
} }
void static void
spdk_nvmf_tgt_destroy(struct spdk_nvmf_tgt *tgt) spdk_nvmf_tgt_destroy_cb(void *io_device)
{ {
struct spdk_nvmf_tgt *tgt = io_device;
struct spdk_nvmf_transport *transport, *transport_tmp; struct spdk_nvmf_transport *transport, *transport_tmp;
spdk_nvmf_tgt_destroy_done_fn *destroy_cb_fn;
void *destroy_cb_arg;
uint32_t i; uint32_t i;
if (tgt->discovery_log_page) { if (tgt->discovery_log_page) {
@ -226,7 +229,25 @@ spdk_nvmf_tgt_destroy(struct spdk_nvmf_tgt *tgt)
spdk_nvmf_transport_destroy(transport); spdk_nvmf_transport_destroy(transport);
} }
destroy_cb_fn = tgt->destroy_cb_fn;
destroy_cb_arg = tgt->destroy_cb_arg;
free(tgt); 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 { 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; struct spdk_nvmf_discovery_log_page *discovery_log_page;
size_t discovery_log_page_size; size_t discovery_log_page_size;
TAILQ_HEAD(, spdk_nvmf_transport) transports; TAILQ_HEAD(, spdk_nvmf_transport) transports;
spdk_nvmf_tgt_destroy_done_fn *destroy_cb_fn;
void *destroy_cb_arg;
}; };
struct spdk_nvmf_host { struct spdk_nvmf_host {