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:
parent
f4f839ecd3
commit
8c9508f9b3
@ -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
|
||||
|
@ -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.
|
||||
|
@ -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();
|
||||
|
@ -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 {
|
||||
|
@ -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 {
|
||||
|
Loading…
Reference in New Issue
Block a user