nvmf: The nvmf subsystem host management RPCs no longer pause subsystems

Signed-off-by: Ben Walker <benjamin.walker@intel.com>
Change-Id: I03f8840708853cc0dfba383979f9e4abc157a4b7
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/4582
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: Changpeng Liu <changpeng.liu@intel.com>
Reviewed-by: Aleksey Marchuk <alexeymar@mellanox.com>
Community-CI: Broadcom CI
This commit is contained in:
Ben Walker 2020-10-09 08:43:50 -07:00 committed by Tomasz Zawadzki
parent 4e8e97c886
commit ce594c1e43

View File

@ -1473,24 +1473,11 @@ rpc_nvmf_subsystem_remove_ns(struct spdk_jsonrpc_request *request,
}
SPDK_RPC_REGISTER("nvmf_subsystem_remove_ns", rpc_nvmf_subsystem_remove_ns, SPDK_RPC_RUNTIME)
enum nvmf_rpc_host_op {
NVMF_RPC_HOST_ADD,
NVMF_RPC_HOST_REMOVE,
NVMF_RPC_HOST_ALLOW_ANY,
};
struct nvmf_rpc_host_ctx {
struct spdk_jsonrpc_request *request;
char *nqn;
char *host;
char *tgt_name;
enum nvmf_rpc_host_op op;
bool allow_any_host;
bool response_sent;
};
static const struct spdk_json_object_decoder nvmf_rpc_subsystem_host_decoder[] = {
@ -1505,117 +1492,55 @@ nvmf_rpc_host_ctx_free(struct nvmf_rpc_host_ctx *ctx)
free(ctx->nqn);
free(ctx->host);
free(ctx->tgt_name);
free(ctx);
}
static void
nvmf_rpc_host_resumed(struct spdk_nvmf_subsystem *subsystem,
void *cb_arg, int status)
{
struct nvmf_rpc_host_ctx *ctx = cb_arg;
struct spdk_jsonrpc_request *request;
struct spdk_json_write_ctx *w;
bool response_sent = ctx->response_sent;
request = ctx->request;
nvmf_rpc_host_ctx_free(ctx);
if (response_sent) {
return;
}
w = spdk_jsonrpc_begin_result(request);
spdk_json_write_bool(w, true);
spdk_jsonrpc_end_result(request, w);
}
static void
nvmf_rpc_host_paused(struct spdk_nvmf_subsystem *subsystem,
void *cb_arg, int status)
{
struct nvmf_rpc_host_ctx *ctx = cb_arg;
int rc = -1;
switch (ctx->op) {
case NVMF_RPC_HOST_ADD:
rc = spdk_nvmf_subsystem_add_host(subsystem, ctx->host);
break;
case NVMF_RPC_HOST_REMOVE:
rc = spdk_nvmf_subsystem_remove_host(subsystem, ctx->host);
break;
case NVMF_RPC_HOST_ALLOW_ANY:
rc = spdk_nvmf_subsystem_set_allow_any_host(subsystem, ctx->allow_any_host);
break;
}
if (rc != 0) {
spdk_jsonrpc_send_error_response(ctx->request, SPDK_JSONRPC_ERROR_INTERNAL_ERROR, "Internal error");
ctx->response_sent = true;
}
if (spdk_nvmf_subsystem_resume(subsystem, nvmf_rpc_host_resumed, ctx)) {
if (!ctx->response_sent) {
spdk_jsonrpc_send_error_response(ctx->request, SPDK_JSONRPC_ERROR_INTERNAL_ERROR, "Internal error");
}
nvmf_rpc_host_ctx_free(ctx);
}
}
static void
rpc_nvmf_subsystem_add_host(struct spdk_jsonrpc_request *request,
const struct spdk_json_val *params)
{
struct nvmf_rpc_host_ctx *ctx;
struct nvmf_rpc_host_ctx ctx = {};
struct spdk_nvmf_subsystem *subsystem;
struct spdk_nvmf_tgt *tgt;
struct spdk_json_write_ctx *w;
int rc;
ctx = calloc(1, sizeof(*ctx));
if (!ctx) {
spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_INTERNAL_ERROR, "Out of memory");
return;
}
if (spdk_json_decode_object(params, nvmf_rpc_subsystem_host_decoder,
SPDK_COUNTOF(nvmf_rpc_subsystem_host_decoder),
ctx)) {
&ctx)) {
SPDK_ERRLOG("spdk_json_decode_object failed\n");
spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_INVALID_PARAMS, "Invalid parameters");
nvmf_rpc_host_ctx_free(ctx);
nvmf_rpc_host_ctx_free(&ctx);
return;
}
tgt = spdk_nvmf_get_tgt(ctx->tgt_name);
tgt = spdk_nvmf_get_tgt(ctx.tgt_name);
if (!tgt) {
SPDK_ERRLOG("Unable to find a target object.\n");
spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_INTERNAL_ERROR,
"Unable to find a target.");
nvmf_rpc_host_ctx_free(ctx);
nvmf_rpc_host_ctx_free(&ctx);
return;
}
ctx->request = request;
ctx->op = NVMF_RPC_HOST_ADD;
ctx->response_sent = false;
subsystem = spdk_nvmf_tgt_find_subsystem(tgt, ctx->nqn);
subsystem = spdk_nvmf_tgt_find_subsystem(tgt, ctx.nqn);
if (!subsystem) {
SPDK_ERRLOG("Unable to find subsystem with NQN %s\n", ctx->nqn);
SPDK_ERRLOG("Unable to find subsystem with NQN %s\n", ctx.nqn);
spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_INVALID_PARAMS, "Invalid parameters");
nvmf_rpc_host_ctx_free(ctx);
nvmf_rpc_host_ctx_free(&ctx);
return;
}
rc = spdk_nvmf_subsystem_pause(subsystem, nvmf_rpc_host_paused, ctx);
rc = spdk_nvmf_subsystem_add_host(subsystem, ctx.host);
if (rc != 0) {
if (rc == -EBUSY) {
spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_INTERNAL_ERROR,
"subsystem busy, retry later.\n");
} else {
spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_INTERNAL_ERROR, "Internal error");
}
nvmf_rpc_host_ctx_free(ctx);
spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_INTERNAL_ERROR, "Internal error");
nvmf_rpc_host_ctx_free(&ctx);
return;
}
w = spdk_jsonrpc_begin_result(request);
spdk_json_write_bool(w, true);
spdk_jsonrpc_end_result(request, w);
nvmf_rpc_host_ctx_free(&ctx);
}
SPDK_RPC_REGISTER("nvmf_subsystem_add_host", rpc_nvmf_subsystem_add_host, SPDK_RPC_RUNTIME)
@ -1623,57 +1548,49 @@ static void
rpc_nvmf_subsystem_remove_host(struct spdk_jsonrpc_request *request,
const struct spdk_json_val *params)
{
struct nvmf_rpc_host_ctx *ctx;
struct nvmf_rpc_host_ctx ctx = {};
struct spdk_nvmf_subsystem *subsystem;
struct spdk_nvmf_tgt *tgt;
struct spdk_json_write_ctx *w;
int rc;
ctx = calloc(1, sizeof(*ctx));
if (!ctx) {
spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_INTERNAL_ERROR, "Out of memory");
return;
}
if (spdk_json_decode_object(params, nvmf_rpc_subsystem_host_decoder,
SPDK_COUNTOF(nvmf_rpc_subsystem_host_decoder),
ctx)) {
&ctx)) {
SPDK_ERRLOG("spdk_json_decode_object failed\n");
spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_INVALID_PARAMS, "Invalid parameters");
nvmf_rpc_host_ctx_free(ctx);
nvmf_rpc_host_ctx_free(&ctx);
return;
}
tgt = spdk_nvmf_get_tgt(ctx->tgt_name);
tgt = spdk_nvmf_get_tgt(ctx.tgt_name);
if (!tgt) {
SPDK_ERRLOG("Unable to find a target object.\n");
spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_INTERNAL_ERROR,
"Unable to find a target.");
nvmf_rpc_host_ctx_free(ctx);
nvmf_rpc_host_ctx_free(&ctx);
return;
}
ctx->request = request;
ctx->op = NVMF_RPC_HOST_REMOVE;
ctx->response_sent = false;
subsystem = spdk_nvmf_tgt_find_subsystem(tgt, ctx->nqn);
subsystem = spdk_nvmf_tgt_find_subsystem(tgt, ctx.nqn);
if (!subsystem) {
SPDK_ERRLOG("Unable to find subsystem with NQN %s\n", ctx->nqn);
SPDK_ERRLOG("Unable to find subsystem with NQN %s\n", ctx.nqn);
spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_INVALID_PARAMS, "Invalid parameters");
nvmf_rpc_host_ctx_free(ctx);
nvmf_rpc_host_ctx_free(&ctx);
return;
}
rc = spdk_nvmf_subsystem_pause(subsystem, nvmf_rpc_host_paused, ctx);
rc = spdk_nvmf_subsystem_remove_host(subsystem, ctx.host);
if (rc != 0) {
if (rc == -EBUSY) {
spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_INTERNAL_ERROR,
"subsystem busy, retry later.\n");
} else {
spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_INTERNAL_ERROR, "Internal error");
}
nvmf_rpc_host_ctx_free(ctx);
spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_INTERNAL_ERROR, "Internal error");
nvmf_rpc_host_ctx_free(&ctx);
return;
}
w = spdk_jsonrpc_begin_result(request);
spdk_json_write_bool(w, true);
spdk_jsonrpc_end_result(request, w);
nvmf_rpc_host_ctx_free(&ctx);
}
SPDK_RPC_REGISTER("nvmf_subsystem_remove_host", rpc_nvmf_subsystem_remove_host,
SPDK_RPC_RUNTIME)
@ -1689,57 +1606,49 @@ static void
rpc_nvmf_subsystem_allow_any_host(struct spdk_jsonrpc_request *request,
const struct spdk_json_val *params)
{
struct nvmf_rpc_host_ctx *ctx;
struct nvmf_rpc_host_ctx ctx = {};
struct spdk_nvmf_subsystem *subsystem;
struct spdk_nvmf_tgt *tgt;
struct spdk_json_write_ctx *w;
int rc;
ctx = calloc(1, sizeof(*ctx));
if (!ctx) {
spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_INTERNAL_ERROR, "Out of memory");
return;
}
if (spdk_json_decode_object(params, nvmf_rpc_subsystem_any_host_decoder,
SPDK_COUNTOF(nvmf_rpc_subsystem_any_host_decoder),
ctx)) {
&ctx)) {
SPDK_ERRLOG("spdk_json_decode_object failed\n");
spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_INVALID_PARAMS, "Invalid parameters");
nvmf_rpc_host_ctx_free(ctx);
nvmf_rpc_host_ctx_free(&ctx);
return;
}
tgt = spdk_nvmf_get_tgt(ctx->tgt_name);
tgt = spdk_nvmf_get_tgt(ctx.tgt_name);
if (!tgt) {
SPDK_ERRLOG("Unable to find a target object.\n");
spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_INTERNAL_ERROR,
"Unable to find a target.");
nvmf_rpc_host_ctx_free(ctx);
nvmf_rpc_host_ctx_free(&ctx);
return;
}
ctx->request = request;
ctx->op = NVMF_RPC_HOST_ALLOW_ANY;
ctx->response_sent = false;
subsystem = spdk_nvmf_tgt_find_subsystem(tgt, ctx->nqn);
subsystem = spdk_nvmf_tgt_find_subsystem(tgt, ctx.nqn);
if (!subsystem) {
SPDK_ERRLOG("Unable to find subsystem with NQN %s\n", ctx->nqn);
SPDK_ERRLOG("Unable to find subsystem with NQN %s\n", ctx.nqn);
spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_INVALID_PARAMS, "Invalid parameters");
nvmf_rpc_host_ctx_free(ctx);
nvmf_rpc_host_ctx_free(&ctx);
return;
}
rc = spdk_nvmf_subsystem_pause(subsystem, nvmf_rpc_host_paused, ctx);
rc = spdk_nvmf_subsystem_set_allow_any_host(subsystem, ctx.allow_any_host);
if (rc != 0) {
if (rc == -EBUSY) {
spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_INTERNAL_ERROR,
"subsystem busy, retry later.\n");
} else {
spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_INTERNAL_ERROR, "Internal error");
}
nvmf_rpc_host_ctx_free(ctx);
spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_INTERNAL_ERROR, "Internal error");
nvmf_rpc_host_ctx_free(&ctx);
return;
}
w = spdk_jsonrpc_begin_result(request);
spdk_json_write_bool(w, true);
spdk_jsonrpc_end_result(request, w);
nvmf_rpc_host_ctx_free(&ctx);
}
SPDK_RPC_REGISTER("nvmf_subsystem_allow_any_host", rpc_nvmf_subsystem_allow_any_host,
SPDK_RPC_RUNTIME)