Commit 9977424d authored by Vitaliy Mysak's avatar Vitaliy Mysak Committed by Jim Harris
Browse files

ocf: make vbdev_ocf_delete function asynchronous



vbdev_ocf_delete function accepts callback now.
RPC delete_ocf_bdev is also updated to adopt this change.

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


Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: default avatarPiotr Pelpliński <piotr.pelplinski@intel.com>
Reviewed-by: default avatarJim Harris <james.r.harris@intel.com>
Reviewed-by: default avatarShuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
parent fee323b2
Loading
Loading
Loading
Loading
+7 −4
Original line number Diff line number Diff line
@@ -232,14 +232,17 @@ vbdev_ocf_destruct(void *opaque)

/* Stop OCF cache and unregister SPDK bdev */
int
vbdev_ocf_delete(struct vbdev_ocf *vbdev)
vbdev_ocf_delete(struct vbdev_ocf *vbdev, void (*cb)(void *, int), void *cb_arg)
{
	int rc = 0;

	if (vbdev->state.started) {
		spdk_bdev_unregister(&vbdev->exp_bdev, NULL, NULL);
		spdk_bdev_unregister(&vbdev->exp_bdev, cb, cb_arg);
	} else {
		rc = vbdev_ocf_destruct(vbdev);
		if (rc == 0 && cb) {
			cb(cb_arg, 0);
		}
	}

	return rc;
@@ -917,7 +920,7 @@ hotremove_cb(void *ctx)

		SPDK_NOTICELOG("Deinitializing '%s' because its core device '%s' was removed\n",
			       base->parent->name, base->name);
		vbdev_ocf_delete(base->parent);
		vbdev_ocf_delete(base->parent, NULL, NULL);
		return;
	}

@@ -929,7 +932,7 @@ hotremove_cb(void *ctx)
			SPDK_NOTICELOG("Deinitializing '%s' because"
				       " its cache device '%s' was removed\n",
				       vbdev->name, base->name);
			vbdev_ocf_delete(vbdev);
			vbdev_ocf_delete(vbdev, NULL, NULL);
		}
	}
}
+1 −1
Original line number Diff line number Diff line
@@ -145,7 +145,7 @@ struct vbdev_ocf *vbdev_ocf_get_by_name(const char *name);
struct vbdev_ocf_base *vbdev_ocf_get_base_by_name(const char *name);

/* Stop OCF cache and unregister SPDK bdev */
int vbdev_ocf_delete(struct vbdev_ocf *vbdev);
int vbdev_ocf_delete(struct vbdev_ocf *vbdev, void (*cb)(void *, int), void *cb_arg);

typedef void (*vbdev_ocf_foreach_fn)(struct vbdev_ocf *, void *);

+20 −10
Original line number Diff line number Diff line
@@ -114,12 +114,30 @@ static const struct spdk_json_object_decoder rpc_delete_ocf_bdev_decoders[] = {
	{"name", offsetof(struct rpc_delete_ocf_bdev, name), spdk_json_decode_string},
};

static void
delete_cb(void *cb_arg, int status)
{
	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 delete OCF vbdev: %d",
						     status);
	} else {
		w = spdk_jsonrpc_begin_result(request);
		if (w) {
			spdk_json_write_bool(w, true);
			spdk_jsonrpc_end_result(request, w);
		}
	}
}

static void
spdk_rpc_delete_ocf_bdev(struct spdk_jsonrpc_request *request,
			 const struct spdk_json_val *params)
{
	struct rpc_delete_ocf_bdev req = {NULL};
	struct spdk_json_write_ctx *w;
	struct vbdev_ocf *vbdev;
	int status;

@@ -139,7 +157,7 @@ spdk_rpc_delete_ocf_bdev(struct spdk_jsonrpc_request *request,
		goto end;
	}

	status = vbdev_ocf_delete(vbdev);
	status = vbdev_ocf_delete(vbdev, delete_cb, request);
	if (status) {
		spdk_jsonrpc_send_error_response_fmt(request, SPDK_JSONRPC_ERROR_INTERNAL_ERROR,
						     "Could not delete OCF vbdev: %s",
@@ -147,14 +165,6 @@ spdk_rpc_delete_ocf_bdev(struct spdk_jsonrpc_request *request,
		goto end;
	}

	w = spdk_jsonrpc_begin_result(request);
	if (w == NULL) {
		goto end;
	}

	spdk_json_write_bool(w, true);
	spdk_jsonrpc_end_result(request, w);

end:
	free_rpc_delete_ocf_bdev(&req);
}