nvmf: Add public interface of remove ns from subsystem.

Change-Id: I9c2746dd54a13f3dae0ac2bab1d5fced931e8591
Signed-off-by: Cunyin Chang <cunyin.chang@intel.com>
Reviewed-on: https://review.gerrithub.io/391699
Tested-by: SPDK Automated Test System <sys_sgsw@intel.com>
Reviewed-by: Ben Walker <benjamin.walker@intel.com>
Reviewed-by: Daniel Verkamp <daniel.verkamp@intel.com>
This commit is contained in:
Cunyin Chang 2017-12-14 10:38:18 +08:00 committed by Jim Harris
parent 304d851a5d
commit 7f5864be20
6 changed files with 87 additions and 1 deletions

View File

@ -286,6 +286,16 @@ const struct spdk_nvme_transport_id *spdk_nvmf_listener_get_trid(
uint32_t spdk_nvmf_subsystem_add_ns(struct spdk_nvmf_subsystem *subsystem, struct spdk_bdev *bdev,
uint32_t nsid);
/**
* Remove a namespace from a subsytem.
*
* \param subsystem Subsystem the namespace belong to.
* \param nsid Namespace ID to be removed.
*
* \return 0 on success or -1 on failure.
*/
int spdk_nvmf_subsystem_remove_ns(struct spdk_nvmf_subsystem *subsystem, uint32_t nsid);
/**
* Return the first allocated namespace in a subsystem.
*

View File

@ -457,6 +457,23 @@ spdk_nvmf_poll_group_add_subsystem(struct spdk_nvmf_poll_group *group,
return 0;
}
int
spdk_nvmf_poll_group_remove_ns(struct spdk_nvmf_poll_group *group,
struct spdk_nvmf_ns *ns)
{
struct spdk_nvmf_subsystem_poll_group *sgroup;
uint32_t nsid = ns->id - 1;
sgroup = &group->sgroups[ns->subsystem->id];
if (sgroup->channels[nsid]) {
spdk_put_io_channel(sgroup->channels[nsid]);
sgroup->channels[nsid] = NULL;
}
return 0;
}
int
spdk_nvmf_poll_group_remove_subsystem(struct spdk_nvmf_poll_group *group,
struct spdk_nvmf_subsystem *subsystem)

View File

@ -220,7 +220,8 @@ int spdk_nvmf_poll_group_remove_subsystem(struct spdk_nvmf_poll_group *group,
int spdk_nvmf_poll_group_add_ns(struct spdk_nvmf_poll_group *group,
struct spdk_nvmf_subsystem *subsystem,
struct spdk_nvmf_ns *ns);
int spdk_nvmf_poll_group_remove_ns(struct spdk_nvmf_poll_group *group,
struct spdk_nvmf_ns *ns);
void spdk_nvmf_request_exec(struct spdk_nvmf_request *req);
int spdk_nvmf_request_complete(struct spdk_nvmf_request *req);
int spdk_nvmf_request_abort(struct spdk_nvmf_request *req);

View File

@ -426,6 +426,50 @@ spdk_nvmf_listener_get_trid(struct spdk_nvmf_listener *listener)
return &listener->trid;
}
static void
spdk_nvmf_remove_ns_done(struct spdk_io_channel_iter *i, int status)
{
struct spdk_nvmf_ns *ns = spdk_io_channel_iter_get_ctx(i);
struct spdk_nvmf_subsystem *subsystem = ns->subsystem;
spdk_bdev_close(ns->desc);
ns->allocated = false;
subsystem->num_allocated_nsid--;
}
static void
spdk_nvmf_subsystem_remove_ns_from_poll_group(struct spdk_io_channel_iter *i)
{
struct spdk_nvmf_ns *ns = spdk_io_channel_iter_get_ctx(i);
struct spdk_io_channel *ch = spdk_io_channel_iter_get_channel(i);
struct spdk_nvmf_poll_group *group = spdk_io_channel_get_ctx(ch);
int rc;
rc = spdk_nvmf_poll_group_remove_ns(group, ns);
spdk_for_each_channel_continue(i, rc);
}
int
spdk_nvmf_subsystem_remove_ns(struct spdk_nvmf_subsystem *subsystem, uint32_t nsid)
{
struct spdk_nvmf_ns *ns;
if (nsid == 0 || nsid > subsystem->max_nsid) {
return -1;
}
ns = &subsystem->ns[nsid - 1];
if (ns->allocated == false) {
return -1;
}
spdk_for_each_channel(ns->subsystem->tgt,
spdk_nvmf_subsystem_remove_ns_from_poll_group,
ns,
spdk_nvmf_remove_ns_done);
return 0;
}
static void
spdk_nvmf_subsystem_add_ns_done(struct spdk_io_channel_iter *i, int status)
{

View File

@ -141,6 +141,13 @@ spdk_nvmf_poll_group_remove_subsystem(struct spdk_nvmf_poll_group *group,
return 0;
}
int
spdk_nvmf_poll_group_remove_ns(struct spdk_nvmf_poll_group *group,
struct spdk_nvmf_ns *ns)
{
return 0;
}
int
spdk_nvmf_poll_group_add_ns(struct spdk_nvmf_poll_group *group,
struct spdk_nvmf_subsystem *subsystem,

View File

@ -98,6 +98,13 @@ spdk_nvmf_poll_group_remove_subsystem(struct spdk_nvmf_poll_group *group,
return 0;
}
int
spdk_nvmf_poll_group_remove_ns(struct spdk_nvmf_poll_group *group,
struct spdk_nvmf_ns *ns)
{
return 0;
}
int
spdk_nvmf_poll_group_add_ns(struct spdk_nvmf_poll_group *group,
struct spdk_nvmf_subsystem *subsystem,