xref: /spdk/module/bdev/passthru/vbdev_passthru_rpc.c (revision 0098e636761237b77c12c30c2408263a5d2260cc)
1 /*   SPDX-License-Identifier: BSD-3-Clause
2  *   Copyright (c) Intel Corporation.
3  *   All rights reserved.
4  */
5 
6 #include "vbdev_passthru.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_bdev_passthru_create {
14 	char *base_bdev_name;
15 	char *name;
16 };
17 
18 /* Free the allocated memory resource after the RPC handling. */
19 static void
20 free_rpc_bdev_passthru_create(struct rpc_bdev_passthru_create *r)
21 {
22 	free(r->base_bdev_name);
23 	free(r->name);
24 }
25 
26 /* Structure to decode the input parameters for this RPC method. */
27 static const struct spdk_json_object_decoder rpc_bdev_passthru_create_decoders[] = {
28 	{"base_bdev_name", offsetof(struct rpc_bdev_passthru_create, base_bdev_name), spdk_json_decode_string},
29 	{"name", offsetof(struct rpc_bdev_passthru_create, name), spdk_json_decode_string},
30 };
31 
32 /* Decode the parameters for this RPC method and properly construct the passthru
33  * device. Error status returned in the failed cases.
34  */
35 static void
36 rpc_bdev_passthru_create(struct spdk_jsonrpc_request *request,
37 			 const struct spdk_json_val *params)
38 {
39 	struct rpc_bdev_passthru_create req = {NULL};
40 	struct spdk_json_write_ctx *w;
41 	int rc;
42 
43 	if (spdk_json_decode_object(params, rpc_bdev_passthru_create_decoders,
44 				    SPDK_COUNTOF(rpc_bdev_passthru_create_decoders),
45 				    &req)) {
46 		SPDK_DEBUGLOG(vbdev_passthru, "spdk_json_decode_object failed\n");
47 		spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_INTERNAL_ERROR,
48 						 "spdk_json_decode_object failed");
49 		goto cleanup;
50 	}
51 
52 	rc = bdev_passthru_create_disk(req.base_bdev_name, req.name);
53 	if (rc != 0) {
54 		spdk_jsonrpc_send_error_response(request, rc, spdk_strerror(-rc));
55 		goto cleanup;
56 	}
57 
58 	w = spdk_jsonrpc_begin_result(request);
59 	spdk_json_write_string(w, req.name);
60 	spdk_jsonrpc_end_result(request, w);
61 
62 cleanup:
63 	free_rpc_bdev_passthru_create(&req);
64 }
65 SPDK_RPC_REGISTER("bdev_passthru_create", rpc_bdev_passthru_create, SPDK_RPC_RUNTIME)
66 
67 struct rpc_bdev_passthru_delete {
68 	char *name;
69 };
70 
71 static void
72 free_rpc_bdev_passthru_delete(struct rpc_bdev_passthru_delete *req)
73 {
74 	free(req->name);
75 }
76 
77 static const struct spdk_json_object_decoder rpc_bdev_passthru_delete_decoders[] = {
78 	{"name", offsetof(struct rpc_bdev_passthru_delete, name), spdk_json_decode_string},
79 };
80 
81 static void
82 rpc_bdev_passthru_delete_cb(void *cb_arg, int bdeverrno)
83 {
84 	struct spdk_jsonrpc_request *request = cb_arg;
85 
86 	if (bdeverrno == 0) {
87 		spdk_jsonrpc_send_bool_response(request, true);
88 	} else {
89 		spdk_jsonrpc_send_error_response(request, bdeverrno, spdk_strerror(-bdeverrno));
90 	}
91 }
92 
93 static void
94 rpc_bdev_passthru_delete(struct spdk_jsonrpc_request *request,
95 			 const struct spdk_json_val *params)
96 {
97 	struct rpc_bdev_passthru_delete req = {NULL};
98 
99 	if (spdk_json_decode_object(params, rpc_bdev_passthru_delete_decoders,
100 				    SPDK_COUNTOF(rpc_bdev_passthru_delete_decoders),
101 				    &req)) {
102 		spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_INTERNAL_ERROR,
103 						 "spdk_json_decode_object failed");
104 		goto cleanup;
105 	}
106 
107 	bdev_passthru_delete_disk(req.name, rpc_bdev_passthru_delete_cb, request);
108 
109 cleanup:
110 	free_rpc_bdev_passthru_delete(&req);
111 }
112 SPDK_RPC_REGISTER("bdev_passthru_delete", rpc_bdev_passthru_delete, SPDK_RPC_RUNTIME)
113