xref: /spdk/lib/vhost/vhost_rpc.c (revision 840a5d2e7cdb5980ed622e69ff13679259d2947e)
1488570ebSJim Harris /*   SPDX-License-Identifier: BSD-3-Clause
2a6dbe372Spaul luse  *   Copyright (C) 2017 Intel Corporation. All rights reserved.
31dbf53eeSPiotr Pelplinski  *   All rights reserved.
41dbf53eeSPiotr Pelplinski  */
51dbf53eeSPiotr Pelplinski 
6b961d9ccSBen Walker #include "spdk/stdinc.h"
70d7e2b64SPawel Wodkowski 
84e8e97c8STomasz Zawadzki #include "spdk/log.h"
91dbf53eeSPiotr Pelplinski #include "spdk/rpc.h"
10b58a5d73SDaniel Verkamp #include "spdk/util.h"
114d43844fSSeth Howell #include "spdk/string.h"
12bb252345SDariusz Stojaczyk #include "spdk/env.h"
1362eb2315SDariusz Stojaczyk #include "spdk/scsi.h"
141dbf53eeSPiotr Pelplinski #include "spdk/vhost.h"
151b93872dSPawel Wodkowski #include "vhost_internal.h"
16ff88449dSPawel Niedzwiecki #include "spdk/bdev.h"
171dbf53eeSPiotr Pelplinski 
181dbf53eeSPiotr Pelplinski struct rpc_vhost_scsi_ctrlr {
191dbf53eeSPiotr Pelplinski 	char *ctrlr;
201dbf53eeSPiotr Pelplinski 	char *cpumask;
21dc93bd85SHaoqian He 	bool delay;
221dbf53eeSPiotr Pelplinski };
231dbf53eeSPiotr Pelplinski 
2496e5267bSPawel Wodkowski static void
2596e5267bSPawel Wodkowski free_rpc_vhost_scsi_ctrlr(struct rpc_vhost_scsi_ctrlr *req)
2696e5267bSPawel Wodkowski {
2796e5267bSPawel Wodkowski 	free(req->ctrlr);
2896e5267bSPawel Wodkowski 	free(req->cpumask);
2996e5267bSPawel Wodkowski }
3096e5267bSPawel Wodkowski 
31c7e05d83SPawel Kaminski static const struct spdk_json_object_decoder rpc_vhost_create_scsi_ctrlr[] = {
321dbf53eeSPiotr Pelplinski 	{"ctrlr", offsetof(struct rpc_vhost_scsi_ctrlr, ctrlr), spdk_json_decode_string },
331dbf53eeSPiotr Pelplinski 	{"cpumask", offsetof(struct rpc_vhost_scsi_ctrlr, cpumask), spdk_json_decode_string, true},
34dc93bd85SHaoqian He 	{"delay", offsetof(struct rpc_vhost_scsi_ctrlr, delay), spdk_json_decode_bool, true},
351dbf53eeSPiotr Pelplinski };
361dbf53eeSPiotr Pelplinski 
371dbf53eeSPiotr Pelplinski static void
38dbaa2c79SSeth Howell rpc_vhost_create_scsi_controller(struct spdk_jsonrpc_request *request,
392bdec64fSDaniel Verkamp 				 const struct spdk_json_val *params)
401dbf53eeSPiotr Pelplinski {
411dbf53eeSPiotr Pelplinski 	struct rpc_vhost_scsi_ctrlr req = {0};
421dbf53eeSPiotr Pelplinski 	int rc;
431dbf53eeSPiotr Pelplinski 
44c7e05d83SPawel Kaminski 	if (spdk_json_decode_object(params, rpc_vhost_create_scsi_ctrlr,
45c7e05d83SPawel Kaminski 				    SPDK_COUNTOF(rpc_vhost_create_scsi_ctrlr),
461dbf53eeSPiotr Pelplinski 				    &req)) {
472172c432STomasz Zawadzki 		SPDK_DEBUGLOG(vhost_rpc, "spdk_json_decode_object failed\n");
481dbf53eeSPiotr Pelplinski 		rc = -EINVAL;
491dbf53eeSPiotr Pelplinski 		goto invalid;
501dbf53eeSPiotr Pelplinski 	}
511dbf53eeSPiotr Pelplinski 
52dc93bd85SHaoqian He 	if (req.delay) {
53dc93bd85SHaoqian He 		rc = spdk_vhost_scsi_dev_construct_no_start(req.ctrlr, req.cpumask);
54dc93bd85SHaoqian He 	} else {
555aaffa84SDariusz Stojaczyk 		rc = spdk_vhost_scsi_dev_construct(req.ctrlr, req.cpumask);
56dc93bd85SHaoqian He 	}
571dbf53eeSPiotr Pelplinski 	if (rc < 0) {
581dbf53eeSPiotr Pelplinski 		goto invalid;
591dbf53eeSPiotr Pelplinski 	}
601dbf53eeSPiotr Pelplinski 
6196e5267bSPawel Wodkowski 	free_rpc_vhost_scsi_ctrlr(&req);
6296e5267bSPawel Wodkowski 
63d73077b8Syidong0635 	spdk_jsonrpc_send_bool_response(request, true);
642bdec64fSDaniel Verkamp 	return;
652bdec64fSDaniel Verkamp 
661dbf53eeSPiotr Pelplinski invalid:
6796e5267bSPawel Wodkowski 	free_rpc_vhost_scsi_ctrlr(&req);
68891c12a6SPawel Wodkowski 	spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_INVALID_PARAMS,
69891c12a6SPawel Wodkowski 					 spdk_strerror(-rc));
701dbf53eeSPiotr Pelplinski }
71dbaa2c79SSeth Howell SPDK_RPC_REGISTER("vhost_create_scsi_controller", rpc_vhost_create_scsi_controller,
72e008db08SShuhei Matsumoto 		  SPDK_RPC_RUNTIME)
731dbf53eeSPiotr Pelplinski 
74dc93bd85SHaoqian He struct rpc_start_vhost_scsi_ctrlr {
75dc93bd85SHaoqian He 	char *ctrlr;
76dc93bd85SHaoqian He };
77dc93bd85SHaoqian He 
78dc93bd85SHaoqian He static void
79dc93bd85SHaoqian He free_rpc_start_vhost_scsi_ctrlr(struct rpc_start_vhost_scsi_ctrlr *req)
80dc93bd85SHaoqian He {
81dc93bd85SHaoqian He 	free(req->ctrlr);
82dc93bd85SHaoqian He }
83dc93bd85SHaoqian He 
84dc93bd85SHaoqian He static const struct spdk_json_object_decoder rpc_start_vhost_scsi_ctrlr_decoder[] = {
85dc93bd85SHaoqian He 	{"ctrlr", offsetof(struct rpc_start_vhost_scsi_ctrlr, ctrlr), spdk_json_decode_string },
86dc93bd85SHaoqian He };
87dc93bd85SHaoqian He 
88dc93bd85SHaoqian He static void
89dc93bd85SHaoqian He rpc_vhost_start_scsi_controller(struct spdk_jsonrpc_request *request,
90dc93bd85SHaoqian He 				const struct spdk_json_val *params)
91dc93bd85SHaoqian He {
92dc93bd85SHaoqian He 	struct rpc_start_vhost_scsi_ctrlr req = {0};
93dc93bd85SHaoqian He 	int rc;
94dc93bd85SHaoqian He 
95dc93bd85SHaoqian He 	if (spdk_json_decode_object(params, rpc_start_vhost_scsi_ctrlr_decoder,
96dc93bd85SHaoqian He 				    SPDK_COUNTOF(rpc_start_vhost_scsi_ctrlr_decoder),
97dc93bd85SHaoqian He 				    &req)) {
98dc93bd85SHaoqian He 		SPDK_DEBUGLOG(vhost_rpc, "spdk_json_decode_object failed\n");
99dc93bd85SHaoqian He 		rc = -EINVAL;
100dc93bd85SHaoqian He 		goto invalid;
101dc93bd85SHaoqian He 	}
102dc93bd85SHaoqian He 
103dc93bd85SHaoqian He 	rc = vhost_scsi_controller_start(req.ctrlr);
104dc93bd85SHaoqian He 	if (rc < 0) {
105dc93bd85SHaoqian He 		goto invalid;
106dc93bd85SHaoqian He 	}
107dc93bd85SHaoqian He 
108dc93bd85SHaoqian He 	free_rpc_start_vhost_scsi_ctrlr(&req);
109dc93bd85SHaoqian He 
110dc93bd85SHaoqian He 	spdk_jsonrpc_send_bool_response(request, true);
111dc93bd85SHaoqian He 	return;
112dc93bd85SHaoqian He 
113dc93bd85SHaoqian He invalid:
114dc93bd85SHaoqian He 	free_rpc_start_vhost_scsi_ctrlr(&req);
115dc93bd85SHaoqian He 	spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_INVALID_PARAMS,
116dc93bd85SHaoqian He 					 spdk_strerror(-rc));
117dc93bd85SHaoqian He }
118dc93bd85SHaoqian He SPDK_RPC_REGISTER("vhost_start_scsi_controller", rpc_vhost_start_scsi_controller,
119dc93bd85SHaoqian He 		  SPDK_RPC_RUNTIME)
120dc93bd85SHaoqian He 
121d4245df9SPawel Kaminski struct rpc_vhost_scsi_ctrlr_add_target {
1221dbf53eeSPiotr Pelplinski 	char *ctrlr;
12348834f0dSPawel Wodkowski 	int32_t scsi_target_num;
124583e9699SShuhei Matsumoto 	char *bdev_name;
1251dbf53eeSPiotr Pelplinski };
1261dbf53eeSPiotr Pelplinski 
12796e5267bSPawel Wodkowski static void
128d4245df9SPawel Kaminski free_rpc_vhost_scsi_ctrlr_add_target(struct rpc_vhost_scsi_ctrlr_add_target *req)
12996e5267bSPawel Wodkowski {
13096e5267bSPawel Wodkowski 	free(req->ctrlr);
131583e9699SShuhei Matsumoto 	free(req->bdev_name);
13296e5267bSPawel Wodkowski }
13396e5267bSPawel Wodkowski 
134d4245df9SPawel Kaminski static const struct spdk_json_object_decoder rpc_vhost_scsi_ctrlr_add_target[] = {
135d4245df9SPawel Kaminski 	{"ctrlr", offsetof(struct rpc_vhost_scsi_ctrlr_add_target, ctrlr), spdk_json_decode_string },
136d4245df9SPawel Kaminski 	{"scsi_target_num", offsetof(struct rpc_vhost_scsi_ctrlr_add_target, scsi_target_num), spdk_json_decode_int32},
137d4245df9SPawel Kaminski 	{"bdev_name", offsetof(struct rpc_vhost_scsi_ctrlr_add_target, bdev_name), spdk_json_decode_string },
1381dbf53eeSPiotr Pelplinski };
1391dbf53eeSPiotr Pelplinski 
1401dbf53eeSPiotr Pelplinski static void
141dbaa2c79SSeth Howell rpc_vhost_scsi_controller_add_target(struct spdk_jsonrpc_request *request,
1422bdec64fSDaniel Verkamp 				     const struct spdk_json_val *params)
1431dbf53eeSPiotr Pelplinski {
144d4245df9SPawel Kaminski 	struct rpc_vhost_scsi_ctrlr_add_target req = {0};
145dd4f161bSDarek Stojaczyk 	struct spdk_json_write_ctx *w;
146dd4f161bSDarek Stojaczyk 	struct spdk_vhost_dev *vdev;
147bb252345SDariusz Stojaczyk 	int rc;
1481dbf53eeSPiotr Pelplinski 
149d4245df9SPawel Kaminski 	if (spdk_json_decode_object(params, rpc_vhost_scsi_ctrlr_add_target,
150d4245df9SPawel Kaminski 				    SPDK_COUNTOF(rpc_vhost_scsi_ctrlr_add_target),
151244a619fSDarek Stojaczyk 				    &req)) {
1522172c432STomasz Zawadzki 		SPDK_DEBUGLOG(vhost_rpc, "spdk_json_decode_object failed\n");
1531dbf53eeSPiotr Pelplinski 		rc = -EINVAL;
1541dbf53eeSPiotr Pelplinski 		goto invalid;
1551dbf53eeSPiotr Pelplinski 	}
1561dbf53eeSPiotr Pelplinski 
157dd4f161bSDarek Stojaczyk 	spdk_vhost_lock();
158244a619fSDarek Stojaczyk 	vdev = spdk_vhost_dev_find(req.ctrlr);
159dd4f161bSDarek Stojaczyk 	if (vdev == NULL) {
160dd4f161bSDarek Stojaczyk 		spdk_vhost_unlock();
161dd4f161bSDarek Stojaczyk 		rc = -ENODEV;
162dd4f161bSDarek Stojaczyk 		goto invalid;
163dd4f161bSDarek Stojaczyk 	}
1641dbf53eeSPiotr Pelplinski 
165244a619fSDarek Stojaczyk 	rc = spdk_vhost_scsi_dev_add_tgt(vdev, req.scsi_target_num, req.bdev_name);
166dd4f161bSDarek Stojaczyk 	spdk_vhost_unlock();
167dd4f161bSDarek Stojaczyk 	if (rc < 0) {
168dd4f161bSDarek Stojaczyk 		goto invalid;
169dd4f161bSDarek Stojaczyk 	}
170dd4f161bSDarek Stojaczyk 
171d4245df9SPawel Kaminski 	free_rpc_vhost_scsi_ctrlr_add_target(&req);
172dd4f161bSDarek Stojaczyk 
173dd4f161bSDarek Stojaczyk 	w = spdk_jsonrpc_begin_result(request);
174dd4f161bSDarek Stojaczyk 	spdk_json_write_int32(w, rc);
175dd4f161bSDarek Stojaczyk 	spdk_jsonrpc_end_result(request, w);
1761dbf53eeSPiotr Pelplinski 	return;
1772bdec64fSDaniel Verkamp 
1781dbf53eeSPiotr Pelplinski invalid:
179d4245df9SPawel Kaminski 	free_rpc_vhost_scsi_ctrlr_add_target(&req);
180891c12a6SPawel Wodkowski 	spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_INVALID_PARAMS,
181891c12a6SPawel Wodkowski 					 spdk_strerror(-rc));
1821dbf53eeSPiotr Pelplinski }
183dbaa2c79SSeth Howell SPDK_RPC_REGISTER("vhost_scsi_controller_add_target", rpc_vhost_scsi_controller_add_target,
184d4245df9SPawel Kaminski 		  SPDK_RPC_RUNTIME)
185679e2831SDariusz Stojaczyk 
1860709cc48SSebastian Basierski struct rpc_remove_vhost_scsi_ctrlr_target {
187679e2831SDariusz Stojaczyk 	char *ctrlr;
1880709cc48SSebastian Basierski 	uint32_t scsi_target_num;
189679e2831SDariusz Stojaczyk };
190679e2831SDariusz Stojaczyk 
191679e2831SDariusz Stojaczyk static void
1920709cc48SSebastian Basierski free_rpc_remove_vhost_scsi_ctrlr_target(struct rpc_remove_vhost_scsi_ctrlr_target *req)
193679e2831SDariusz Stojaczyk {
194679e2831SDariusz Stojaczyk 	free(req->ctrlr);
195679e2831SDariusz Stojaczyk }
196679e2831SDariusz Stojaczyk 
1970709cc48SSebastian Basierski static const struct spdk_json_object_decoder rpc_vhost_remove_target[] = {
1980709cc48SSebastian Basierski 	{"ctrlr", offsetof(struct rpc_remove_vhost_scsi_ctrlr_target, ctrlr), spdk_json_decode_string },
1990709cc48SSebastian Basierski 	{"scsi_target_num", offsetof(struct rpc_remove_vhost_scsi_ctrlr_target, scsi_target_num), spdk_json_decode_uint32},
200679e2831SDariusz Stojaczyk };
201679e2831SDariusz Stojaczyk 
202bb252345SDariusz Stojaczyk static int
203dbaa2c79SSeth Howell rpc_vhost_scsi_controller_remove_target_finish_cb(struct spdk_vhost_dev *vdev, void *arg)
204bb252345SDariusz Stojaczyk {
205244a619fSDarek Stojaczyk 	struct spdk_jsonrpc_request *request = arg;
206bb252345SDariusz Stojaczyk 
207d73077b8Syidong0635 	spdk_jsonrpc_send_bool_response(request, true);
208bb252345SDariusz Stojaczyk 	return 0;
209ad9a842cSDariusz Stojaczyk }
210ad9a842cSDariusz Stojaczyk 
211679e2831SDariusz Stojaczyk static void
212dbaa2c79SSeth Howell rpc_vhost_scsi_controller_remove_target(struct spdk_jsonrpc_request *request,
2132bdec64fSDaniel Verkamp 					const struct spdk_json_val *params)
214679e2831SDariusz Stojaczyk {
215244a619fSDarek Stojaczyk 	struct rpc_remove_vhost_scsi_ctrlr_target req = {0};
216dd4f161bSDarek Stojaczyk 	struct spdk_vhost_dev *vdev;
217679e2831SDariusz Stojaczyk 	int rc;
218679e2831SDariusz Stojaczyk 
2190709cc48SSebastian Basierski 	if (spdk_json_decode_object(params, rpc_vhost_remove_target,
2200709cc48SSebastian Basierski 				    SPDK_COUNTOF(rpc_vhost_remove_target),
221244a619fSDarek Stojaczyk 				    &req)) {
2222172c432STomasz Zawadzki 		SPDK_DEBUGLOG(vhost_rpc, "spdk_json_decode_object failed\n");
223679e2831SDariusz Stojaczyk 		rc = -EINVAL;
224679e2831SDariusz Stojaczyk 		goto invalid;
225679e2831SDariusz Stojaczyk 	}
226679e2831SDariusz Stojaczyk 
227dd4f161bSDarek Stojaczyk 	spdk_vhost_lock();
228244a619fSDarek Stojaczyk 	vdev = spdk_vhost_dev_find(req.ctrlr);
229dd4f161bSDarek Stojaczyk 	if (vdev == NULL) {
230dd4f161bSDarek Stojaczyk 		spdk_vhost_unlock();
231dd4f161bSDarek Stojaczyk 		rc = -ENODEV;
232dd4f161bSDarek Stojaczyk 		goto invalid;
233dd4f161bSDarek Stojaczyk 	}
234679e2831SDariusz Stojaczyk 
235244a619fSDarek Stojaczyk 	rc = spdk_vhost_scsi_dev_remove_tgt(vdev, req.scsi_target_num,
236dbaa2c79SSeth Howell 					    rpc_vhost_scsi_controller_remove_target_finish_cb,
237244a619fSDarek Stojaczyk 					    request);
238dd4f161bSDarek Stojaczyk 	spdk_vhost_unlock();
239dd4f161bSDarek Stojaczyk 	if (rc < 0) {
240dd4f161bSDarek Stojaczyk 		goto invalid;
241dd4f161bSDarek Stojaczyk 	}
242244a619fSDarek Stojaczyk 
243244a619fSDarek Stojaczyk 	free_rpc_remove_vhost_scsi_ctrlr_target(&req);
244679e2831SDariusz Stojaczyk 	return;
2452bdec64fSDaniel Verkamp 
246679e2831SDariusz Stojaczyk invalid:
247244a619fSDarek Stojaczyk 	free_rpc_remove_vhost_scsi_ctrlr_target(&req);
248891c12a6SPawel Wodkowski 	spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_INVALID_PARAMS,
249891c12a6SPawel Wodkowski 					 spdk_strerror(-rc));
250679e2831SDariusz Stojaczyk }
251bb252345SDariusz Stojaczyk 
25236e04eb4SPawel Kaminski SPDK_RPC_REGISTER("vhost_scsi_controller_remove_target",
253dbaa2c79SSeth Howell 		  rpc_vhost_scsi_controller_remove_target, SPDK_RPC_RUNTIME)
254ff88449dSPawel Niedzwiecki 
255ff88449dSPawel Niedzwiecki struct rpc_vhost_blk_ctrlr {
256ff88449dSPawel Niedzwiecki 	char *ctrlr;
257ff88449dSPawel Niedzwiecki 	char *dev_name;
258ff88449dSPawel Niedzwiecki 	char *cpumask;
259b727e804STomasz Zawadzki 	char *transport;
260ff88449dSPawel Niedzwiecki };
261ff88449dSPawel Niedzwiecki 
262ff88449dSPawel Niedzwiecki static const struct spdk_json_object_decoder rpc_construct_vhost_blk_ctrlr[] = {
263ff88449dSPawel Niedzwiecki 	{"ctrlr", offsetof(struct rpc_vhost_blk_ctrlr, ctrlr), spdk_json_decode_string },
264ff88449dSPawel Niedzwiecki 	{"dev_name", offsetof(struct rpc_vhost_blk_ctrlr, dev_name), spdk_json_decode_string },
265ff88449dSPawel Niedzwiecki 	{"cpumask", offsetof(struct rpc_vhost_blk_ctrlr, cpumask), spdk_json_decode_string, true},
266b727e804STomasz Zawadzki 	{"transport", offsetof(struct rpc_vhost_blk_ctrlr, transport), spdk_json_decode_string, true},
267ff88449dSPawel Niedzwiecki };
268ff88449dSPawel Niedzwiecki 
269ff88449dSPawel Niedzwiecki static void
270ff88449dSPawel Niedzwiecki free_rpc_vhost_blk_ctrlr(struct rpc_vhost_blk_ctrlr *req)
271ff88449dSPawel Niedzwiecki {
272ff88449dSPawel Niedzwiecki 	free(req->ctrlr);
273ff88449dSPawel Niedzwiecki 	free(req->dev_name);
274ff88449dSPawel Niedzwiecki 	free(req->cpumask);
275b727e804STomasz Zawadzki 	free(req->transport);
276ff88449dSPawel Niedzwiecki }
277ff88449dSPawel Niedzwiecki 
278ff88449dSPawel Niedzwiecki static void
279dbaa2c79SSeth Howell rpc_vhost_create_blk_controller(struct spdk_jsonrpc_request *request,
2802bdec64fSDaniel Verkamp 				const struct spdk_json_val *params)
281ff88449dSPawel Niedzwiecki {
282ff88449dSPawel Niedzwiecki 	struct rpc_vhost_blk_ctrlr req = {0};
283ff88449dSPawel Niedzwiecki 	int rc;
284ff88449dSPawel Niedzwiecki 
285fd53562aSsberbz 	if (spdk_json_decode_object_relaxed(params, rpc_construct_vhost_blk_ctrlr,
286ff88449dSPawel Niedzwiecki 					    SPDK_COUNTOF(rpc_construct_vhost_blk_ctrlr),
287ff88449dSPawel Niedzwiecki 					    &req)) {
2882172c432STomasz Zawadzki 		SPDK_DEBUGLOG(vhost_rpc, "spdk_json_decode_object failed\n");
289ff88449dSPawel Niedzwiecki 		rc = -EINVAL;
290ff88449dSPawel Niedzwiecki 		goto invalid;
291ff88449dSPawel Niedzwiecki 	}
292ff88449dSPawel Niedzwiecki 
293b727e804STomasz Zawadzki 	rc = spdk_vhost_blk_construct(req.ctrlr, req.cpumask, req.dev_name, req.transport, params);
294ff88449dSPawel Niedzwiecki 	if (rc < 0) {
295ff88449dSPawel Niedzwiecki 		goto invalid;
296ff88449dSPawel Niedzwiecki 	}
297ff88449dSPawel Niedzwiecki 
298ff88449dSPawel Niedzwiecki 	free_rpc_vhost_blk_ctrlr(&req);
299ff88449dSPawel Niedzwiecki 
300d73077b8Syidong0635 	spdk_jsonrpc_send_bool_response(request, true);
301ff88449dSPawel Niedzwiecki 	return;
3022bdec64fSDaniel Verkamp 
303ff88449dSPawel Niedzwiecki invalid:
304ff88449dSPawel Niedzwiecki 	free_rpc_vhost_blk_ctrlr(&req);
305891c12a6SPawel Wodkowski 	spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_INVALID_PARAMS,
306891c12a6SPawel Wodkowski 					 spdk_strerror(-rc));
307ff88449dSPawel Niedzwiecki 
308ff88449dSPawel Niedzwiecki }
309dbaa2c79SSeth Howell SPDK_RPC_REGISTER("vhost_create_blk_controller", rpc_vhost_create_blk_controller,
310e008db08SShuhei Matsumoto 		  SPDK_RPC_RUNTIME)
311ff88449dSPawel Niedzwiecki 
312edb18971SPawel Kaminski struct rpc_delete_vhost_ctrlr {
313ff88449dSPawel Niedzwiecki 	char *ctrlr;
314ff88449dSPawel Niedzwiecki };
315ff88449dSPawel Niedzwiecki 
316edb18971SPawel Kaminski static const struct spdk_json_object_decoder rpc_delete_vhost_ctrlr_decoder[] = {
317edb18971SPawel Kaminski 	{"ctrlr", offsetof(struct rpc_delete_vhost_ctrlr, ctrlr), spdk_json_decode_string },
318ff88449dSPawel Niedzwiecki };
319ff88449dSPawel Niedzwiecki 
320ff88449dSPawel Niedzwiecki static void
321edb18971SPawel Kaminski free_rpc_delete_vhost_ctrlr(struct rpc_delete_vhost_ctrlr *req)
322ff88449dSPawel Niedzwiecki {
323ff88449dSPawel Niedzwiecki 	free(req->ctrlr);
324ff88449dSPawel Niedzwiecki }
325ff88449dSPawel Niedzwiecki 
326*840a5d2eSxupeng-mingtu struct vhost_delete_ctrlr_context {
327*840a5d2eSxupeng-mingtu 	struct spdk_jsonrpc_request *request;
328*840a5d2eSxupeng-mingtu 	const struct spdk_json_val *params;
329*840a5d2eSxupeng-mingtu };
330*840a5d2eSxupeng-mingtu 
331*840a5d2eSxupeng-mingtu static void _rpc_vhost_delete_controller(void *arg);
332*840a5d2eSxupeng-mingtu 
333bb252345SDariusz Stojaczyk static void
334dbaa2c79SSeth Howell rpc_vhost_delete_controller(struct spdk_jsonrpc_request *request,
335bb252345SDariusz Stojaczyk 			    const struct spdk_json_val *params)
336bb252345SDariusz Stojaczyk {
337edb18971SPawel Kaminski 	struct rpc_delete_vhost_ctrlr req = {0};
338dd4f161bSDarek Stojaczyk 	struct spdk_vhost_dev *vdev;
339bb252345SDariusz Stojaczyk 	int rc;
340bb252345SDariusz Stojaczyk 
341edb18971SPawel Kaminski 	if (spdk_json_decode_object(params, rpc_delete_vhost_ctrlr_decoder,
342edb18971SPawel Kaminski 				    SPDK_COUNTOF(rpc_delete_vhost_ctrlr_decoder), &req)) {
3432172c432STomasz Zawadzki 		SPDK_DEBUGLOG(vhost_rpc, "spdk_json_decode_object failed\n");
344bb252345SDariusz Stojaczyk 		rc = -EINVAL;
345bb252345SDariusz Stojaczyk 		goto invalid;
346bb252345SDariusz Stojaczyk 	}
347bb252345SDariusz Stojaczyk 
348dd4f161bSDarek Stojaczyk 	spdk_vhost_lock();
349244a619fSDarek Stojaczyk 	vdev = spdk_vhost_dev_find(req.ctrlr);
350dd4f161bSDarek Stojaczyk 	if (vdev == NULL) {
351dd4f161bSDarek Stojaczyk 		spdk_vhost_unlock();
352dd4f161bSDarek Stojaczyk 		rc = -ENODEV;
353dd4f161bSDarek Stojaczyk 		goto invalid;
354dd4f161bSDarek Stojaczyk 	}
355376c25edSChangpeng Liu 	spdk_vhost_unlock();
356dd4f161bSDarek Stojaczyk 
357dd4f161bSDarek Stojaczyk 	rc = spdk_vhost_dev_remove(vdev);
358dd4f161bSDarek Stojaczyk 	if (rc < 0) {
359*840a5d2eSxupeng-mingtu 		if (rc == -EBUSY) {
360*840a5d2eSxupeng-mingtu 			struct vhost_delete_ctrlr_context *ctx;
361*840a5d2eSxupeng-mingtu 
362*840a5d2eSxupeng-mingtu 			ctx = calloc(1, sizeof(*ctx));
363*840a5d2eSxupeng-mingtu 			if (ctx == NULL) {
364*840a5d2eSxupeng-mingtu 				SPDK_ERRLOG("Failed to allocate memory for vhost_delete_ctrlr context\n");
365*840a5d2eSxupeng-mingtu 				rc = -ENOMEM;
366*840a5d2eSxupeng-mingtu 				goto invalid;
367*840a5d2eSxupeng-mingtu 			}
368*840a5d2eSxupeng-mingtu 			ctx->request = request;
369*840a5d2eSxupeng-mingtu 			ctx->params = params;
370*840a5d2eSxupeng-mingtu 			spdk_thread_send_msg(spdk_get_thread(), _rpc_vhost_delete_controller, ctx);
371*840a5d2eSxupeng-mingtu 			free_rpc_delete_vhost_ctrlr(&req);
372*840a5d2eSxupeng-mingtu 			return;
373*840a5d2eSxupeng-mingtu 		}
374dd4f161bSDarek Stojaczyk 		goto invalid;
375dd4f161bSDarek Stojaczyk 	}
376dd4f161bSDarek Stojaczyk 
377edb18971SPawel Kaminski 	free_rpc_delete_vhost_ctrlr(&req);
378dd4f161bSDarek Stojaczyk 
379d73077b8Syidong0635 	spdk_jsonrpc_send_bool_response(request, true);
380ff88449dSPawel Niedzwiecki 	return;
3812bdec64fSDaniel Verkamp 
382ff88449dSPawel Niedzwiecki invalid:
383edb18971SPawel Kaminski 	free_rpc_delete_vhost_ctrlr(&req);
384891c12a6SPawel Wodkowski 	spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_INVALID_PARAMS,
385891c12a6SPawel Wodkowski 					 spdk_strerror(-rc));
386ff88449dSPawel Niedzwiecki 
387ff88449dSPawel Niedzwiecki }
388dbaa2c79SSeth Howell SPDK_RPC_REGISTER("vhost_delete_controller", rpc_vhost_delete_controller, SPDK_RPC_RUNTIME)
389ff88449dSPawel Niedzwiecki 
390*840a5d2eSxupeng-mingtu static void _rpc_vhost_delete_controller(void *arg)
391*840a5d2eSxupeng-mingtu {
392*840a5d2eSxupeng-mingtu 	struct vhost_delete_ctrlr_context *ctx = arg;
393*840a5d2eSxupeng-mingtu 
394*840a5d2eSxupeng-mingtu 	rpc_vhost_delete_controller(ctx->request, ctx->params);
395*840a5d2eSxupeng-mingtu 	free(ctx);
396*840a5d2eSxupeng-mingtu }
397*840a5d2eSxupeng-mingtu 
3988323be7dSDariusz Stojaczyk struct rpc_get_vhost_ctrlrs {
39974a28c19Swuzhouhui 	char *name;
4008323be7dSDariusz Stojaczyk };
4018323be7dSDariusz Stojaczyk 
40274a28c19Swuzhouhui static void
403dbaa2c79SSeth Howell _rpc_get_vhost_controller(struct spdk_json_write_ctx *w, struct spdk_vhost_dev *vdev)
40474a28c19Swuzhouhui {
40574a28c19Swuzhouhui 	uint32_t delay_base_us, iops_threshold;
40674a28c19Swuzhouhui 
40774a28c19Swuzhouhui 	spdk_vhost_get_coalescing(vdev, &delay_base_us, &iops_threshold);
40874a28c19Swuzhouhui 
40974a28c19Swuzhouhui 	spdk_json_write_object_begin(w);
41074a28c19Swuzhouhui 
41174a28c19Swuzhouhui 	spdk_json_write_named_string(w, "ctrlr", spdk_vhost_dev_get_name(vdev));
412baf3e12cSShuhei Matsumoto 	spdk_json_write_named_string_fmt(w, "cpumask", "0x%s",
413baf3e12cSShuhei Matsumoto 					 spdk_cpuset_fmt(spdk_thread_get_cpumask(vdev->thread)));
41474a28c19Swuzhouhui 	spdk_json_write_named_uint32(w, "delay_base_us", delay_base_us);
41574a28c19Swuzhouhui 	spdk_json_write_named_uint32(w, "iops_threshold", iops_threshold);
41674a28c19Swuzhouhui 	spdk_json_write_named_string(w, "socket", vdev->path);
417216991edSzhipeng Lu 	spdk_json_write_named_array_begin(w, "sessions");
418216991edSzhipeng Lu 	vhost_session_info_json(vdev, w);
419216991edSzhipeng Lu 	spdk_json_write_array_end(w);
42074a28c19Swuzhouhui 
42174a28c19Swuzhouhui 	spdk_json_write_named_object_begin(w, "backend_specific");
4220cf5d516SDarek Stojaczyk 	vhost_dump_info_json(vdev, w);
42374a28c19Swuzhouhui 	spdk_json_write_object_end(w);
42474a28c19Swuzhouhui 
42574a28c19Swuzhouhui 	spdk_json_write_object_end(w);
42674a28c19Swuzhouhui }
42774a28c19Swuzhouhui 
42874a28c19Swuzhouhui static const struct spdk_json_object_decoder rpc_get_vhost_ctrlrs_decoders[] = {
42974a28c19Swuzhouhui 	{"name", offsetof(struct rpc_get_vhost_ctrlrs, name), spdk_json_decode_string, true},
43074a28c19Swuzhouhui };
4318323be7dSDariusz Stojaczyk 
432ff88449dSPawel Niedzwiecki static void
433dd4f161bSDarek Stojaczyk free_rpc_get_vhost_ctrlrs(struct rpc_get_vhost_ctrlrs *req)
434dd4f161bSDarek Stojaczyk {
435dd4f161bSDarek Stojaczyk 	free(req->name);
436dd4f161bSDarek Stojaczyk }
437dd4f161bSDarek Stojaczyk 
438dd4f161bSDarek Stojaczyk static void
439dbaa2c79SSeth Howell rpc_vhost_get_controllers(struct spdk_jsonrpc_request *request,
4402bdec64fSDaniel Verkamp 			  const struct spdk_json_val *params)
441ff88449dSPawel Niedzwiecki {
442244a619fSDarek Stojaczyk 	struct rpc_get_vhost_ctrlrs req = {0};
443ff88449dSPawel Niedzwiecki 	struct spdk_json_write_ctx *w;
444dd4f161bSDarek Stojaczyk 	struct spdk_vhost_dev *vdev;
445dd4f161bSDarek Stojaczyk 	int rc;
446ff88449dSPawel Niedzwiecki 
44774a28c19Swuzhouhui 	if (params && spdk_json_decode_object(params, rpc_get_vhost_ctrlrs_decoders,
448244a619fSDarek Stojaczyk 					      SPDK_COUNTOF(rpc_get_vhost_ctrlrs_decoders), &req)) {
44974a28c19Swuzhouhui 		SPDK_ERRLOG("spdk_json_decode_object failed\n");
450dd4f161bSDarek Stojaczyk 		rc = -EINVAL;
451dd4f161bSDarek Stojaczyk 		goto invalid;
45274a28c19Swuzhouhui 	}
45374a28c19Swuzhouhui 
454dd4f161bSDarek Stojaczyk 	spdk_vhost_lock();
455244a619fSDarek Stojaczyk 	if (req.name != NULL) {
456244a619fSDarek Stojaczyk 		vdev = spdk_vhost_dev_find(req.name);
457dd4f161bSDarek Stojaczyk 		if (vdev == NULL) {
458dd4f161bSDarek Stojaczyk 			spdk_vhost_unlock();
459dd4f161bSDarek Stojaczyk 			rc = -ENODEV;
460dd4f161bSDarek Stojaczyk 			goto invalid;
46174a28c19Swuzhouhui 		}
46274a28c19Swuzhouhui 
463244a619fSDarek Stojaczyk 		free_rpc_get_vhost_ctrlrs(&req);
464dd4f161bSDarek Stojaczyk 
46533aa9948Swuzhouhui 		w = spdk_jsonrpc_begin_result(request);
46633aa9948Swuzhouhui 		spdk_json_write_array_begin(w);
46733aa9948Swuzhouhui 
468dbaa2c79SSeth Howell 		_rpc_get_vhost_controller(w, vdev);
469dd4f161bSDarek Stojaczyk 		spdk_vhost_unlock();
470dd4f161bSDarek Stojaczyk 
471dd4f161bSDarek Stojaczyk 		spdk_json_write_array_end(w);
472dd4f161bSDarek Stojaczyk 		spdk_jsonrpc_end_result(request, w);
473dd4f161bSDarek Stojaczyk 		return;
474dd4f161bSDarek Stojaczyk 	}
475dd4f161bSDarek Stojaczyk 
476244a619fSDarek Stojaczyk 	free_rpc_get_vhost_ctrlrs(&req);
477dd4f161bSDarek Stojaczyk 
478dd4f161bSDarek Stojaczyk 	w = spdk_jsonrpc_begin_result(request);
479dd4f161bSDarek Stojaczyk 	spdk_json_write_array_begin(w);
480dd4f161bSDarek Stojaczyk 
481dd4f161bSDarek Stojaczyk 	vdev = spdk_vhost_dev_next(NULL);
482dd4f161bSDarek Stojaczyk 	while (vdev != NULL) {
483dbaa2c79SSeth Howell 		_rpc_get_vhost_controller(w, vdev);
484dd4f161bSDarek Stojaczyk 		vdev = spdk_vhost_dev_next(vdev);
485dd4f161bSDarek Stojaczyk 	}
486dd4f161bSDarek Stojaczyk 	spdk_vhost_unlock();
487dd4f161bSDarek Stojaczyk 
488dd4f161bSDarek Stojaczyk 	spdk_json_write_array_end(w);
489dd4f161bSDarek Stojaczyk 	spdk_jsonrpc_end_result(request, w);
490dd4f161bSDarek Stojaczyk 	return;
491dd4f161bSDarek Stojaczyk 
492dd4f161bSDarek Stojaczyk invalid:
493244a619fSDarek Stojaczyk 	free_rpc_get_vhost_ctrlrs(&req);
494dd4f161bSDarek Stojaczyk 	spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_INTERNAL_ERROR,
495dd4f161bSDarek Stojaczyk 					 spdk_strerror(-rc));
496ff88449dSPawel Niedzwiecki }
497dbaa2c79SSeth Howell SPDK_RPC_REGISTER("vhost_get_controllers", rpc_vhost_get_controllers, SPDK_RPC_RUNTIME)
498932a186bSDaniel Verkamp 
499ff1863f4SPawel Wodkowski 
500ff1863f4SPawel Wodkowski struct rpc_vhost_ctrlr_coalescing {
501ff1863f4SPawel Wodkowski 	char *ctrlr;
502ff1863f4SPawel Wodkowski 	uint32_t delay_base_us;
503ff1863f4SPawel Wodkowski 	uint32_t iops_threshold;
504ff1863f4SPawel Wodkowski };
505ff1863f4SPawel Wodkowski 
506ff1863f4SPawel Wodkowski static const struct spdk_json_object_decoder rpc_set_vhost_ctrlr_coalescing[] = {
507ff1863f4SPawel Wodkowski 	{"ctrlr", offsetof(struct rpc_vhost_ctrlr_coalescing, ctrlr), spdk_json_decode_string },
508ff1863f4SPawel Wodkowski 	{"delay_base_us", offsetof(struct rpc_vhost_ctrlr_coalescing, delay_base_us), spdk_json_decode_uint32},
509ff1863f4SPawel Wodkowski 	{"iops_threshold", offsetof(struct rpc_vhost_ctrlr_coalescing, iops_threshold), spdk_json_decode_uint32},
510ff1863f4SPawel Wodkowski };
511ff1863f4SPawel Wodkowski 
512ff1863f4SPawel Wodkowski static void
513ff1863f4SPawel Wodkowski free_rpc_set_vhost_controllers_event_coalescing(struct rpc_vhost_ctrlr_coalescing *req)
514ff1863f4SPawel Wodkowski {
515ff1863f4SPawel Wodkowski 	free(req->ctrlr);
516ff1863f4SPawel Wodkowski }
517ff1863f4SPawel Wodkowski 
518ff1863f4SPawel Wodkowski static void
519dbaa2c79SSeth Howell rpc_vhost_controller_set_coalescing(struct spdk_jsonrpc_request *request,
520ff1863f4SPawel Wodkowski 				    const struct spdk_json_val *params)
521ff1863f4SPawel Wodkowski {
522244a619fSDarek Stojaczyk 	struct rpc_vhost_ctrlr_coalescing req = {0};
523dd4f161bSDarek Stojaczyk 	struct spdk_vhost_dev *vdev;
524ff1863f4SPawel Wodkowski 	int rc;
525ff1863f4SPawel Wodkowski 
526ff1863f4SPawel Wodkowski 	if (spdk_json_decode_object(params, rpc_set_vhost_ctrlr_coalescing,
527244a619fSDarek Stojaczyk 				    SPDK_COUNTOF(rpc_set_vhost_ctrlr_coalescing), &req)) {
5282172c432STomasz Zawadzki 		SPDK_DEBUGLOG(vhost_rpc, "spdk_json_decode_object failed\n");
529ff1863f4SPawel Wodkowski 		rc = -EINVAL;
530ff1863f4SPawel Wodkowski 		goto invalid;
531ff1863f4SPawel Wodkowski 	}
532ff1863f4SPawel Wodkowski 
533dd4f161bSDarek Stojaczyk 	spdk_vhost_lock();
534244a619fSDarek Stojaczyk 	vdev = spdk_vhost_dev_find(req.ctrlr);
535dd4f161bSDarek Stojaczyk 	if (vdev == NULL) {
536dd4f161bSDarek Stojaczyk 		spdk_vhost_unlock();
537dd4f161bSDarek Stojaczyk 		rc = -ENODEV;
538dd4f161bSDarek Stojaczyk 		goto invalid;
539dd4f161bSDarek Stojaczyk 	}
540dd4f161bSDarek Stojaczyk 
541244a619fSDarek Stojaczyk 	rc = spdk_vhost_set_coalescing(vdev, req.delay_base_us, req.iops_threshold);
542dd4f161bSDarek Stojaczyk 	spdk_vhost_unlock();
543dd4f161bSDarek Stojaczyk 	if (rc) {
544dd4f161bSDarek Stojaczyk 		goto invalid;
545dd4f161bSDarek Stojaczyk 	}
546dd4f161bSDarek Stojaczyk 
547244a619fSDarek Stojaczyk 	free_rpc_set_vhost_controllers_event_coalescing(&req);
548dd4f161bSDarek Stojaczyk 
549d73077b8Syidong0635 	spdk_jsonrpc_send_bool_response(request, true);
550ff1863f4SPawel Wodkowski 	return;
551ff1863f4SPawel Wodkowski 
552ff1863f4SPawel Wodkowski invalid:
553244a619fSDarek Stojaczyk 	free_rpc_set_vhost_controllers_event_coalescing(&req);
554891c12a6SPawel Wodkowski 	spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_INVALID_PARAMS,
555891c12a6SPawel Wodkowski 					 spdk_strerror(-rc));
556ff1863f4SPawel Wodkowski }
557dbaa2c79SSeth Howell SPDK_RPC_REGISTER("vhost_controller_set_coalescing", rpc_vhost_controller_set_coalescing,
558e008db08SShuhei Matsumoto 		  SPDK_RPC_RUNTIME)
559ff1863f4SPawel Wodkowski 
560537929e1SKrystyna Szybalska struct rpc_get_transport {
561537929e1SKrystyna Szybalska 	char *name;
562537929e1SKrystyna Szybalska };
563537929e1SKrystyna Szybalska 
564537929e1SKrystyna Szybalska static const struct spdk_json_object_decoder rpc_get_transport_decoders[] = {
565537929e1SKrystyna Szybalska 	{"name", offsetof(struct rpc_get_transport, name), spdk_json_decode_string, true},
566537929e1SKrystyna Szybalska };
567537929e1SKrystyna Szybalska 
568537929e1SKrystyna Szybalska static void
569537929e1SKrystyna Szybalska rpc_virtio_blk_get_transports(struct spdk_jsonrpc_request *request,
570537929e1SKrystyna Szybalska 			      const struct spdk_json_val *params)
571537929e1SKrystyna Szybalska {
572537929e1SKrystyna Szybalska 	struct rpc_get_transport req = { 0 };
573537929e1SKrystyna Szybalska 	struct spdk_json_write_ctx *w;
574537929e1SKrystyna Szybalska 	struct spdk_virtio_blk_transport *transport = NULL;
575537929e1SKrystyna Szybalska 
576537929e1SKrystyna Szybalska 	if (params) {
577537929e1SKrystyna Szybalska 		if (spdk_json_decode_object(params, rpc_get_transport_decoders,
578537929e1SKrystyna Szybalska 					    SPDK_COUNTOF(rpc_get_transport_decoders),
579537929e1SKrystyna Szybalska 					    &req)) {
580537929e1SKrystyna Szybalska 			SPDK_ERRLOG("spdk_json_decode_object failed\n");
581537929e1SKrystyna Szybalska 			spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_INVALID_PARAMS, "Invalid parameters");
582537929e1SKrystyna Szybalska 			return;
583537929e1SKrystyna Szybalska 		}
584537929e1SKrystyna Szybalska 	}
585537929e1SKrystyna Szybalska 
586537929e1SKrystyna Szybalska 	if (req.name) {
587537929e1SKrystyna Szybalska 		transport = virtio_blk_tgt_get_transport(req.name);
588537929e1SKrystyna Szybalska 		if (transport == NULL) {
589537929e1SKrystyna Szybalska 			SPDK_ERRLOG("transport '%s' does not exist\n", req.name);
590537929e1SKrystyna Szybalska 			spdk_jsonrpc_send_error_response(request, -ENODEV, spdk_strerror(ENODEV));
591537929e1SKrystyna Szybalska 			free(req.name);
592537929e1SKrystyna Szybalska 			return;
593537929e1SKrystyna Szybalska 		}
594537929e1SKrystyna Szybalska 	}
595537929e1SKrystyna Szybalska 
596537929e1SKrystyna Szybalska 	w = spdk_jsonrpc_begin_result(request);
597537929e1SKrystyna Szybalska 	spdk_json_write_array_begin(w);
598537929e1SKrystyna Szybalska 
599537929e1SKrystyna Szybalska 	if (transport) {
600537929e1SKrystyna Szybalska 		virtio_blk_transport_dump_opts(transport, w);
601537929e1SKrystyna Szybalska 	} else {
602537929e1SKrystyna Szybalska 		for (transport = virtio_blk_transport_get_first(); transport != NULL;
603537929e1SKrystyna Szybalska 		     transport = virtio_blk_transport_get_next(transport)) {
604537929e1SKrystyna Szybalska 			virtio_blk_transport_dump_opts(transport, w);
605537929e1SKrystyna Szybalska 		}
606537929e1SKrystyna Szybalska 	}
607537929e1SKrystyna Szybalska 
608537929e1SKrystyna Szybalska 	spdk_json_write_array_end(w);
609537929e1SKrystyna Szybalska 	spdk_jsonrpc_end_result(request, w);
610537929e1SKrystyna Szybalska 	free(req.name);
611537929e1SKrystyna Szybalska }
612537929e1SKrystyna Szybalska SPDK_RPC_REGISTER("virtio_blk_get_transports", rpc_virtio_blk_get_transports, SPDK_RPC_RUNTIME)
613537929e1SKrystyna Szybalska 
614b727e804STomasz Zawadzki struct rpc_virtio_blk_create_transport {
615b727e804STomasz Zawadzki 	char *name;
616b727e804STomasz Zawadzki };
617b727e804STomasz Zawadzki 
618b727e804STomasz Zawadzki static const struct spdk_json_object_decoder rpc_create_virtio_blk_transport[] = {
619b727e804STomasz Zawadzki 	{"name", offsetof(struct rpc_virtio_blk_create_transport, name), spdk_json_decode_string},
620b727e804STomasz Zawadzki };
621b727e804STomasz Zawadzki 
622b727e804STomasz Zawadzki static void
623b727e804STomasz Zawadzki free_rpc_virtio_blk_create_transport(struct rpc_virtio_blk_create_transport *req)
624b727e804STomasz Zawadzki {
625b727e804STomasz Zawadzki 	free(req->name);
626b727e804STomasz Zawadzki }
627b727e804STomasz Zawadzki 
628b727e804STomasz Zawadzki static void
629b727e804STomasz Zawadzki rpc_virtio_blk_create_transport(struct spdk_jsonrpc_request *request,
630b727e804STomasz Zawadzki 				const struct spdk_json_val *params)
631b727e804STomasz Zawadzki {
632b727e804STomasz Zawadzki 	struct rpc_virtio_blk_create_transport req = {0};
633b727e804STomasz Zawadzki 	int rc;
634b727e804STomasz Zawadzki 
635b727e804STomasz Zawadzki 	if (spdk_json_decode_object_relaxed(params, rpc_create_virtio_blk_transport,
636b727e804STomasz Zawadzki 					    SPDK_COUNTOF(rpc_create_virtio_blk_transport), &req)) {
637b727e804STomasz Zawadzki 		SPDK_DEBUGLOG(vhost_rpc, "spdk_json_decode_object failed\n");
638b727e804STomasz Zawadzki 		rc = -EINVAL;
639b727e804STomasz Zawadzki 		goto invalid;
640b727e804STomasz Zawadzki 	}
641b727e804STomasz Zawadzki 
642b727e804STomasz Zawadzki 	spdk_vhost_lock();
643b727e804STomasz Zawadzki 	rc = virtio_blk_transport_create(req.name, params);
644b727e804STomasz Zawadzki 	spdk_vhost_unlock();
645b727e804STomasz Zawadzki 	if (rc != 0) {
646b727e804STomasz Zawadzki 		goto invalid;
647b727e804STomasz Zawadzki 	}
648b727e804STomasz Zawadzki 
649b727e804STomasz Zawadzki 	free_rpc_virtio_blk_create_transport(&req);
650b727e804STomasz Zawadzki 	spdk_jsonrpc_send_bool_response(request, true);
651b727e804STomasz Zawadzki 	return;
652b727e804STomasz Zawadzki 
653b727e804STomasz Zawadzki invalid:
654b727e804STomasz Zawadzki 	free_rpc_virtio_blk_create_transport(&req);
655ee3ec3f7SKonrad Sztyber 	spdk_jsonrpc_send_error_response(request, rc, spdk_strerror(-rc));
656b727e804STomasz Zawadzki }
657b727e804STomasz Zawadzki SPDK_RPC_REGISTER("virtio_blk_create_transport", rpc_virtio_blk_create_transport,
658b727e804STomasz Zawadzki 		  SPDK_RPC_RUNTIME)
659b727e804STomasz Zawadzki 
6602172c432STomasz Zawadzki SPDK_LOG_REGISTER_COMPONENT(vhost_rpc)
661