1 /* SPDX-License-Identifier: BSD-3-Clause
2 * Copyright (C) 2019 Intel Corporation.
3 * All rights reserved.
4 */
5
6 #include "bdev_uring.h"
7 #include "spdk/rpc.h"
8 #include "spdk/util.h"
9 #include "spdk/string.h"
10 #include "spdk/log.h"
11
12 /* Structure to hold the parameters for this RPC method. */
13 struct rpc_create_uring {
14 char *name;
15 char *filename;
16 uint32_t block_size;
17 struct spdk_uuid uuid;
18 };
19
20 /* Free the allocated memory resource after the RPC handling. */
21 static void
free_rpc_create_uring(struct rpc_create_uring * r)22 free_rpc_create_uring(struct rpc_create_uring *r)
23 {
24 free(r->name);
25 free(r->filename);
26 }
27
28 /* Structure to decode the input parameters for this RPC method. */
29 static const struct spdk_json_object_decoder rpc_create_uring_decoders[] = {
30 {"name", offsetof(struct rpc_create_uring, name), spdk_json_decode_string},
31 {"filename", offsetof(struct rpc_create_uring, filename), spdk_json_decode_string},
32 {"block_size", offsetof(struct rpc_create_uring, block_size), spdk_json_decode_uint32, true},
33 {"uuid", offsetof(struct rpc_create_uring, uuid), spdk_json_decode_uuid, true},
34 };
35
36 /* Decode the parameters for this RPC method and properly create the uring
37 * device. Error status returned in the failed cases.
38 */
39 static void
rpc_bdev_uring_create(struct spdk_jsonrpc_request * request,const struct spdk_json_val * params)40 rpc_bdev_uring_create(struct spdk_jsonrpc_request *request,
41 const struct spdk_json_val *params)
42 {
43 struct rpc_create_uring req = {};
44 struct spdk_json_write_ctx *w;
45 struct spdk_bdev *bdev;
46 struct bdev_uring_opts opts = {};
47
48 if (spdk_json_decode_object(params, rpc_create_uring_decoders,
49 SPDK_COUNTOF(rpc_create_uring_decoders),
50 &req)) {
51 SPDK_ERRLOG("spdk_json_decode_object failed\n");
52 spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_INTERNAL_ERROR,
53 "spdk_json_decode_object failed");
54 goto cleanup;
55 }
56
57 opts.block_size = req.block_size;
58 opts.filename = req.filename;
59 opts.name = req.name;
60 opts.uuid = req.uuid;
61
62 bdev = create_uring_bdev(&opts);
63 if (!bdev) {
64 SPDK_ERRLOG("Unable to create URING bdev from file %s\n", req.filename);
65 spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_INTERNAL_ERROR,
66 "Unable to create URING bdev.");
67 goto cleanup;
68 }
69
70 w = spdk_jsonrpc_begin_result(request);
71 spdk_json_write_string(w, req.name);
72 spdk_jsonrpc_end_result(request, w);
73
74 cleanup:
75 free_rpc_create_uring(&req);
76 }
77 SPDK_RPC_REGISTER("bdev_uring_create", rpc_bdev_uring_create, SPDK_RPC_RUNTIME)
78
79 struct rpc_rescan_uring {
80 char *name;
81 };
82
83 static const struct spdk_json_object_decoder rpc_rescan_uring_decoders[] = {
84 {"name", offsetof(struct rpc_rescan_uring, name), spdk_json_decode_string},
85 };
86
87 static void
rpc_bdev_uring_rescan(struct spdk_jsonrpc_request * request,const struct spdk_json_val * params)88 rpc_bdev_uring_rescan(struct spdk_jsonrpc_request *request,
89 const struct spdk_json_val *params)
90 {
91 struct rpc_rescan_uring req = {NULL};
92 int bdeverrno;
93
94 if (spdk_json_decode_object(params, rpc_rescan_uring_decoders,
95 SPDK_COUNTOF(rpc_rescan_uring_decoders),
96 &req)) {
97 spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_INTERNAL_ERROR,
98 "spdk_json_decode_object failed");
99 goto cleanup;
100 }
101
102 bdeverrno = bdev_uring_rescan(req.name);
103 if (bdeverrno) {
104 spdk_jsonrpc_send_error_response(request, bdeverrno,
105 spdk_strerror(-bdeverrno));
106 goto cleanup;
107 }
108
109 spdk_jsonrpc_send_bool_response(request, true);
110 cleanup:
111 free(req.name);
112 }
113 SPDK_RPC_REGISTER("bdev_uring_rescan", rpc_bdev_uring_rescan, SPDK_RPC_RUNTIME)
114
115 struct rpc_delete_uring {
116 char *name;
117 };
118
119 static void
free_rpc_delete_uring(struct rpc_delete_uring * req)120 free_rpc_delete_uring(struct rpc_delete_uring *req)
121 {
122 free(req->name);
123 }
124
125 static const struct spdk_json_object_decoder rpc_delete_uring_decoders[] = {
126 {"name", offsetof(struct rpc_delete_uring, name), spdk_json_decode_string},
127 };
128
129 static void
_rpc_bdev_uring_delete_cb(void * cb_arg,int bdeverrno)130 _rpc_bdev_uring_delete_cb(void *cb_arg, int bdeverrno)
131 {
132 struct spdk_jsonrpc_request *request = cb_arg;
133
134 if (bdeverrno == 0) {
135 spdk_jsonrpc_send_bool_response(request, true);
136 } else {
137 spdk_jsonrpc_send_error_response(request, bdeverrno, spdk_strerror(-bdeverrno));
138 }
139
140 }
141
142 static void
rpc_bdev_uring_delete(struct spdk_jsonrpc_request * request,const struct spdk_json_val * params)143 rpc_bdev_uring_delete(struct spdk_jsonrpc_request *request,
144 const struct spdk_json_val *params)
145 {
146 struct rpc_delete_uring req = {NULL};
147
148 if (spdk_json_decode_object(params, rpc_delete_uring_decoders,
149 SPDK_COUNTOF(rpc_delete_uring_decoders),
150 &req)) {
151 spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_INTERNAL_ERROR,
152 "spdk_json_decode_object failed");
153 goto cleanup;
154 }
155
156 delete_uring_bdev(req.name, _rpc_bdev_uring_delete_cb, request);
157
158 cleanup:
159 free_rpc_delete_uring(&req);
160 }
161 SPDK_RPC_REGISTER("bdev_uring_delete", rpc_bdev_uring_delete, SPDK_RPC_RUNTIME)
162