xref: /spdk/module/bdev/uring/bdev_uring_rpc.c (revision 8130039ee5287100d9eb93eb886967645da3d545)
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
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
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
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
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
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
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