vhost/rpc: remove any usages of the external events

Replaced them with inline code that performs exactly
the same but is shorter and easier to follow. External
events were replaced by spdk_vhost_lock() and
spdk_vhost_dev_find().

Change-Id: Id46a619c592c20a573664b54efc097489e9bb893
Signed-off-by: Darek Stojaczyk <dariusz.stojaczyk@intel.com>
Reviewed-on: https://review.gerrithub.io/c/440378
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: Pawel Wodkowski <pawelx.wodkowski@intel.com>
Reviewed-by: Shuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
Reviewed-by: Jim Harris <james.r.harris@intel.com>
Reviewed-by: Ben Walker <benjamin.walker@intel.com>
This commit is contained in:
Darek Stojaczyk 2019-01-13 18:28:46 +01:00 committed by Jim Harris
parent 4b6621d08e
commit dd4f161b7e

View File

@ -105,8 +105,6 @@ struct rpc_add_vhost_scsi_ctrlr_lun {
char *ctrlr;
int32_t scsi_target_num;
char *bdev_name;
struct spdk_jsonrpc_request *request;
};
static void
@ -123,47 +121,13 @@ static const struct spdk_json_object_decoder rpc_vhost_add_lun[] = {
{"bdev_name", offsetof(struct rpc_add_vhost_scsi_ctrlr_lun, bdev_name), spdk_json_decode_string },
};
static int
spdk_rpc_add_vhost_scsi_lun_cb(struct spdk_vhost_dev *vdev, void *arg)
{
struct rpc_add_vhost_scsi_ctrlr_lun *rpc = arg;
struct spdk_jsonrpc_request *request = rpc->request;
struct spdk_json_write_ctx *w;
int rc;
if (vdev == NULL) {
rc = -ENODEV;
goto invalid;
}
rc = spdk_vhost_scsi_dev_add_tgt(vdev, rpc->scsi_target_num, rpc->bdev_name);
if (rc < 0) {
goto invalid;
}
free_rpc_add_vhost_scsi_ctrlr_lun(rpc);
w = spdk_jsonrpc_begin_result(request);
if (w == NULL) {
return -1;
}
spdk_json_write_int32(w, rc);
spdk_jsonrpc_end_result(request, w);
return 0;
invalid:
free_rpc_add_vhost_scsi_ctrlr_lun(rpc);
spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_INVALID_PARAMS,
spdk_strerror(-rc));
return rc;
}
static void
spdk_rpc_add_vhost_scsi_lun(struct spdk_jsonrpc_request *request,
const struct spdk_json_val *params)
{
struct rpc_add_vhost_scsi_ctrlr_lun *req;
struct spdk_json_write_ctx *w;
struct spdk_vhost_dev *vdev;
int rc;
req = calloc(1, sizeof(*req));
@ -172,7 +136,6 @@ spdk_rpc_add_vhost_scsi_lun(struct spdk_jsonrpc_request *request,
goto invalid;
}
req->request = request;
if (spdk_json_decode_object(params, rpc_vhost_add_lun,
SPDK_COUNTOF(rpc_vhost_add_lun),
req)) {
@ -187,8 +150,29 @@ spdk_rpc_add_vhost_scsi_lun(struct spdk_jsonrpc_request *request,
goto invalid;
}
spdk_vhost_call_external_event(req->ctrlr, spdk_rpc_add_vhost_scsi_lun_cb, req);
spdk_vhost_lock();
vdev = spdk_vhost_dev_find(req->ctrlr);
if (vdev == NULL) {
spdk_vhost_unlock();
rc = -ENODEV;
goto invalid;
}
rc = spdk_vhost_scsi_dev_add_tgt(vdev, req->scsi_target_num, req->bdev_name);
spdk_vhost_unlock();
if (rc < 0) {
goto invalid;
}
free_rpc_add_vhost_scsi_ctrlr_lun(req);
w = spdk_jsonrpc_begin_result(request);
if (w == NULL) {
return;
}
spdk_json_write_int32(w, rc);
spdk_jsonrpc_end_result(request, w);
return;
invalid:
@ -238,37 +222,12 @@ spdk_rpc_remove_vhost_scsi_target_finish_cb(struct spdk_vhost_dev *vdev, void *a
return 0;
}
static int
spdk_rpc_remove_vhost_scsi_target_cb(struct spdk_vhost_dev *vdev, void *arg)
{
struct rpc_remove_vhost_scsi_ctrlr_target *rpc = arg;
struct spdk_jsonrpc_request *request = rpc->request;
int rc;
if (vdev == NULL) {
rc = -ENODEV;
goto invalid;
}
rc = spdk_vhost_scsi_dev_remove_tgt(vdev, rpc->scsi_target_num,
spdk_rpc_remove_vhost_scsi_target_finish_cb, rpc);
if (rc < 0) {
goto invalid;
}
return 0;
invalid:
free_rpc_remove_vhost_scsi_ctrlr_target(rpc);
spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_INVALID_PARAMS, spdk_strerror(-rc));
return rc;
}
static void
spdk_rpc_remove_vhost_scsi_target(struct spdk_jsonrpc_request *request,
const struct spdk_json_val *params)
{
struct rpc_remove_vhost_scsi_ctrlr_target *req;
struct spdk_vhost_dev *vdev;
int rc;
req = calloc(1, sizeof(*req));
@ -286,8 +245,20 @@ spdk_rpc_remove_vhost_scsi_target(struct spdk_jsonrpc_request *request,
goto invalid;
}
spdk_vhost_call_external_event(req->ctrlr, spdk_rpc_remove_vhost_scsi_target_cb, req);
spdk_vhost_lock();
vdev = spdk_vhost_dev_find(req->ctrlr);
if (vdev == NULL) {
spdk_vhost_unlock();
rc = -ENODEV;
goto invalid;
}
rc = spdk_vhost_scsi_dev_remove_tgt(vdev, req->scsi_target_num,
spdk_rpc_remove_vhost_scsi_target_finish_cb, req);
spdk_vhost_unlock();
if (rc < 0) {
goto invalid;
}
return;
invalid:
@ -365,8 +336,6 @@ SPDK_RPC_REGISTER("construct_vhost_blk_controller", spdk_rpc_construct_vhost_blk
struct rpc_remove_vhost_ctrlr {
char *ctrlr;
struct spdk_jsonrpc_request *request;
};
static const struct spdk_json_object_decoder rpc_remove_vhost_ctrlr[] = {
@ -380,47 +349,13 @@ free_rpc_remove_vhost_ctrlr(struct rpc_remove_vhost_ctrlr *req)
free(req);
}
static int
spdk_rpc_remove_vhost_controller_cb(struct spdk_vhost_dev *vdev, void *arg)
{
struct rpc_remove_vhost_ctrlr *ctx = arg;
struct spdk_jsonrpc_request *request = ctx->request;
struct spdk_json_write_ctx *w;
int rc;
if (vdev == NULL) {
rc = -ENODEV;
goto invalid;
}
rc = spdk_vhost_dev_remove(vdev);
if (rc < 0) {
goto invalid;
}
free_rpc_remove_vhost_ctrlr(ctx);
w = spdk_jsonrpc_begin_result(request);
if (w == NULL) {
return 0;
}
spdk_json_write_bool(w, true);
spdk_jsonrpc_end_result(request, w);
return 0;
invalid:
free_rpc_remove_vhost_ctrlr(ctx);
spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_INVALID_PARAMS,
spdk_strerror(-rc));
return -1;
}
static void
spdk_rpc_remove_vhost_controller(struct spdk_jsonrpc_request *request,
const struct spdk_json_val *params)
{
struct rpc_remove_vhost_ctrlr *req;
struct spdk_json_write_ctx *w;
struct spdk_vhost_dev *vdev;
int rc;
req = calloc(1, sizeof(*req));
@ -429,7 +364,6 @@ spdk_rpc_remove_vhost_controller(struct spdk_jsonrpc_request *request,
goto invalid;
}
req->request = request;
if (spdk_json_decode_object(params, rpc_remove_vhost_ctrlr,
SPDK_COUNTOF(rpc_remove_vhost_ctrlr), req)) {
SPDK_DEBUGLOG(SPDK_LOG_VHOST_RPC, "spdk_json_decode_object failed\n");
@ -437,7 +371,30 @@ spdk_rpc_remove_vhost_controller(struct spdk_jsonrpc_request *request,
goto invalid;
}
spdk_vhost_call_external_event(req->ctrlr, spdk_rpc_remove_vhost_controller_cb, req);
spdk_vhost_lock();
vdev = spdk_vhost_dev_find(req->ctrlr);
if (vdev == NULL) {
spdk_vhost_unlock();
rc = -ENODEV;
goto invalid;
}
rc = spdk_vhost_dev_remove(vdev);
spdk_vhost_unlock();
if (rc < 0) {
goto invalid;
}
free_rpc_remove_vhost_ctrlr(req);
w = spdk_jsonrpc_begin_result(request);
if (w == NULL) {
return;
}
spdk_json_write_bool(w, true);
spdk_jsonrpc_end_result(request, w);
return;
invalid:
@ -452,8 +409,6 @@ SPDK_RPC_REGISTER("remove_vhost_controller", spdk_rpc_remove_vhost_controller, S
struct rpc_get_vhost_ctrlrs {
char *name;
struct spdk_json_write_ctx *w;
struct spdk_jsonrpc_request *request;
};
static void
@ -478,98 +433,92 @@ _spdk_rpc_get_vhost_controller(struct spdk_json_write_ctx *w, struct spdk_vhost_
spdk_json_write_object_end(w);
}
static int
spdk_rpc_get_vhost_controllers_cb(struct spdk_vhost_dev *vdev, void *arg)
{
struct rpc_get_vhost_ctrlrs *ctx = arg;
assert(ctx->name == NULL);
if (vdev == NULL) {
spdk_json_write_array_end(ctx->w);
spdk_jsonrpc_end_result(ctx->request, ctx->w);
free(ctx);
return 0;
}
_spdk_rpc_get_vhost_controller(ctx->w, vdev);
return 0;
}
static int
spdk_rpc_get_vhost_controller_cb(struct spdk_vhost_dev *vdev, void *arg)
{
struct rpc_get_vhost_ctrlrs *ctx = arg;
assert(ctx->name != NULL);
if (vdev == NULL) {
spdk_jsonrpc_send_error_response(ctx->request, SPDK_JSONRPC_ERROR_INVALID_PARAMS,
spdk_strerror(ENODEV));
goto free_name_ctx;
}
ctx->w = spdk_jsonrpc_begin_result(ctx->request);
if (ctx->w == NULL) {
goto free_name_ctx;
}
spdk_json_write_array_begin(ctx->w);
_spdk_rpc_get_vhost_controller(ctx->w, vdev);
spdk_json_write_array_end(ctx->w);
spdk_jsonrpc_end_result(ctx->request, ctx->w);
free_name_ctx:
free(ctx->name);
free(ctx);
return 0;
}
static const struct spdk_json_object_decoder rpc_get_vhost_ctrlrs_decoders[] = {
{"name", offsetof(struct rpc_get_vhost_ctrlrs, name), spdk_json_decode_string, true},
};
static void
free_rpc_get_vhost_ctrlrs(struct rpc_get_vhost_ctrlrs *req)
{
free(req->name);
free(req);
}
static void
spdk_rpc_get_vhost_controllers(struct spdk_jsonrpc_request *request,
const struct spdk_json_val *params)
{
struct rpc_get_vhost_ctrlrs *ctx;
struct spdk_json_write_ctx *w;
struct spdk_vhost_dev *vdev;
int rc;
ctx = calloc(1, sizeof(*ctx));
if (ctx == NULL) {
spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_INTERNAL_ERROR,
spdk_strerror(ENOMEM));
return;
rc = -ENOMEM;
goto invalid;
}
if (params && spdk_json_decode_object(params, rpc_get_vhost_ctrlrs_decoders,
SPDK_COUNTOF(rpc_get_vhost_ctrlrs_decoders), ctx)) {
SPDK_ERRLOG("spdk_json_decode_object failed\n");
free(ctx);
spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_INVALID_PARAMS,
"Invalid parameters");
rc = -EINVAL;
goto invalid;
}
spdk_vhost_lock();
if (ctx->name != NULL) {
vdev = spdk_vhost_dev_find(ctx->name);
if (vdev == NULL) {
spdk_vhost_unlock();
rc = -ENODEV;
goto invalid;
}
free_rpc_get_vhost_ctrlrs(ctx);
w = spdk_jsonrpc_begin_result(request);
if (w == NULL) {
spdk_vhost_unlock();
return;
}
spdk_json_write_array_begin(w);
_spdk_rpc_get_vhost_controller(w, vdev);
spdk_vhost_unlock();
spdk_json_write_array_end(w);
spdk_jsonrpc_end_result(request, w);
return;
}
if (ctx->name) {
ctx->request = request;
spdk_vhost_call_external_event(ctx->name, spdk_rpc_get_vhost_controller_cb, ctx);
return;
}
free_rpc_get_vhost_ctrlrs(ctx);
w = spdk_jsonrpc_begin_result(request);
if (w == NULL) {
free(ctx);
spdk_vhost_unlock();
return;
}
spdk_json_write_array_begin(w);
ctx->w = w;
ctx->request = request;
spdk_vhost_call_external_event_foreach(spdk_rpc_get_vhost_controllers_cb, ctx);
vdev = spdk_vhost_dev_next(NULL);
while (vdev != NULL) {
_spdk_rpc_get_vhost_controller(w, vdev);
vdev = spdk_vhost_dev_next(vdev);
}
spdk_vhost_unlock();
spdk_json_write_array_end(w);
spdk_jsonrpc_end_result(request, w);
return;
invalid:
if (ctx) {
free_rpc_get_vhost_ctrlrs(ctx);
}
spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_INTERNAL_ERROR,
spdk_strerror(-rc));
}
SPDK_RPC_REGISTER("get_vhost_controllers", spdk_rpc_get_vhost_controllers, SPDK_RPC_RUNTIME)
@ -578,7 +527,6 @@ struct rpc_vhost_ctrlr_coalescing {
char *ctrlr;
uint32_t delay_base_us;
uint32_t iops_threshold;
struct spdk_jsonrpc_request *request;
};
static const struct spdk_json_object_decoder rpc_set_vhost_ctrlr_coalescing[] = {
@ -598,44 +546,13 @@ free_rpc_set_vhost_controllers_event_coalescing(struct rpc_vhost_ctrlr_coalescin
free(req);
}
static int
spdk_rpc_set_vhost_controller_coalescing_cb(struct spdk_vhost_dev *vdev, void *arg)
{
struct rpc_vhost_ctrlr_coalescing *req = arg;
struct spdk_json_write_ctx *w;
int rc;
if (vdev == NULL) {
rc = -ENODEV;
goto invalid;
}
rc = spdk_vhost_set_coalescing(vdev, req->delay_base_us, req->iops_threshold);
if (rc) {
goto invalid;
}
w = spdk_jsonrpc_begin_result(req->request);
if (w != NULL) {
spdk_json_write_bool(w, true);
spdk_jsonrpc_end_result(req->request, w);
}
free_rpc_set_vhost_controllers_event_coalescing(req);
return 0;
invalid:
spdk_jsonrpc_send_error_response(req->request, SPDK_JSONRPC_ERROR_INVALID_PARAMS,
spdk_strerror(-rc));
free_rpc_set_vhost_controllers_event_coalescing(req);
return 0;
}
static void
spdk_rpc_set_vhost_controller_coalescing(struct spdk_jsonrpc_request *request,
const struct spdk_json_val *params)
{
struct rpc_vhost_ctrlr_coalescing *req;
struct spdk_json_write_ctx *w;
struct spdk_vhost_dev *vdev;
int rc;
req = calloc(1, sizeof(struct rpc_vhost_ctrlr_coalescing));
@ -651,8 +568,28 @@ spdk_rpc_set_vhost_controller_coalescing(struct spdk_jsonrpc_request *request,
goto invalid;
}
req->request = request;
spdk_vhost_call_external_event(req->ctrlr, spdk_rpc_set_vhost_controller_coalescing_cb, req);
spdk_vhost_lock();
vdev = spdk_vhost_dev_find(req->ctrlr);
if (vdev == NULL) {
spdk_vhost_unlock();
rc = -ENODEV;
goto invalid;
}
rc = spdk_vhost_set_coalescing(vdev, req->delay_base_us, req->iops_threshold);
spdk_vhost_unlock();
if (rc) {
goto invalid;
}
free_rpc_set_vhost_controllers_event_coalescing(req);
w = spdk_jsonrpc_begin_result(request);
if (w != NULL) {
spdk_json_write_bool(w, true);
spdk_jsonrpc_end_result(request, w);
}
return;
invalid:
@ -725,7 +662,6 @@ SPDK_RPC_REGISTER("construct_vhost_nvme_controller", spdk_rpc_construct_vhost_nv
struct rpc_add_vhost_nvme_ctrlr_ns {
char *ctrlr;
char *bdev_name;
struct spdk_jsonrpc_request *request;
};
static void
@ -741,46 +677,13 @@ static const struct spdk_json_object_decoder rpc_vhost_nvme_add_ns[] = {
{"bdev_name", offsetof(struct rpc_add_vhost_nvme_ctrlr_ns, bdev_name), spdk_json_decode_string },
};
static int
spdk_rpc_add_vhost_nvme_ns_cb(struct spdk_vhost_dev *vdev, void *arg)
{
struct rpc_add_vhost_nvme_ctrlr_ns *rpc = arg;
struct spdk_jsonrpc_request *request = rpc->request;
struct spdk_json_write_ctx *w;
int rc;
if (vdev == NULL) {
rc = -ENODEV;
goto invalid;
}
rc = spdk_vhost_nvme_dev_add_ns(vdev, rpc->bdev_name);
if (rc < 0) {
goto invalid;
}
free_rpc_add_vhost_nvme_ctrlr_ns(rpc);
w = spdk_jsonrpc_begin_result(request);
if (w == NULL) {
return -1;
}
spdk_json_write_bool(w, true);
spdk_jsonrpc_end_result(request, w);
return 0;
invalid:
free_rpc_add_vhost_nvme_ctrlr_ns(rpc);
spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_INVALID_PARAMS,
spdk_strerror(-rc));
return rc;
}
static void
spdk_rpc_add_vhost_nvme_ns(struct spdk_jsonrpc_request *request,
const struct spdk_json_val *params)
{
struct rpc_add_vhost_nvme_ctrlr_ns *req;
struct spdk_json_write_ctx *w;
struct spdk_vhost_dev *vdev;
int rc;
req = calloc(1, sizeof(*req));
@ -789,7 +692,6 @@ spdk_rpc_add_vhost_nvme_ns(struct spdk_jsonrpc_request *request,
goto invalid;
}
req->request = request;
if (spdk_json_decode_object(params, rpc_vhost_nvme_add_ns,
SPDK_COUNTOF(rpc_vhost_nvme_add_ns),
req)) {
@ -798,7 +700,28 @@ spdk_rpc_add_vhost_nvme_ns(struct spdk_jsonrpc_request *request,
goto invalid;
}
spdk_vhost_call_external_event(req->ctrlr, spdk_rpc_add_vhost_nvme_ns_cb, req);
spdk_vhost_lock();
vdev = spdk_vhost_dev_find(req->ctrlr);
if (vdev == NULL) {
spdk_vhost_unlock();
rc = -ENODEV;
goto invalid;
}
rc = spdk_vhost_nvme_dev_add_ns(vdev, req->bdev_name);
spdk_vhost_unlock();
if (rc < 0) {
goto invalid;
}
free_rpc_add_vhost_nvme_ctrlr_ns(req);
w = spdk_jsonrpc_begin_result(request);
if (w == NULL) {
return;
}
spdk_json_write_bool(w, true);
spdk_jsonrpc_end_result(request, w);
return;
invalid: