diff --git a/module/event/subsystems/nvmf/conf.c b/module/event/subsystems/nvmf/conf.c index 90886e81d..70058c524 100644 --- a/module/event/subsystems/nvmf/conf.c +++ b/module/event/subsystems/nvmf/conf.c @@ -43,7 +43,6 @@ #define SPDK_NVMF_MAX_NAMESPACES (1 << 14) -struct spdk_nvmf_tgt_conf *g_spdk_nvmf_tgt_conf = NULL; uint32_t g_spdk_nvmf_tgt_max_subsystems = 0; static int @@ -140,32 +139,21 @@ nvmf_parse_tgt_max_subsystems(void) return deprecated_values; } -static struct spdk_nvmf_tgt_conf * +static int nvmf_parse_tgt_conf(void) { - struct spdk_nvmf_tgt_conf *conf; struct spdk_conf_section *sp; int rc; - conf = calloc(1, sizeof(*conf)); - if (!conf) { - SPDK_ERRLOG("calloc() failed for target conf\n"); - return NULL; - } - - conf->acceptor_poll_rate = ACCEPT_TIMEOUT_US; - conf->admin_passthru.identify_ctrlr = false; - sp = spdk_conf_find_section(NULL, "Nvmf"); if (sp != NULL) { - rc = nvmf_read_config_file_tgt_conf(sp, conf); + rc = nvmf_read_config_file_tgt_conf(sp, &g_spdk_nvmf_tgt_conf); if (rc) { - free(conf); - return NULL; + return -1; } } - return conf; + return 0; } static int @@ -190,16 +178,13 @@ nvmf_parse_nvmf_tgt(void) } } - if (!g_spdk_nvmf_tgt_conf) { - g_spdk_nvmf_tgt_conf = nvmf_parse_tgt_conf(); - if (!g_spdk_nvmf_tgt_conf) { - SPDK_ERRLOG("nvmf_parse_tgt_conf() failed\n"); - return -1; - } + if (nvmf_parse_tgt_conf() != 0) { + SPDK_ERRLOG("nvmf_parse_tgt_conf() failed\n"); + return -1; } opts.max_subsystems = g_spdk_nvmf_tgt_max_subsystems; - opts.acceptor_poll_rate = g_spdk_nvmf_tgt_conf->acceptor_poll_rate; + opts.acceptor_poll_rate = g_spdk_nvmf_tgt_conf.acceptor_poll_rate; g_spdk_nvmf_tgt = spdk_nvmf_tgt_create(&opts); g_spdk_nvmf_tgt_max_subsystems = 0; diff --git a/module/event/subsystems/nvmf/event_nvmf.h b/module/event/subsystems/nvmf/event_nvmf.h index 407709fa5..0e87d2c84 100644 --- a/module/event/subsystems/nvmf/event_nvmf.h +++ b/module/event/subsystems/nvmf/event_nvmf.h @@ -54,7 +54,7 @@ struct spdk_nvmf_tgt_conf { struct spdk_nvmf_admin_passthru_conf admin_passthru; }; -extern struct spdk_nvmf_tgt_conf *g_spdk_nvmf_tgt_conf; +extern struct spdk_nvmf_tgt_conf g_spdk_nvmf_tgt_conf; extern uint32_t g_spdk_nvmf_tgt_max_subsystems; diff --git a/module/event/subsystems/nvmf/nvmf_rpc.c b/module/event/subsystems/nvmf/nvmf_rpc.c index b16ec6686..e1857a260 100644 --- a/module/event/subsystems/nvmf/nvmf_rpc.c +++ b/module/event/subsystems/nvmf/nvmf_rpc.c @@ -111,31 +111,14 @@ static void rpc_nvmf_set_config(struct spdk_jsonrpc_request *request, const struct spdk_json_val *params) { - struct spdk_nvmf_tgt_conf *conf; + struct spdk_nvmf_tgt_conf conf; struct spdk_json_write_ctx *w; - if (g_spdk_nvmf_tgt_conf != NULL) { - SPDK_ERRLOG("this RPC must not be called more than once.\n"); - spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_INTERNAL_ERROR, - "Must not call more than once"); - return; - } - - conf = calloc(1, sizeof(*conf)); - if (conf == NULL) { - SPDK_ERRLOG("calloc() failed for target config\n"); - spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_INTERNAL_ERROR, - "Out of memory"); - return; - } - - conf->acceptor_poll_rate = ACCEPT_TIMEOUT_US; - conf->admin_passthru.identify_ctrlr = false; + memcpy(&conf, &g_spdk_nvmf_tgt_conf, sizeof(conf)); if (params != NULL) { if (spdk_json_decode_object(params, nvmf_rpc_subsystem_tgt_conf_decoder, - SPDK_COUNTOF(nvmf_rpc_subsystem_tgt_conf_decoder), conf)) { - free(conf); + SPDK_COUNTOF(nvmf_rpc_subsystem_tgt_conf_decoder), &conf)) { SPDK_ERRLOG("spdk_json_decode_object() failed\n"); spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_INVALID_PARAMS, "Invalid parameters"); @@ -143,7 +126,7 @@ rpc_nvmf_set_config(struct spdk_jsonrpc_request *request, } } - g_spdk_nvmf_tgt_conf = conf; + memcpy(&g_spdk_nvmf_tgt_conf, &conf, sizeof(conf)); w = spdk_jsonrpc_begin_result(request); spdk_json_write_bool(w, true); diff --git a/module/event/subsystems/nvmf/nvmf_tgt.c b/module/event/subsystems/nvmf/nvmf_tgt.c index 0f516a545..70be97560 100644 --- a/module/event/subsystems/nvmf/nvmf_tgt.c +++ b/module/event/subsystems/nvmf/nvmf_tgt.c @@ -60,6 +60,11 @@ struct nvmf_tgt_poll_group { TAILQ_ENTRY(nvmf_tgt_poll_group) link; }; +struct spdk_nvmf_tgt_conf g_spdk_nvmf_tgt_conf = { + .acceptor_poll_rate = ACCEPT_TIMEOUT_US, + .admin_passthru.identify_ctrlr = false +}; + struct spdk_nvmf_tgt *g_spdk_nvmf_tgt = NULL; static enum nvmf_tgt_state g_tgt_state; @@ -246,8 +251,6 @@ nvmf_tgt_destroy_done(void *ctx, int status) { g_tgt_state = NVMF_TGT_STOPPED; - free(g_spdk_nvmf_tgt_conf); - g_spdk_nvmf_tgt_conf = NULL; nvmf_tgt_advance_state(); } @@ -366,7 +369,7 @@ nvmf_tgt_advance_state(void) break; case NVMF_TGT_INIT_CREATE_POLL_GROUPS: /* Config parsed */ - if (g_spdk_nvmf_tgt_conf->admin_passthru.identify_ctrlr) { + if (g_spdk_nvmf_tgt_conf.admin_passthru.identify_ctrlr) { SPDK_NOTICELOG("Custom identify ctrlr handler enabled\n"); spdk_nvmf_set_custom_admin_cmd_hdlr(SPDK_NVME_OPC_IDENTIFY, nvmf_custom_identify_hdlr); } @@ -443,10 +446,10 @@ nvmf_subsystem_write_config_json(struct spdk_json_write_ctx *w) spdk_json_write_named_string(w, "method", "nvmf_set_config"); spdk_json_write_named_object_begin(w, "params"); - spdk_json_write_named_uint32(w, "acceptor_poll_rate", g_spdk_nvmf_tgt_conf->acceptor_poll_rate); + spdk_json_write_named_uint32(w, "acceptor_poll_rate", g_spdk_nvmf_tgt_conf.acceptor_poll_rate); spdk_json_write_named_object_begin(w, "admin_cmd_passthru"); spdk_json_write_named_bool(w, "identify_ctrlr", - g_spdk_nvmf_tgt_conf->admin_passthru.identify_ctrlr); + g_spdk_nvmf_tgt_conf.admin_passthru.identify_ctrlr); spdk_json_write_object_end(w); spdk_json_write_object_end(w); spdk_json_write_object_end(w);