xref: /spdk/test/external_code/passthru/vbdev_passthru_rpc.c (revision a1dfa7ec92a6c49538482c8bb73f0b1ce040441f)
1 /*   SPDX-License-Identifier: BSD-3-Clause
2  *   Copyright (C) 2020 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_external_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("construct_ext_passthru_bdev", 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 	spdk_jsonrpc_send_bool_response(request, bdeverrno == 0);
87 }
88 
89 static void
90 rpc_bdev_passthru_delete(struct spdk_jsonrpc_request *request,
91 			 const struct spdk_json_val *params)
92 {
93 	struct rpc_bdev_passthru_delete req = {NULL};
94 	struct spdk_bdev *bdev;
95 
96 	if (spdk_json_decode_object(params, rpc_bdev_passthru_delete_decoders,
97 				    SPDK_COUNTOF(rpc_bdev_passthru_delete_decoders),
98 				    &req)) {
99 		spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_INTERNAL_ERROR,
100 						 "spdk_json_decode_object failed");
101 		goto cleanup;
102 	}
103 
104 	bdev = spdk_bdev_get_by_name(req.name);
105 	if (bdev == NULL) {
106 		spdk_jsonrpc_send_error_response(request, -ENODEV, spdk_strerror(ENODEV));
107 		goto cleanup;
108 	}
109 
110 	bdev_passthru_external_delete_disk(bdev, rpc_bdev_passthru_delete_cb, request);
111 
112 cleanup:
113 	free_rpc_bdev_passthru_delete(&req);
114 }
115 SPDK_RPC_REGISTER("delete_ext_passthru_bdev", rpc_bdev_passthru_delete, SPDK_RPC_RUNTIME)
116