From 3ec061800fcc20e83c7154b63a7dea9190194ccc Mon Sep 17 00:00:00 2001 From: Changpeng Liu Date: Wed, 22 May 2019 01:56:37 -0400 Subject: [PATCH] nvmf: add a persist through power loss configuration file when constructing NS For reservation feature in NVMoF, we can't support the persist through power loss feature, now we will add the configuration file parameter with Namespace, after users set the configuration file parameter with one NS, then the PTPL feature can be enabled. Change-Id: Id72699093f7e68318b9529f7bacc5c9804f7f86b Signed-off-by: Changpeng Liu Reviewed-on: https://review.gerrithub.io/c/spdk/spdk/+/455905 Tested-by: SPDK CI Jenkins Reviewed-by: Ben Walker Reviewed-by: Darek Stojaczyk Reviewed-by: Shuhei Matsumoto --- include/spdk/nvmf.h | 4 +++- lib/event/subsystems/nvmf/conf.c | 2 +- lib/event/subsystems/nvmf/nvmf_rpc.c | 2 +- lib/nvmf/nvmf_internal.h | 2 ++ lib/nvmf/subsystem.c | 10 +++++++++- test/unit/lib/nvmf/subsystem.c/subsystem_ut.c | 8 ++++---- 6 files changed, 20 insertions(+), 8 deletions(-) diff --git a/include/spdk/nvmf.h b/include/spdk/nvmf.h index 3cf7e47ea..2a3ad4be9 100644 --- a/include/spdk/nvmf.h +++ b/include/spdk/nvmf.h @@ -562,11 +562,13 @@ void spdk_nvmf_ns_opts_get_defaults(struct spdk_nvmf_ns_opts *opts, size_t opts_ * \param bdev Block device to add as a namespace. * \param opts Namespace options, or NULL to use defaults. * \param opts_size sizeof(*opts) + * \param ptpl_file Persist through power loss file path. * * \return newly added NSID on success, or 0 on failure. */ uint32_t spdk_nvmf_subsystem_add_ns(struct spdk_nvmf_subsystem *subsystem, struct spdk_bdev *bdev, - const struct spdk_nvmf_ns_opts *opts, size_t opts_size); + const struct spdk_nvmf_ns_opts *opts, size_t opts_size, + const char *ptpl_file); /** * Remove a namespace from a subsytem. diff --git a/lib/event/subsystems/nvmf/conf.c b/lib/event/subsystems/nvmf/conf.c index 1c7d3e0ed..c8aa73b74 100644 --- a/lib/event/subsystems/nvmf/conf.c +++ b/lib/event/subsystems/nvmf/conf.c @@ -338,7 +338,7 @@ spdk_nvmf_parse_subsystem(struct spdk_conf_section *sp) } } - if (spdk_nvmf_subsystem_add_ns(subsystem, bdev, &ns_opts, sizeof(ns_opts)) == 0) { + if (spdk_nvmf_subsystem_add_ns(subsystem, bdev, &ns_opts, sizeof(ns_opts), NULL) == 0) { SPDK_ERRLOG("Unable to add namespace\n"); spdk_nvmf_subsystem_destroy(subsystem); subsystem = NULL; diff --git a/lib/event/subsystems/nvmf/nvmf_rpc.c b/lib/event/subsystems/nvmf/nvmf_rpc.c index 8513f9d69..42724f5c4 100644 --- a/lib/event/subsystems/nvmf/nvmf_rpc.c +++ b/lib/event/subsystems/nvmf/nvmf_rpc.c @@ -895,7 +895,7 @@ nvmf_rpc_ns_paused(struct spdk_nvmf_subsystem *subsystem, ns_opts.uuid = ctx->ns_params.uuid; } - ctx->ns_params.nsid = spdk_nvmf_subsystem_add_ns(subsystem, bdev, &ns_opts, sizeof(ns_opts)); + ctx->ns_params.nsid = spdk_nvmf_subsystem_add_ns(subsystem, bdev, &ns_opts, sizeof(ns_opts), NULL); if (ctx->ns_params.nsid == 0) { SPDK_ERRLOG("Unable to add namespace\n"); spdk_jsonrpc_send_error_response(ctx->request, SPDK_JSONRPC_ERROR_INVALID_PARAMS, diff --git a/lib/nvmf/nvmf_internal.h b/lib/nvmf/nvmf_internal.h index ede2976d7..5a2b7f979 100644 --- a/lib/nvmf/nvmf_internal.h +++ b/lib/nvmf/nvmf_internal.h @@ -217,6 +217,8 @@ struct spdk_nvmf_ns { enum spdk_nvme_reservation_type rtype; /* current reservation holder, only valid if reservation type can only have one holder */ struct spdk_nvmf_registrant *holder; + /* Persist Through Power Loss file which contains the persistent reservation */ + char *ptpl_file; }; struct spdk_nvmf_qpair { diff --git a/lib/nvmf/subsystem.c b/lib/nvmf/subsystem.c index aa24e9c24..6c581aea5 100644 --- a/lib/nvmf/subsystem.c +++ b/lib/nvmf/subsystem.c @@ -928,6 +928,9 @@ _spdk_nvmf_subsystem_remove_ns(struct spdk_nvmf_subsystem *subsystem, uint32_t n } spdk_bdev_module_release_bdev(ns->bdev); spdk_bdev_close(ns->desc); + if (ns->ptpl_file) { + free(ns->ptpl_file); + } free(ns); spdk_nvmf_subsystem_ns_changed(subsystem, nsid); @@ -1007,7 +1010,8 @@ static struct spdk_bdev_module ns_bdev_module = { uint32_t spdk_nvmf_subsystem_add_ns(struct spdk_nvmf_subsystem *subsystem, struct spdk_bdev *bdev, - const struct spdk_nvmf_ns_opts *user_opts, size_t opts_size) + const struct spdk_nvmf_ns_opts *user_opts, size_t opts_size, + const char *ptpl_file) { struct spdk_nvmf_ns_opts opts; struct spdk_nvmf_ns *ns; @@ -1104,6 +1108,10 @@ spdk_nvmf_subsystem_add_ns(struct spdk_nvmf_subsystem *subsystem, struct spdk_bd ns->nsid = opts.nsid; TAILQ_INIT(&ns->registrants); + if (ptpl_file) { + ns->ptpl_file = strdup(ptpl_file); + } + SPDK_DEBUGLOG(SPDK_LOG_NVMF, "Subsystem %s: bdev %s assigned nsid %" PRIu32 "\n", spdk_nvmf_subsystem_get_nqn(subsystem), spdk_bdev_get_name(bdev), diff --git a/test/unit/lib/nvmf/subsystem.c/subsystem_ut.c b/test/unit/lib/nvmf/subsystem.c/subsystem_ut.c index 8ca3ddc65..71993d756 100644 --- a/test/unit/lib/nvmf/subsystem.c/subsystem_ut.c +++ b/test/unit/lib/nvmf/subsystem.c/subsystem_ut.c @@ -256,7 +256,7 @@ test_spdk_nvmf_subsystem_add_ns(void) /* Allow NSID to be assigned automatically */ spdk_nvmf_ns_opts_get_defaults(&ns_opts, sizeof(ns_opts)); - nsid = spdk_nvmf_subsystem_add_ns(&subsystem, &bdev1, &ns_opts, sizeof(ns_opts)); + nsid = spdk_nvmf_subsystem_add_ns(&subsystem, &bdev1, &ns_opts, sizeof(ns_opts), NULL); /* NSID 1 is the first unused ID */ CU_ASSERT(nsid == 1); CU_ASSERT(subsystem.max_nsid == 1); @@ -267,7 +267,7 @@ test_spdk_nvmf_subsystem_add_ns(void) /* Request a specific NSID */ spdk_nvmf_ns_opts_get_defaults(&ns_opts, sizeof(ns_opts)); ns_opts.nsid = 5; - nsid = spdk_nvmf_subsystem_add_ns(&subsystem, &bdev2, &ns_opts, sizeof(ns_opts)); + nsid = spdk_nvmf_subsystem_add_ns(&subsystem, &bdev2, &ns_opts, sizeof(ns_opts), NULL); CU_ASSERT(nsid == 5); CU_ASSERT(subsystem.max_nsid == 5); SPDK_CU_ASSERT_FATAL(subsystem.ns[nsid - 1] != NULL); @@ -276,14 +276,14 @@ test_spdk_nvmf_subsystem_add_ns(void) /* Request an NSID that is already in use */ spdk_nvmf_ns_opts_get_defaults(&ns_opts, sizeof(ns_opts)); ns_opts.nsid = 5; - nsid = spdk_nvmf_subsystem_add_ns(&subsystem, &bdev2, &ns_opts, sizeof(ns_opts)); + nsid = spdk_nvmf_subsystem_add_ns(&subsystem, &bdev2, &ns_opts, sizeof(ns_opts), NULL); CU_ASSERT(nsid == 0); CU_ASSERT(subsystem.max_nsid == 5); /* Request 0xFFFFFFFF (invalid NSID, reserved for broadcast) */ spdk_nvmf_ns_opts_get_defaults(&ns_opts, sizeof(ns_opts)); ns_opts.nsid = 0xFFFFFFFF; - nsid = spdk_nvmf_subsystem_add_ns(&subsystem, &bdev2, &ns_opts, sizeof(ns_opts)); + nsid = spdk_nvmf_subsystem_add_ns(&subsystem, &bdev2, &ns_opts, sizeof(ns_opts), NULL); CU_ASSERT(nsid == 0); CU_ASSERT(subsystem.max_nsid == 5);