xref: /spdk/module/fsdev/aio/fsdev_aio_rpc.c (revision e21c39aa707f29bcf6e1cb1989083b9cca3d9849)
1*e21c39aaSAnton Nayshtut /*   SPDX-License-Identifier: BSD-3-Clause
2*e21c39aaSAnton Nayshtut  *   Copyright (c) 2023 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
3*e21c39aaSAnton Nayshtut  */
4*e21c39aaSAnton Nayshtut 
5*e21c39aaSAnton Nayshtut #include "spdk/stdinc.h"
6*e21c39aaSAnton Nayshtut #include "spdk/log.h"
7*e21c39aaSAnton Nayshtut #include "spdk/string.h"
8*e21c39aaSAnton Nayshtut #include "spdk/rpc.h"
9*e21c39aaSAnton Nayshtut #include "spdk/util.h"
10*e21c39aaSAnton Nayshtut #include "fsdev_aio.h"
11*e21c39aaSAnton Nayshtut 
12*e21c39aaSAnton Nayshtut struct rpc_aio_create {
13*e21c39aaSAnton Nayshtut 	char *name;
14*e21c39aaSAnton Nayshtut 	char *root_path;
15*e21c39aaSAnton Nayshtut 	struct spdk_fsdev_aio_opts opts;
16*e21c39aaSAnton Nayshtut };
17*e21c39aaSAnton Nayshtut 
18*e21c39aaSAnton Nayshtut static void
19*e21c39aaSAnton Nayshtut free_rpc_aio_create(struct rpc_aio_create *req)
20*e21c39aaSAnton Nayshtut {
21*e21c39aaSAnton Nayshtut 	free(req->name);
22*e21c39aaSAnton Nayshtut 	free(req->root_path);
23*e21c39aaSAnton Nayshtut }
24*e21c39aaSAnton Nayshtut 
25*e21c39aaSAnton Nayshtut static const struct spdk_json_object_decoder rpc_aio_create_decoders[] = {
26*e21c39aaSAnton Nayshtut 	{"name", offsetof(struct rpc_aio_create, name), spdk_json_decode_string},
27*e21c39aaSAnton Nayshtut 	{"root_path", offsetof(struct rpc_aio_create, root_path), spdk_json_decode_string},
28*e21c39aaSAnton Nayshtut 	{"enable_xattr", offsetof(struct rpc_aio_create, opts.xattr_enabled), spdk_json_decode_bool, true},
29*e21c39aaSAnton Nayshtut 	{"enable_writeback_cache", offsetof(struct rpc_aio_create, opts.writeback_cache_enabled), spdk_json_decode_bool, true},
30*e21c39aaSAnton Nayshtut 	{"max_write", offsetof(struct rpc_aio_create, opts.max_write), spdk_json_decode_uint32, true},
31*e21c39aaSAnton Nayshtut };
32*e21c39aaSAnton Nayshtut 
33*e21c39aaSAnton Nayshtut static void
34*e21c39aaSAnton Nayshtut rpc_aio_create(struct spdk_jsonrpc_request *request, const struct spdk_json_val *params)
35*e21c39aaSAnton Nayshtut {
36*e21c39aaSAnton Nayshtut 	struct rpc_aio_create req = {};
37*e21c39aaSAnton Nayshtut 	struct spdk_json_write_ctx *w;
38*e21c39aaSAnton Nayshtut 	struct spdk_fsdev *fsdev;
39*e21c39aaSAnton Nayshtut 	int rc;
40*e21c39aaSAnton Nayshtut 
41*e21c39aaSAnton Nayshtut 	spdk_fsdev_aio_get_default_opts(&req.opts);
42*e21c39aaSAnton Nayshtut 
43*e21c39aaSAnton Nayshtut 	if (spdk_json_decode_object(params, rpc_aio_create_decoders,
44*e21c39aaSAnton Nayshtut 				    SPDK_COUNTOF(rpc_aio_create_decoders),
45*e21c39aaSAnton Nayshtut 				    &req)) {
46*e21c39aaSAnton Nayshtut 		SPDK_ERRLOG("spdk_json_decode_object failed\n");
47*e21c39aaSAnton Nayshtut 		spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_INVALID_PARAMS,
48*e21c39aaSAnton Nayshtut 						 "spdk_json_decode_object failed");
49*e21c39aaSAnton Nayshtut 
50*e21c39aaSAnton Nayshtut 		free_rpc_aio_create(&req);
51*e21c39aaSAnton Nayshtut 		return;
52*e21c39aaSAnton Nayshtut 	}
53*e21c39aaSAnton Nayshtut 
54*e21c39aaSAnton Nayshtut 	rc = spdk_fsdev_aio_create(&fsdev, req.name, req.root_path, &req.opts);
55*e21c39aaSAnton Nayshtut 	if (rc) {
56*e21c39aaSAnton Nayshtut 		SPDK_ERRLOG("Failed to create aio %s: rc %d\n", req.name, rc);
57*e21c39aaSAnton Nayshtut 		spdk_jsonrpc_send_error_response(request,
58*e21c39aaSAnton Nayshtut 						 SPDK_JSONRPC_ERROR_INTERNAL_ERROR,
59*e21c39aaSAnton Nayshtut 						 spdk_strerror(-rc));
60*e21c39aaSAnton Nayshtut 		free_rpc_aio_create(&req);
61*e21c39aaSAnton Nayshtut 		return;
62*e21c39aaSAnton Nayshtut 	}
63*e21c39aaSAnton Nayshtut 
64*e21c39aaSAnton Nayshtut 	w = spdk_jsonrpc_begin_result(request);
65*e21c39aaSAnton Nayshtut 	spdk_json_write_string(w, fsdev->name);
66*e21c39aaSAnton Nayshtut 	spdk_jsonrpc_end_result(request, w);
67*e21c39aaSAnton Nayshtut 	free_rpc_aio_create(&req);
68*e21c39aaSAnton Nayshtut }
69*e21c39aaSAnton Nayshtut SPDK_RPC_REGISTER("fsdev_aio_create", rpc_aio_create, SPDK_RPC_RUNTIME)
70*e21c39aaSAnton Nayshtut 
71*e21c39aaSAnton Nayshtut struct rpc_aio_delete {
72*e21c39aaSAnton Nayshtut 	char *name;
73*e21c39aaSAnton Nayshtut };
74*e21c39aaSAnton Nayshtut 
75*e21c39aaSAnton Nayshtut static const struct spdk_json_object_decoder rpc_aio_delete_decoders[] = {
76*e21c39aaSAnton Nayshtut 	{"name", offsetof(struct rpc_aio_delete, name), spdk_json_decode_string},
77*e21c39aaSAnton Nayshtut };
78*e21c39aaSAnton Nayshtut 
79*e21c39aaSAnton Nayshtut static void
80*e21c39aaSAnton Nayshtut rpc_aio_delete_cb(void *cb_arg, int fsdeverrno)
81*e21c39aaSAnton Nayshtut {
82*e21c39aaSAnton Nayshtut 	struct spdk_jsonrpc_request *request = cb_arg;
83*e21c39aaSAnton Nayshtut 
84*e21c39aaSAnton Nayshtut 	if (fsdeverrno == 0) {
85*e21c39aaSAnton Nayshtut 		spdk_jsonrpc_send_bool_response(request, true);
86*e21c39aaSAnton Nayshtut 	} else {
87*e21c39aaSAnton Nayshtut 		spdk_jsonrpc_send_error_response(request, fsdeverrno, spdk_strerror(-fsdeverrno));
88*e21c39aaSAnton Nayshtut 	}
89*e21c39aaSAnton Nayshtut }
90*e21c39aaSAnton Nayshtut 
91*e21c39aaSAnton Nayshtut static void
92*e21c39aaSAnton Nayshtut rpc_aio_delete(struct spdk_jsonrpc_request *request, const struct spdk_json_val *params)
93*e21c39aaSAnton Nayshtut {
94*e21c39aaSAnton Nayshtut 	struct rpc_aio_delete req = {};
95*e21c39aaSAnton Nayshtut 
96*e21c39aaSAnton Nayshtut 	if (spdk_json_decode_object(params, rpc_aio_delete_decoders,
97*e21c39aaSAnton Nayshtut 				    SPDK_COUNTOF(rpc_aio_delete_decoders),
98*e21c39aaSAnton Nayshtut 				    &req)) {
99*e21c39aaSAnton Nayshtut 		SPDK_ERRLOG("spdk_json_decode_object failed\n");
100*e21c39aaSAnton Nayshtut 		spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_INVALID_PARAMS,
101*e21c39aaSAnton Nayshtut 						 "spdk_json_decode_object failed");
102*e21c39aaSAnton Nayshtut 
103*e21c39aaSAnton Nayshtut 		free(req.name);
104*e21c39aaSAnton Nayshtut 		return;
105*e21c39aaSAnton Nayshtut 	}
106*e21c39aaSAnton Nayshtut 
107*e21c39aaSAnton Nayshtut 	spdk_fsdev_aio_delete(req.name, rpc_aio_delete_cb, request);
108*e21c39aaSAnton Nayshtut 	free(req.name);
109*e21c39aaSAnton Nayshtut }
110*e21c39aaSAnton Nayshtut SPDK_RPC_REGISTER("fsdev_aio_delete", rpc_aio_delete, SPDK_RPC_RUNTIME)
111