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:
parent
4e8e97c886
commit
ce594c1e43
@ -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)
|
||||
|
Loading…
Reference in New Issue
Block a user