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
|
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
|
||||||
|
@ -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.
|
||||||
|
@ -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();
|
||||||
|
@ -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 {
|
||||||
|
@ -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 {
|
||||||
|
Loading…
Reference in New Issue
Block a user