Commit 31b367ba authored by Vitaliy Mysak's avatar Vitaliy Mysak Committed by Jim Harris
Browse files

ocf: add callback argument to vbdev_ocf_construct()



Add callback for construct function.
It is not asynchronous yet, but will be after
  adopting asynchronous OCF API

Also adopt RPC construct call for this change.
This is done in this patch because (1) change is small (2) leaving
  implementation as TODO still requires implementing a mock because we
  decided that callback should be required rather than optional.

Signed-off-by: default avatarVitaliy Mysak <vitaliy.mysak@intel.com>
Change-Id: Ib6a78e2caf34ac057d4da53ad5dda47163e8a089
Reviewed-on: https://review.gerrithub.io/c/spdk/spdk/+/452146


Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: default avatarTomasz Zawadzki <tomasz.zawadzki@intel.com>
Reviewed-by: default avatarDarek Stojaczyk <dariusz.stojaczyk@intel.com>
Reviewed-by: default avatarShuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
parent 8d3d32b9
Loading
Loading
Loading
Loading
+10 −5
Original line number Diff line number Diff line
@@ -1069,11 +1069,13 @@ create_from_bdevs(struct vbdev_ocf *vbdev,
}

/* Init and then start vbdev if all base devices are present */
int
void
vbdev_ocf_construct(const char *vbdev_name,
		    const char *cache_mode_name,
		    const char *cache_name,
		    const char *core_name)
		    const char *core_name,
		    void (*cb)(int, struct vbdev_ocf *, void *),
		    void *cb_arg)
{
	int rc;
	struct spdk_bdev *cache_bdev = spdk_bdev_get_by_name(cache_name);
@@ -1082,12 +1084,14 @@ vbdev_ocf_construct(const char *vbdev_name,

	rc = init_vbdev(vbdev_name, cache_mode_name, cache_name, core_name);
	if (rc) {
		return rc;
		cb(rc, NULL, cb_arg);
		return;
	}

	vbdev = vbdev_ocf_get_by_name(vbdev_name);
	if (vbdev == NULL) {
		return -ENODEV;
		cb(-ENODEV, NULL, cb_arg);
		return;
	}

	if (cache_bdev == NULL) {
@@ -1099,7 +1103,8 @@ vbdev_ocf_construct(const char *vbdev_name,
			       vbdev->name, core_name);
	}

	return create_from_bdevs(vbdev, cache_bdev, core_bdev);
	rc = create_from_bdevs(vbdev, cache_bdev, core_bdev);
	cb(rc, vbdev, cb_arg);
}

/* This called if new device is created in SPDK application
+4 −2
Original line number Diff line number Diff line
@@ -160,11 +160,13 @@ struct vbdev_ocf {
	TAILQ_ENTRY(vbdev_ocf)       tailq;
};

int vbdev_ocf_construct(
void vbdev_ocf_construct(
	const char *vbdev_name,
	const char *cache_mode_name,
	const char *cache_name,
	const char *core_name);
	const char *core_name,
	void (*cb)(int, struct vbdev_ocf *, void *),
	void *cb_arg);

/* If vbdev is online, return its object */
struct vbdev_ocf *vbdev_ocf_get_by_name(const char *name);
+24 −18
Original line number Diff line number Diff line
@@ -62,13 +62,31 @@ static const struct spdk_json_object_decoder rpc_construct_ocf_bdev_decoders[] =
	{"core_bdev_name", offsetof(struct rpc_construct_ocf_bdev, core_bdev_name), spdk_json_decode_string},
};

static void
construct_cb(int status, struct vbdev_ocf *vbdev, void *cb_arg)
{
	struct spdk_jsonrpc_request *request = cb_arg;
	struct spdk_json_write_ctx *w;

	if (status) {
		spdk_jsonrpc_send_error_response_fmt(request, SPDK_JSONRPC_ERROR_INTERNAL_ERROR,
						     "Could not create OCF vbdev: %d",
						     status);
	} else {
		w = spdk_jsonrpc_begin_result(request);
		if (w) {
			spdk_json_write_string(w, vbdev->name);
			spdk_jsonrpc_end_result(request, w);
		}
	}
}

static void
spdk_rpc_construct_ocf_bdev(struct spdk_jsonrpc_request *request,
			    const struct spdk_json_val *params)
{
	int ret = 0;
	struct rpc_construct_ocf_bdev req = {NULL};
	struct spdk_json_write_ctx *w;
	int ret;

	ret = spdk_json_decode_object(params, rpc_construct_ocf_bdev_decoders,
				      SPDK_COUNTOF(rpc_construct_ocf_bdev_decoders),
@@ -76,24 +94,12 @@ spdk_rpc_construct_ocf_bdev(struct spdk_jsonrpc_request *request,
	if (ret) {
		spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_INVALID_PARAMS,
						 "Invalid parameters");
		goto end;
	}

	ret = vbdev_ocf_construct(req.name, req.mode, req.cache_bdev_name, req.core_bdev_name);
	if (ret) {
		spdk_jsonrpc_send_error_response_fmt(request, SPDK_JSONRPC_ERROR_INTERNAL_ERROR,
						     "Could not create OCF vbdev: %s",
						     spdk_strerror(-ret));
		goto end;
	}

	w = spdk_jsonrpc_begin_result(request);
	if (w) {
		spdk_json_write_string(w, req.name);
		spdk_jsonrpc_end_result(request, w);
		free_rpc_construct_ocf_bdev(&req);
		return;
	}

end:
	vbdev_ocf_construct(req.name, req.mode, req.cache_bdev_name, req.core_bdev_name,
			    construct_cb, request);
	free_rpc_construct_ocf_bdev(&req);
}
SPDK_RPC_REGISTER("construct_ocf_bdev", spdk_rpc_construct_ocf_bdev, SPDK_RPC_RUNTIME)