xref: /spdk/module/bdev/aio/bdev_aio_rpc.c (revision e5693d682a9872b3bb3a84b3245a099af77992d6)
1488570ebSJim Harris /*   SPDX-License-Identifier: BSD-3-Clause
2a6dbe372Spaul luse  *   Copyright (C) 2016 Intel Corporation.
307fe6a43SSeth Howell  *   All rights reserved.
407fe6a43SSeth Howell  */
507fe6a43SSeth Howell 
607fe6a43SSeth Howell #include "bdev_aio.h"
707fe6a43SSeth Howell #include "spdk/rpc.h"
807fe6a43SSeth Howell #include "spdk/util.h"
907fe6a43SSeth Howell #include "spdk/string.h"
104e8e97c8STomasz Zawadzki #include "spdk/log.h"
1107fe6a43SSeth Howell 
1207fe6a43SSeth Howell struct rpc_construct_aio {
1307fe6a43SSeth Howell 	char *name;
1407fe6a43SSeth Howell 	char *filename;
1507fe6a43SSeth Howell 	uint32_t block_size;
164c6a2e3dSYuhua 	bool readonly;
17648a5414Szhenwei pi 	bool fallocate;
18*e5693d68SMateusz Kozlowski 	struct spdk_uuid uuid;
1907fe6a43SSeth Howell };
2007fe6a43SSeth Howell 
2142c82595STomasz Zawadzki struct rpc_construct_aio_ctx {
2242c82595STomasz Zawadzki 	struct rpc_construct_aio req;
2342c82595STomasz Zawadzki 	struct spdk_jsonrpc_request *request;
2442c82595STomasz Zawadzki };
2542c82595STomasz Zawadzki 
2607fe6a43SSeth Howell static void
2742c82595STomasz Zawadzki free_rpc_construct_aio(struct rpc_construct_aio_ctx *ctx)
2807fe6a43SSeth Howell {
2942c82595STomasz Zawadzki 	free(ctx->req.name);
3042c82595STomasz Zawadzki 	free(ctx->req.filename);
3142c82595STomasz Zawadzki 	free(ctx);
3207fe6a43SSeth Howell }
3307fe6a43SSeth Howell 
3407fe6a43SSeth Howell static const struct spdk_json_object_decoder rpc_construct_aio_decoders[] = {
3507fe6a43SSeth Howell 	{"name", offsetof(struct rpc_construct_aio, name), spdk_json_decode_string},
3607fe6a43SSeth Howell 	{"filename", offsetof(struct rpc_construct_aio, filename), spdk_json_decode_string},
3707fe6a43SSeth Howell 	{"block_size", offsetof(struct rpc_construct_aio, block_size), spdk_json_decode_uint32, true},
384c6a2e3dSYuhua 	{"readonly", offsetof(struct rpc_construct_aio, readonly), spdk_json_decode_bool, true},
39648a5414Szhenwei pi 	{"fallocate", offsetof(struct rpc_construct_aio, fallocate), spdk_json_decode_bool, true},
40*e5693d68SMateusz Kozlowski 	{"uuid", offsetof(struct rpc_construct_aio, uuid), spdk_json_decode_uuid, true},
4107fe6a43SSeth Howell };
4207fe6a43SSeth Howell 
4307fe6a43SSeth Howell static void
4442c82595STomasz Zawadzki rpc_bdev_aio_create_cb(void *cb_arg)
4542c82595STomasz Zawadzki {
4642c82595STomasz Zawadzki 	struct rpc_construct_aio_ctx *ctx = cb_arg;
4742c82595STomasz Zawadzki 	struct spdk_jsonrpc_request *request = ctx->request;
4842c82595STomasz Zawadzki 	struct spdk_json_write_ctx *w;
4942c82595STomasz Zawadzki 
5042c82595STomasz Zawadzki 	w = spdk_jsonrpc_begin_result(request);
5142c82595STomasz Zawadzki 	spdk_json_write_string(w, ctx->req.name);
5242c82595STomasz Zawadzki 	spdk_jsonrpc_end_result(request, w);
5342c82595STomasz Zawadzki 	free_rpc_construct_aio(ctx);
5442c82595STomasz Zawadzki }
5542c82595STomasz Zawadzki 
5642c82595STomasz Zawadzki static void
570668d53bSSeth Howell rpc_bdev_aio_create(struct spdk_jsonrpc_request *request,
5807fe6a43SSeth Howell 		    const struct spdk_json_val *params)
5907fe6a43SSeth Howell {
6042c82595STomasz Zawadzki 	struct rpc_construct_aio_ctx *ctx;
6142c82595STomasz Zawadzki 	int rc;
6242c82595STomasz Zawadzki 
6342c82595STomasz Zawadzki 	ctx = calloc(1, sizeof(*ctx));
6442c82595STomasz Zawadzki 	if (!ctx) {
6542c82595STomasz Zawadzki 		spdk_jsonrpc_send_error_response(request, -ENOMEM, spdk_strerror(ENOMEM));
6642c82595STomasz Zawadzki 		return;
6742c82595STomasz Zawadzki 	}
6807fe6a43SSeth Howell 
6907fe6a43SSeth Howell 	if (spdk_json_decode_object(params, rpc_construct_aio_decoders,
7007fe6a43SSeth Howell 				    SPDK_COUNTOF(rpc_construct_aio_decoders),
7142c82595STomasz Zawadzki 				    &ctx->req)) {
7207fe6a43SSeth Howell 		SPDK_ERRLOG("spdk_json_decode_object failed\n");
7307fe6a43SSeth Howell 		spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_INTERNAL_ERROR,
7407fe6a43SSeth Howell 						 "spdk_json_decode_object failed");
7542c82595STomasz Zawadzki 		free_rpc_construct_aio(ctx);
7642c82595STomasz Zawadzki 		return;
7707fe6a43SSeth Howell 	}
7807fe6a43SSeth Howell 
7942c82595STomasz Zawadzki 	ctx->request = request;
80648a5414Szhenwei pi 	rc = create_aio_bdev(ctx->req.name, ctx->req.filename, ctx->req.block_size,
81*e5693d68SMateusz Kozlowski 			     ctx->req.readonly, ctx->req.fallocate, &ctx->req.uuid);
8207fe6a43SSeth Howell 	if (rc) {
8307fe6a43SSeth Howell 		spdk_jsonrpc_send_error_response(request, rc, spdk_strerror(-rc));
8442c82595STomasz Zawadzki 		free_rpc_construct_aio(ctx);
8542c82595STomasz Zawadzki 		return;
8607fe6a43SSeth Howell 	}
8707fe6a43SSeth Howell 
8842c82595STomasz Zawadzki 	spdk_bdev_wait_for_examine(rpc_bdev_aio_create_cb, ctx);
8907fe6a43SSeth Howell }
900668d53bSSeth Howell SPDK_RPC_REGISTER("bdev_aio_create", rpc_bdev_aio_create, SPDK_RPC_RUNTIME)
9107fe6a43SSeth Howell 
92b635d19aSshuochen0311 struct rpc_rescan_aio {
93b635d19aSshuochen0311 	char *name;
94b635d19aSshuochen0311 };
95b635d19aSshuochen0311 
96b635d19aSshuochen0311 static const struct spdk_json_object_decoder rpc_rescan_aio_decoders[] = {
97b635d19aSshuochen0311 	{"name", offsetof(struct rpc_rescan_aio, name), spdk_json_decode_string},
98b635d19aSshuochen0311 };
99b635d19aSshuochen0311 
100b635d19aSshuochen0311 static void
101b635d19aSshuochen0311 rpc_bdev_aio_rescan(struct spdk_jsonrpc_request *request,
102b635d19aSshuochen0311 		    const struct spdk_json_val *params)
103b635d19aSshuochen0311 {
104b635d19aSshuochen0311 	struct rpc_rescan_aio req = {NULL};
105b635d19aSshuochen0311 	int bdeverrno;
106b635d19aSshuochen0311 
107b635d19aSshuochen0311 	if (spdk_json_decode_object(params, rpc_rescan_aio_decoders,
108b635d19aSshuochen0311 				    SPDK_COUNTOF(rpc_rescan_aio_decoders),
109b635d19aSshuochen0311 				    &req)) {
110b635d19aSshuochen0311 		spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_INTERNAL_ERROR,
111b635d19aSshuochen0311 						 "spdk_json_decode_object failed");
112b635d19aSshuochen0311 		goto cleanup;
113b635d19aSshuochen0311 	}
114b635d19aSshuochen0311 
115d77d3179SShuhei Matsumoto 	bdeverrno = bdev_aio_rescan(req.name);
11624605155SChuanwei Ji 	if (bdeverrno) {
11724605155SChuanwei Ji 		spdk_jsonrpc_send_error_response(request, bdeverrno,
11824605155SChuanwei Ji 						 spdk_strerror(-bdeverrno));
11924605155SChuanwei Ji 		goto cleanup;
12024605155SChuanwei Ji 	}
121b635d19aSshuochen0311 
12224605155SChuanwei Ji 	spdk_jsonrpc_send_bool_response(request, true);
123b635d19aSshuochen0311 cleanup:
124b635d19aSshuochen0311 	free(req.name);
125b635d19aSshuochen0311 }
126b635d19aSshuochen0311 SPDK_RPC_REGISTER("bdev_aio_rescan", rpc_bdev_aio_rescan, SPDK_RPC_RUNTIME)
127b635d19aSshuochen0311 
12807fe6a43SSeth Howell struct rpc_delete_aio {
12907fe6a43SSeth Howell 	char *name;
13007fe6a43SSeth Howell };
13107fe6a43SSeth Howell 
13207fe6a43SSeth Howell static void
13307fe6a43SSeth Howell free_rpc_delete_aio(struct rpc_delete_aio *r)
13407fe6a43SSeth Howell {
13507fe6a43SSeth Howell 	free(r->name);
13607fe6a43SSeth Howell }
13707fe6a43SSeth Howell 
13807fe6a43SSeth Howell static const struct spdk_json_object_decoder rpc_delete_aio_decoders[] = {
13907fe6a43SSeth Howell 	{"name", offsetof(struct rpc_delete_aio, name), spdk_json_decode_string},
14007fe6a43SSeth Howell };
14107fe6a43SSeth Howell 
14207fe6a43SSeth Howell static void
1430668d53bSSeth Howell _rpc_bdev_aio_delete_cb(void *cb_arg, int bdeverrno)
14407fe6a43SSeth Howell {
14507fe6a43SSeth Howell 	struct spdk_jsonrpc_request *request = cb_arg;
14607fe6a43SSeth Howell 
147d3e394aeSShuhei Matsumoto 	if (bdeverrno == 0) {
148d3e394aeSShuhei Matsumoto 		spdk_jsonrpc_send_bool_response(request, true);
149d3e394aeSShuhei Matsumoto 	} else {
150d3e394aeSShuhei Matsumoto 		spdk_jsonrpc_send_error_response(request, bdeverrno, spdk_strerror(-bdeverrno));
151d3e394aeSShuhei Matsumoto 	}
15207fe6a43SSeth Howell }
15307fe6a43SSeth Howell 
15407fe6a43SSeth Howell static void
1550668d53bSSeth Howell rpc_bdev_aio_delete(struct spdk_jsonrpc_request *request,
15607fe6a43SSeth Howell 		    const struct spdk_json_val *params)
15707fe6a43SSeth Howell {
15807fe6a43SSeth Howell 	struct rpc_delete_aio req = {NULL};
15907fe6a43SSeth Howell 
16007fe6a43SSeth Howell 	if (spdk_json_decode_object(params, rpc_delete_aio_decoders,
16107fe6a43SSeth Howell 				    SPDK_COUNTOF(rpc_delete_aio_decoders),
16207fe6a43SSeth Howell 				    &req)) {
16307fe6a43SSeth Howell 		spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_INTERNAL_ERROR,
16407fe6a43SSeth Howell 						 "spdk_json_decode_object failed");
16507fe6a43SSeth Howell 		goto cleanup;
16607fe6a43SSeth Howell 	}
16707fe6a43SSeth Howell 
1684573e4ccSShuhei Matsumoto 	bdev_aio_delete(req.name, _rpc_bdev_aio_delete_cb, request);
16907fe6a43SSeth Howell 
17007fe6a43SSeth Howell cleanup:
17107fe6a43SSeth Howell 	free_rpc_delete_aio(&req);
17207fe6a43SSeth Howell }
1730668d53bSSeth Howell SPDK_RPC_REGISTER("bdev_aio_delete", rpc_bdev_aio_delete, SPDK_RPC_RUNTIME)
174