nvmf: add notifications about ns to the transport

It is optional to register i.e. most transports will not need to take
any action. It allows additional verification of ns/bdev capabilities
on transport layer before actual attachment to the subsystem.

Signed-off-by: Jacek Kalwas <jacek.kalwas@intel.com>
Change-Id: I07d96b1d33c2d5433b951cb418ae1a89bf9caea5
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/5666
Community-CI: Broadcom CI
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: Jim Harris <james.r.harris@intel.com>
Reviewed-by: Shuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
Reviewed-by: Aleksey Marchuk <alexeymar@mellanox.com>
This commit is contained in:
Jacek Kalwas 2020-12-22 10:27:45 -05:00 committed by Tomasz Zawadzki
parent 3bb303d9e6
commit 2e26faa975
4 changed files with 58 additions and 0 deletions

View File

@ -255,6 +255,22 @@ struct spdk_nvmf_transport_ops {
const struct spdk_nvmf_subsystem *subsystem,
const struct spdk_nvme_transport_id *trid);
/**
* It is a notification that a namespace is being added to the subsystem.
* Most transports will not need to take any action here.
*
* Returns a negated errno code to block the attachment. 0 to allow.
*/
int (*subsystem_add_ns)(struct spdk_nvmf_transport *transport,
const struct spdk_nvmf_subsystem *subsystem, struct spdk_nvmf_ns *ns);
/**
* It is a notification that a namespace has been removed from the subsystem.
* Most transports will not need to take any action here.
*/
void (*subsystem_remove_ns)(struct spdk_nvmf_transport *transport,
const struct spdk_nvmf_subsystem *subsystem, uint32_t nsid);
/**
* Check for new connections on the transport.
*/

View File

@ -1152,6 +1152,7 @@ nvmf_ns_reservation_clear_all_registrants(struct spdk_nvmf_ns *ns);
int
spdk_nvmf_subsystem_remove_ns(struct spdk_nvmf_subsystem *subsystem, uint32_t nsid)
{
struct spdk_nvmf_transport *transport;
struct spdk_nvmf_ns *ns;
if (!(subsystem->state == SPDK_NVMF_SUBSYSTEM_INACTIVE ||
@ -1177,6 +1178,13 @@ spdk_nvmf_subsystem_remove_ns(struct spdk_nvmf_subsystem *subsystem, uint32_t ns
spdk_bdev_close(ns->desc);
free(ns);
for (transport = spdk_nvmf_transport_get_first(subsystem->tgt); transport;
transport = spdk_nvmf_transport_get_next(transport)) {
if (transport->ops->subsystem_remove_ns) {
transport->ops->subsystem_remove_ns(transport, subsystem, nsid);
}
}
nvmf_subsystem_ns_changed(subsystem, nsid);
return 0;
@ -1343,6 +1351,7 @@ spdk_nvmf_subsystem_add_ns_ext(struct spdk_nvmf_subsystem *subsystem, const char
const struct spdk_nvmf_ns_opts *user_opts, size_t opts_size,
const char *ptpl_file)
{
struct spdk_nvmf_transport *transport;
struct spdk_nvmf_ns_opts opts;
struct spdk_nvmf_ns *ns;
struct spdk_nvmf_reservation_info info = {0};
@ -1443,6 +1452,23 @@ spdk_nvmf_subsystem_add_ns_ext(struct spdk_nvmf_subsystem *subsystem, const char
ns->ptpl_file = strdup(ptpl_file);
}
for (transport = spdk_nvmf_transport_get_first(subsystem->tgt); transport;
transport = spdk_nvmf_transport_get_next(transport)) {
if (transport->ops->subsystem_add_ns) {
rc = transport->ops->subsystem_add_ns(transport, subsystem, ns);
if (rc) {
SPDK_ERRLOG("Namespace attachment is not allowed by %s transport\n", transport->ops->name);
free(ns->ptpl_file);
nvmf_ns_reservation_clear_all_registrants(ns);
subsystem->ns[opts.nsid - 1] = NULL;
spdk_bdev_module_release_bdev(ns->bdev);
spdk_bdev_close(ns->desc);
free(ns);
return 0;
}
}
}
SPDK_DEBUGLOG(nvmf, "Subsystem %s: bdev %s assigned nsid %" PRIu32 "\n",
spdk_nvmf_subsystem_get_nqn(subsystem),
bdev_name,

View File

@ -53,6 +53,14 @@ DEFINE_STUB(spdk_nvmf_transport_stop_listen,
(struct spdk_nvmf_transport *transport,
const struct spdk_nvme_transport_id *trid), 0);
DEFINE_STUB(spdk_nvmf_transport_get_first,
struct spdk_nvmf_transport *,
(struct spdk_nvmf_tgt *tgt), NULL);
DEFINE_STUB(spdk_nvmf_transport_get_next,
struct spdk_nvmf_transport *,
(struct spdk_nvmf_transport *transport), NULL);
DEFINE_STUB_V(spdk_bdev_close, (struct spdk_bdev_desc *desc));
DEFINE_STUB(nvmf_ctrlr_async_event_discovery_log_change_notice,

View File

@ -76,6 +76,14 @@ DEFINE_STUB(nvmf_transport_find_listener,
(struct spdk_nvmf_transport *transport,
const struct spdk_nvme_transport_id *trid), NULL);
DEFINE_STUB(spdk_nvmf_transport_get_first,
struct spdk_nvmf_transport *,
(struct spdk_nvmf_tgt *tgt), NULL);
DEFINE_STUB(spdk_nvmf_transport_get_next,
struct spdk_nvmf_transport *,
(struct spdk_nvmf_transport *transport), NULL);
DEFINE_STUB(spdk_nvmf_request_complete,
int,
(struct spdk_nvmf_request *req), 0);