xref: /spdk/module/bdev/daos/bdev_daos_rpc.c (revision 784b9d48746955f210926648a0131f84f58de76f)
1 /*   SPDX-License-Identifier: BSD-3-Clause
2  *   Copyright (c) croit GmbH.
3  *   All rights reserved.
4  */
5 
6 #include "bdev_daos.h"
7 #include "spdk/rpc.h"
8 #include "spdk/util.h"
9 #include "spdk/uuid.h"
10 #include "spdk/string.h"
11 #include "spdk/log.h"
12 
13 struct rpc_construct_daos {
14 	char *name;
15 	char *uuid;
16 	char *pool;
17 	char *cont;
18 	char *oclass;
19 	uint64_t num_blocks;
20 	uint32_t block_size;
21 };
22 
23 static void
24 free_rpc_construct_daos(struct rpc_construct_daos *r)
25 {
26 	free(r->name);
27 	free(r->uuid);
28 	free(r->pool);
29 	free(r->cont);
30 	free(r->oclass);
31 }
32 
33 static const struct spdk_json_object_decoder rpc_construct_daos_decoders[] = {
34 	{"name", offsetof(struct rpc_construct_daos, name), spdk_json_decode_string},
35 	{"uuid", offsetof(struct rpc_construct_daos, uuid), spdk_json_decode_string, true},
36 	{"pool", offsetof(struct rpc_construct_daos, pool), spdk_json_decode_string},
37 	{"cont", offsetof(struct rpc_construct_daos, cont), spdk_json_decode_string},
38 	{"oclass", offsetof(struct rpc_construct_daos, oclass), spdk_json_decode_string, true},
39 	{"num_blocks", offsetof(struct rpc_construct_daos, num_blocks), spdk_json_decode_uint64},
40 	{"block_size", offsetof(struct rpc_construct_daos, block_size), spdk_json_decode_uint32},
41 };
42 
43 static void
44 rpc_bdev_daos_create(struct spdk_jsonrpc_request *request,
45 		     const struct spdk_json_val *params)
46 {
47 	struct rpc_construct_daos req = {NULL};
48 	struct spdk_json_write_ctx *w;
49 	struct spdk_uuid *uuid = NULL;
50 	struct spdk_uuid decoded_uuid;
51 	struct spdk_bdev *bdev;
52 	int rc = 0;
53 
54 	if (spdk_json_decode_object(params, rpc_construct_daos_decoders,
55 				    SPDK_COUNTOF(rpc_construct_daos_decoders),
56 				    &req)) {
57 		SPDK_DEBUGLOG(bdev_daos, "spdk_json_decode_object failed\n");
58 		spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_PARSE_ERROR,
59 						 "spdk_json_decode_object failed");
60 		goto cleanup;
61 	}
62 
63 	if (req.uuid) {
64 		if (spdk_uuid_parse(&decoded_uuid, req.uuid)) {
65 			spdk_jsonrpc_send_error_response(request, -EINVAL,
66 							 "Failed to parse bdev UUID");
67 			goto cleanup;
68 		}
69 		uuid = &decoded_uuid;
70 	}
71 
72 	rc = create_bdev_daos(&bdev, req.name, uuid, req.pool, req.cont, req.oclass,
73 			      req.num_blocks, req.block_size);
74 	if (rc) {
75 		spdk_jsonrpc_send_error_response(request, rc, spdk_strerror(-rc));
76 		goto cleanup;
77 	}
78 
79 	free_rpc_construct_daos(&req);
80 
81 	w = spdk_jsonrpc_begin_result(request);
82 	spdk_json_write_string(w, spdk_bdev_get_name(bdev));
83 	spdk_jsonrpc_end_result(request, w);
84 	return;
85 
86 cleanup:
87 	free_rpc_construct_daos(&req);
88 }
89 SPDK_RPC_REGISTER("bdev_daos_create", rpc_bdev_daos_create, SPDK_RPC_RUNTIME)
90 SPDK_RPC_REGISTER_ALIAS_DEPRECATED(bdev_daos_create, construct_daos_bdev)
91 
92 struct rpc_delete_daos {
93 	char *name;
94 };
95 
96 static void
97 free_rpc_delete_daos(struct rpc_delete_daos *r)
98 {
99 	free(r->name);
100 }
101 
102 static const struct spdk_json_object_decoder rpc_delete_daos_decoders[] = {
103 	{"name", offsetof(struct rpc_delete_daos, name), spdk_json_decode_string},
104 };
105 
106 static void
107 rpc_bdev_daos_delete_cb(void *cb_arg, int bdeverrno)
108 {
109 	struct spdk_jsonrpc_request *request = cb_arg;
110 
111 	spdk_jsonrpc_send_bool_response(request, bdeverrno == 0);
112 }
113 
114 static void
115 rpc_bdev_daos_delete(struct spdk_jsonrpc_request *request,
116 		     const struct spdk_json_val *params)
117 {
118 	struct rpc_delete_daos req = {NULL};
119 	struct spdk_bdev *bdev;
120 
121 	if (spdk_json_decode_object(params, rpc_delete_daos_decoders,
122 				    SPDK_COUNTOF(rpc_delete_daos_decoders),
123 				    &req)) {
124 		SPDK_DEBUGLOG(bdev_daos, "spdk_json_decode_object failed\n");
125 		spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_PARSE_ERROR,
126 						 "spdk_json_decode_object failed");
127 		goto cleanup;
128 	}
129 
130 	bdev = spdk_bdev_get_by_name(req.name);
131 	if (bdev == NULL) {
132 		SPDK_INFOLOG(bdev_daos, "bdev '%s' does not exist\n", req.name);
133 		spdk_jsonrpc_send_error_response(request, -ENODEV, spdk_strerror(ENODEV));
134 		goto cleanup;
135 	}
136 
137 	delete_bdev_daos(bdev, rpc_bdev_daos_delete_cb, request);
138 
139 cleanup:
140 	free_rpc_delete_daos(&req);
141 }
142 
143 SPDK_RPC_REGISTER("bdev_daos_delete", rpc_bdev_daos_delete, SPDK_RPC_RUNTIME)
144 SPDK_RPC_REGISTER_ALIAS_DEPRECATED(bdev_daos_delete, delete_daos_bdev)
145 
146 struct rpc_bdev_daos_resize {
147 	char *name;
148 	uint64_t new_size;
149 };
150 
151 static const struct spdk_json_object_decoder rpc_bdev_daos_resize_decoders[] = {
152 	{"name", offsetof(struct rpc_bdev_daos_resize, name), spdk_json_decode_string},
153 	{"new_size", offsetof(struct rpc_bdev_daos_resize, new_size), spdk_json_decode_uint64}
154 };
155 
156 static void
157 free_rpc_bdev_daos_resize(struct rpc_bdev_daos_resize *req)
158 {
159 	free(req->name);
160 }
161 
162 static void
163 rpc_bdev_daos_resize(struct spdk_jsonrpc_request *request,
164 		     const struct spdk_json_val *params)
165 {
166 	struct rpc_bdev_daos_resize req = {};
167 	int rc;
168 
169 	if (spdk_json_decode_object(params, rpc_bdev_daos_resize_decoders,
170 				    SPDK_COUNTOF(rpc_bdev_daos_resize_decoders),
171 				    &req)) {
172 		spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_INTERNAL_ERROR,
173 						 "spdk_json_decode_object failed");
174 		goto cleanup;
175 	}
176 
177 	rc = bdev_daos_resize(req.name, req.new_size);
178 	if (rc) {
179 		spdk_jsonrpc_send_error_response(request, rc, spdk_strerror(-rc));
180 		goto cleanup;
181 	}
182 
183 	spdk_jsonrpc_send_bool_response(request, true);
184 cleanup:
185 	free_rpc_bdev_daos_resize(&req);
186 }
187 SPDK_RPC_REGISTER("bdev_daos_resize", rpc_bdev_daos_resize, SPDK_RPC_RUNTIME)
188