4 * Copyright (c) Intel Corporation.
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
11 * * Redistributions of source code must retain the above copyright
12 * notice, this list of conditions and the following disclaimer.
13 * * Redistributions in binary form must reproduce the above copyright
14 * notice, this list of conditions and the following disclaimer in
15 * the documentation and/or other materials provided with the
17 * * Neither the name of Intel Corporation nor the names of its
18 * contributors may be used to endorse or promote products derived
19 * from this software without specific prior written permission.
21 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
24 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
25 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
26 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
27 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
28 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
29 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
30 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
31 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
35 #include "spdk/bdev.h"
36 #include "spdk/util.h"
37 #include "vbdev_lvol.h"
38 #include "spdk/string.h"
39 #include "spdk_internal/log.h"
41 SPDK_LOG_REGISTER_COMPONENT("lvolrpc", SPDK_LOG_LVOL_RPC
)
43 struct rpc_construct_lvol_store
{
50 vbdev_get_lvol_store_by_uuid_xor_name(const char *uuid
, const char *lvs_name
,
51 struct spdk_lvol_store
**lvs
)
53 if ((uuid
== NULL
&& lvs_name
== NULL
)) {
54 SPDK_INFOLOG(SPDK_LOG_LVOL_RPC
, "lvs UUID nor lvs name specified\n");
56 } else if ((uuid
&& lvs_name
)) {
57 SPDK_INFOLOG(SPDK_LOG_LVOL_RPC
, "both lvs UUID '%s' and lvs name '%s' specified\n", uuid
,
61 *lvs
= vbdev_get_lvol_store_by_uuid(uuid
);
64 SPDK_INFOLOG(SPDK_LOG_LVOL_RPC
, "blobstore with UUID '%s' not found\n", uuid
);
67 } else if (lvs_name
) {
69 *lvs
= vbdev_get_lvol_store_by_name(lvs_name
);
72 SPDK_INFOLOG(SPDK_LOG_LVOL_RPC
, "blobstore with name '%s' not found\n", lvs_name
);
80 free_rpc_construct_lvol_store(struct rpc_construct_lvol_store
*req
)
86 static const struct spdk_json_object_decoder rpc_construct_lvol_store_decoders
[] = {
87 {"bdev_name", offsetof(struct rpc_construct_lvol_store
, bdev_name
), spdk_json_decode_string
},
88 {"cluster_sz", offsetof(struct rpc_construct_lvol_store
, cluster_sz
), spdk_json_decode_uint32
, true},
89 {"lvs_name", offsetof(struct rpc_construct_lvol_store
, lvs_name
), spdk_json_decode_string
},
93 _spdk_rpc_lvol_store_construct_cb(void *cb_arg
, struct spdk_lvol_store
*lvol_store
, int lvserrno
)
95 struct spdk_json_write_ctx
*w
;
96 char lvol_store_uuid
[SPDK_UUID_STRING_LEN
];
97 struct spdk_jsonrpc_request
*request
= cb_arg
;
103 spdk_uuid_fmt_lower(lvol_store_uuid
, sizeof(lvol_store_uuid
), &lvol_store
->uuid
);
105 w
= spdk_jsonrpc_begin_result(request
);
110 spdk_json_write_string(w
, lvol_store_uuid
);
111 spdk_jsonrpc_end_result(request
, w
);
115 spdk_jsonrpc_send_error_response(request
, SPDK_JSONRPC_ERROR_INVALID_PARAMS
,
116 spdk_strerror(-lvserrno
));
120 spdk_rpc_construct_lvol_store(struct spdk_jsonrpc_request
*request
,
121 const struct spdk_json_val
*params
)
123 struct rpc_construct_lvol_store req
= {};
124 struct spdk_bdev
*bdev
;
127 if (spdk_json_decode_object(params
, rpc_construct_lvol_store_decoders
,
128 SPDK_COUNTOF(rpc_construct_lvol_store_decoders
),
130 SPDK_INFOLOG(SPDK_LOG_LVOL_RPC
, "spdk_json_decode_object failed\n");
135 if (req
.bdev_name
== NULL
) {
136 SPDK_ERRLOG("missing bdev_name param\n");
141 if (req
.lvs_name
== NULL
) {
142 SPDK_ERRLOG("missing lvs_name param\n");
146 bdev
= spdk_bdev_get_by_name(req
.bdev_name
);
148 SPDK_ERRLOG("bdev '%s' does not exist\n", req
.bdev_name
);
153 rc
= vbdev_lvs_create(bdev
, req
.lvs_name
, req
.cluster_sz
, _spdk_rpc_lvol_store_construct_cb
,
158 free_rpc_construct_lvol_store(&req
);
163 spdk_jsonrpc_send_error_response(request
, SPDK_JSONRPC_ERROR_INVALID_PARAMS
,
165 free_rpc_construct_lvol_store(&req
);
167 SPDK_RPC_REGISTER("construct_lvol_store", spdk_rpc_construct_lvol_store
, SPDK_RPC_RUNTIME
)
169 struct rpc_rename_lvol_store
{
175 free_rpc_rename_lvol_store(struct rpc_rename_lvol_store
*req
)
181 static const struct spdk_json_object_decoder rpc_rename_lvol_store_decoders
[] = {
182 {"old_name", offsetof(struct rpc_rename_lvol_store
, old_name
), spdk_json_decode_string
},
183 {"new_name", offsetof(struct rpc_rename_lvol_store
, new_name
), spdk_json_decode_string
},
187 _spdk_rpc_rename_lvol_store_cb(void *cb_arg
, int lvserrno
)
189 struct spdk_json_write_ctx
*w
;
190 struct spdk_jsonrpc_request
*request
= cb_arg
;
196 w
= spdk_jsonrpc_begin_result(request
);
201 spdk_json_write_bool(w
, true);
202 spdk_jsonrpc_end_result(request
, w
);
206 spdk_jsonrpc_send_error_response(request
, SPDK_JSONRPC_ERROR_INVALID_PARAMS
,
207 spdk_strerror(-lvserrno
));
211 spdk_rpc_rename_lvol_store(struct spdk_jsonrpc_request
*request
,
212 const struct spdk_json_val
*params
)
214 struct rpc_rename_lvol_store req
= {};
215 struct spdk_lvol_store
*lvs
;
218 if (spdk_json_decode_object(params
, rpc_rename_lvol_store_decoders
,
219 SPDK_COUNTOF(rpc_rename_lvol_store_decoders
),
221 SPDK_INFOLOG(SPDK_LOG_LVOL_RPC
, "spdk_json_decode_object failed\n");
226 lvs
= vbdev_get_lvol_store_by_name(req
.old_name
);
228 SPDK_INFOLOG(SPDK_LOG_LVOL_RPC
, "no lvs existing for given name\n");
233 vbdev_lvs_rename(lvs
, req
.new_name
, _spdk_rpc_rename_lvol_store_cb
, request
);
235 free_rpc_rename_lvol_store(&req
);
240 spdk_jsonrpc_send_error_response(request
, SPDK_JSONRPC_ERROR_INVALID_PARAMS
, spdk_strerror(-rc
));
241 free_rpc_rename_lvol_store(&req
);
243 SPDK_RPC_REGISTER("rename_lvol_store", spdk_rpc_rename_lvol_store
, SPDK_RPC_RUNTIME
)
245 struct rpc_destroy_lvol_store
{
251 free_rpc_destroy_lvol_store(struct rpc_destroy_lvol_store
*req
)
257 static const struct spdk_json_object_decoder rpc_destroy_lvol_store_decoders
[] = {
258 {"uuid", offsetof(struct rpc_destroy_lvol_store
, uuid
), spdk_json_decode_string
, true},
259 {"lvs_name", offsetof(struct rpc_destroy_lvol_store
, lvs_name
), spdk_json_decode_string
, true},
263 _spdk_rpc_lvol_store_destroy_cb(void *cb_arg
, int lvserrno
)
265 struct spdk_json_write_ctx
*w
;
266 struct spdk_jsonrpc_request
*request
= cb_arg
;
272 w
= spdk_jsonrpc_begin_result(request
);
277 spdk_json_write_bool(w
, true);
278 spdk_jsonrpc_end_result(request
, w
);
282 spdk_jsonrpc_send_error_response(request
, SPDK_JSONRPC_ERROR_INVALID_PARAMS
,
283 spdk_strerror(-lvserrno
));
287 spdk_rpc_destroy_lvol_store(struct spdk_jsonrpc_request
*request
,
288 const struct spdk_json_val
*params
)
290 struct rpc_destroy_lvol_store req
= {};
291 struct spdk_lvol_store
*lvs
= NULL
;
294 if (spdk_json_decode_object(params
, rpc_destroy_lvol_store_decoders
,
295 SPDK_COUNTOF(rpc_destroy_lvol_store_decoders
),
297 SPDK_INFOLOG(SPDK_LOG_LVOL_RPC
, "spdk_json_decode_object failed\n");
302 rc
= vbdev_get_lvol_store_by_uuid_xor_name(req
.uuid
, req
.lvs_name
, &lvs
);
307 vbdev_lvs_destruct(lvs
, _spdk_rpc_lvol_store_destroy_cb
, request
);
309 free_rpc_destroy_lvol_store(&req
);
314 spdk_jsonrpc_send_error_response(request
, SPDK_JSONRPC_ERROR_INVALID_PARAMS
,
316 free_rpc_destroy_lvol_store(&req
);
318 SPDK_RPC_REGISTER("destroy_lvol_store", spdk_rpc_destroy_lvol_store
, SPDK_RPC_RUNTIME
)
320 struct rpc_construct_lvol_bdev
{
329 free_rpc_construct_lvol_bdev(struct rpc_construct_lvol_bdev
*req
)
333 free(req
->lvol_name
);
336 static const struct spdk_json_object_decoder rpc_construct_lvol_bdev_decoders
[] = {
337 {"uuid", offsetof(struct rpc_construct_lvol_bdev
, uuid
), spdk_json_decode_string
, true},
338 {"lvs_name", offsetof(struct rpc_construct_lvol_bdev
, lvs_name
), spdk_json_decode_string
, true},
339 {"lvol_name", offsetof(struct rpc_construct_lvol_bdev
, lvol_name
), spdk_json_decode_string
, true},
340 {"size", offsetof(struct rpc_construct_lvol_bdev
, size
), spdk_json_decode_uint64
},
341 {"thin_provision", offsetof(struct rpc_construct_lvol_bdev
, thin_provision
), spdk_json_decode_bool
, true},
345 _spdk_rpc_construct_lvol_bdev_cb(void *cb_arg
, struct spdk_lvol
*lvol
, int lvolerrno
)
347 struct spdk_json_write_ctx
*w
;
348 struct spdk_jsonrpc_request
*request
= cb_arg
;
350 if (lvolerrno
!= 0) {
354 w
= spdk_jsonrpc_begin_result(request
);
359 spdk_json_write_string(w
, lvol
->unique_id
);
360 spdk_jsonrpc_end_result(request
, w
);
364 spdk_jsonrpc_send_error_response(request
, SPDK_JSONRPC_ERROR_INVALID_PARAMS
,
365 spdk_strerror(-lvolerrno
));
369 spdk_rpc_construct_lvol_bdev(struct spdk_jsonrpc_request
*request
,
370 const struct spdk_json_val
*params
)
372 struct rpc_construct_lvol_bdev req
= {};
374 struct spdk_lvol_store
*lvs
= NULL
;
376 SPDK_INFOLOG(SPDK_LOG_LVOL_RPC
, "Creating blob\n");
378 if (spdk_json_decode_object(params
, rpc_construct_lvol_bdev_decoders
,
379 SPDK_COUNTOF(rpc_construct_lvol_bdev_decoders
),
381 SPDK_INFOLOG(SPDK_LOG_LVOL_RPC
, "spdk_json_decode_object failed\n");
386 rc
= vbdev_get_lvol_store_by_uuid_xor_name(req
.uuid
, req
.lvs_name
, &lvs
);
391 if (req
.lvol_name
== NULL
) {
392 SPDK_INFOLOG(SPDK_LOG_LVOL_RPC
, "no bdev name\n");
397 rc
= vbdev_lvol_create(lvs
, req
.lvol_name
, req
.size
, req
.thin_provision
,
398 _spdk_rpc_construct_lvol_bdev_cb
, request
);
403 free_rpc_construct_lvol_bdev(&req
);
407 spdk_jsonrpc_send_error_response(request
, SPDK_JSONRPC_ERROR_INVALID_PARAMS
,
409 free_rpc_construct_lvol_bdev(&req
);
412 SPDK_RPC_REGISTER("construct_lvol_bdev", spdk_rpc_construct_lvol_bdev
, SPDK_RPC_RUNTIME
)
414 struct rpc_snapshot_lvol_bdev
{
420 free_rpc_snapshot_lvol_bdev(struct rpc_snapshot_lvol_bdev
*req
)
422 free(req
->lvol_name
);
423 free(req
->snapshot_name
);
426 static const struct spdk_json_object_decoder rpc_snapshot_lvol_bdev_decoders
[] = {
427 {"lvol_name", offsetof(struct rpc_snapshot_lvol_bdev
, lvol_name
), spdk_json_decode_string
},
428 {"snapshot_name", offsetof(struct rpc_snapshot_lvol_bdev
, snapshot_name
), spdk_json_decode_string
},
432 _spdk_rpc_snapshot_lvol_bdev_cb(void *cb_arg
, struct spdk_lvol
*lvol
, int lvolerrno
)
434 struct spdk_json_write_ctx
*w
;
435 struct spdk_jsonrpc_request
*request
= cb_arg
;
437 if (lvolerrno
!= 0) {
441 w
= spdk_jsonrpc_begin_result(request
);
446 spdk_json_write_string(w
, lvol
->unique_id
);
447 spdk_jsonrpc_end_result(request
, w
);
451 spdk_jsonrpc_send_error_response(request
, SPDK_JSONRPC_ERROR_INVALID_PARAMS
,
452 spdk_strerror(-lvolerrno
));
456 spdk_rpc_snapshot_lvol_bdev(struct spdk_jsonrpc_request
*request
,
457 const struct spdk_json_val
*params
)
459 struct rpc_snapshot_lvol_bdev req
= {};
460 struct spdk_bdev
*bdev
;
461 struct spdk_lvol
*lvol
;
464 SPDK_INFOLOG(SPDK_LOG_LVOL_RPC
, "Snapshotting blob\n");
466 if (spdk_json_decode_object(params
, rpc_snapshot_lvol_bdev_decoders
,
467 SPDK_COUNTOF(rpc_snapshot_lvol_bdev_decoders
),
469 SPDK_INFOLOG(SPDK_LOG_LVOL_RPC
, "spdk_json_decode_object failed\n");
474 bdev
= spdk_bdev_get_by_name(req
.lvol_name
);
476 SPDK_INFOLOG(SPDK_LOG_LVOL_RPC
, "bdev '%s' does not exist\n", req
.lvol_name
);
481 lvol
= vbdev_lvol_get_from_bdev(bdev
);
483 SPDK_ERRLOG("lvol does not exist\n");
488 vbdev_lvol_create_snapshot(lvol
, req
.snapshot_name
, _spdk_rpc_snapshot_lvol_bdev_cb
, request
);
490 free_rpc_snapshot_lvol_bdev(&req
);
494 spdk_jsonrpc_send_error_response(request
, SPDK_JSONRPC_ERROR_INVALID_PARAMS
, spdk_strerror(-rc
));
495 free_rpc_snapshot_lvol_bdev(&req
);
498 SPDK_RPC_REGISTER("snapshot_lvol_bdev", spdk_rpc_snapshot_lvol_bdev
, SPDK_RPC_RUNTIME
)
500 struct rpc_clone_lvol_bdev
{
506 free_rpc_clone_lvol_bdev(struct rpc_clone_lvol_bdev
*req
)
508 free(req
->snapshot_name
);
509 free(req
->clone_name
);
512 static const struct spdk_json_object_decoder rpc_clone_lvol_bdev_decoders
[] = {
513 {"snapshot_name", offsetof(struct rpc_clone_lvol_bdev
, snapshot_name
), spdk_json_decode_string
},
514 {"clone_name", offsetof(struct rpc_clone_lvol_bdev
, clone_name
), spdk_json_decode_string
, true},
518 _spdk_rpc_clone_lvol_bdev_cb(void *cb_arg
, struct spdk_lvol
*lvol
, int lvolerrno
)
520 struct spdk_json_write_ctx
*w
;
521 struct spdk_jsonrpc_request
*request
= cb_arg
;
523 if (lvolerrno
!= 0) {
527 w
= spdk_jsonrpc_begin_result(request
);
532 spdk_json_write_string(w
, lvol
->unique_id
);
533 spdk_jsonrpc_end_result(request
, w
);
537 spdk_jsonrpc_send_error_response(request
, SPDK_JSONRPC_ERROR_INVALID_PARAMS
,
538 spdk_strerror(-lvolerrno
));
542 spdk_rpc_clone_lvol_bdev(struct spdk_jsonrpc_request
*request
,
543 const struct spdk_json_val
*params
)
545 struct rpc_clone_lvol_bdev req
= {};
546 struct spdk_bdev
*bdev
;
547 struct spdk_lvol
*lvol
;
550 SPDK_INFOLOG(SPDK_LOG_LVOL_RPC
, "Cloning blob\n");
552 if (spdk_json_decode_object(params
, rpc_clone_lvol_bdev_decoders
,
553 SPDK_COUNTOF(rpc_clone_lvol_bdev_decoders
),
555 SPDK_INFOLOG(SPDK_LOG_LVOL_RPC
, "spdk_json_decode_object failed\n");
560 bdev
= spdk_bdev_get_by_name(req
.snapshot_name
);
562 SPDK_INFOLOG(SPDK_LOG_LVOL_RPC
, "bdev '%s' does not exist\n", req
.snapshot_name
);
567 lvol
= vbdev_lvol_get_from_bdev(bdev
);
569 SPDK_ERRLOG("lvol does not exist\n");
574 vbdev_lvol_create_clone(lvol
, req
.clone_name
, _spdk_rpc_clone_lvol_bdev_cb
, request
);
576 free_rpc_clone_lvol_bdev(&req
);
580 spdk_jsonrpc_send_error_response(request
, SPDK_JSONRPC_ERROR_INVALID_PARAMS
, spdk_strerror(-rc
));
581 free_rpc_clone_lvol_bdev(&req
);
584 SPDK_RPC_REGISTER("clone_lvol_bdev", spdk_rpc_clone_lvol_bdev
, SPDK_RPC_RUNTIME
)
586 struct rpc_rename_lvol_bdev
{
592 free_rpc_rename_lvol_bdev(struct rpc_rename_lvol_bdev
*req
)
598 static const struct spdk_json_object_decoder rpc_rename_lvol_bdev_decoders
[] = {
599 {"old_name", offsetof(struct rpc_rename_lvol_bdev
, old_name
), spdk_json_decode_string
},
600 {"new_name", offsetof(struct rpc_rename_lvol_bdev
, new_name
), spdk_json_decode_string
},
604 _spdk_rpc_rename_lvol_bdev_cb(void *cb_arg
, int lvolerrno
)
606 struct spdk_json_write_ctx
*w
;
607 struct spdk_jsonrpc_request
*request
= cb_arg
;
609 if (lvolerrno
!= 0) {
613 w
= spdk_jsonrpc_begin_result(request
);
618 spdk_json_write_bool(w
, true);
619 spdk_jsonrpc_end_result(request
, w
);
623 spdk_jsonrpc_send_error_response(request
, SPDK_JSONRPC_ERROR_INVALID_PARAMS
,
624 spdk_strerror(-lvolerrno
));
628 spdk_rpc_rename_lvol_bdev(struct spdk_jsonrpc_request
*request
,
629 const struct spdk_json_val
*params
)
631 struct rpc_rename_lvol_bdev req
= {};
632 struct spdk_bdev
*bdev
;
633 struct spdk_lvol
*lvol
;
636 SPDK_INFOLOG(SPDK_LOG_LVOL_RPC
, "Renaming lvol\n");
638 if (spdk_json_decode_object(params
, rpc_rename_lvol_bdev_decoders
,
639 SPDK_COUNTOF(rpc_rename_lvol_bdev_decoders
),
641 SPDK_INFOLOG(SPDK_LOG_LVOL_RPC
, "spdk_json_decode_object failed\n");
646 bdev
= spdk_bdev_get_by_name(req
.old_name
);
648 SPDK_ERRLOG("bdev '%s' does not exist\n", req
.old_name
);
653 lvol
= vbdev_lvol_get_from_bdev(bdev
);
655 SPDK_ERRLOG("lvol does not exist\n");
660 vbdev_lvol_rename(lvol
, req
.new_name
, _spdk_rpc_rename_lvol_bdev_cb
, request
);
662 free_rpc_rename_lvol_bdev(&req
);
666 spdk_jsonrpc_send_error_response(request
, SPDK_JSONRPC_ERROR_INVALID_PARAMS
, spdk_strerror(-rc
));
667 free_rpc_rename_lvol_bdev(&req
);
670 SPDK_RPC_REGISTER("rename_lvol_bdev", spdk_rpc_rename_lvol_bdev
, SPDK_RPC_RUNTIME
)
672 struct rpc_inflate_lvol_bdev
{
677 free_rpc_inflate_lvol_bdev(struct rpc_inflate_lvol_bdev
*req
)
682 static const struct spdk_json_object_decoder rpc_inflate_lvol_bdev_decoders
[] = {
683 {"name", offsetof(struct rpc_inflate_lvol_bdev
, name
), spdk_json_decode_string
},
687 _spdk_rpc_inflate_lvol_bdev_cb(void *cb_arg
, int lvolerrno
)
689 struct spdk_json_write_ctx
*w
;
690 struct spdk_jsonrpc_request
*request
= cb_arg
;
692 if (lvolerrno
!= 0) {
696 w
= spdk_jsonrpc_begin_result(request
);
701 spdk_json_write_bool(w
, true);
702 spdk_jsonrpc_end_result(request
, w
);
706 spdk_jsonrpc_send_error_response(request
, SPDK_JSONRPC_ERROR_INVALID_PARAMS
,
707 spdk_strerror(-lvolerrno
));
711 spdk_rpc_inflate_lvol_bdev(struct spdk_jsonrpc_request
*request
,
712 const struct spdk_json_val
*params
)
714 struct rpc_inflate_lvol_bdev req
= {};
715 struct spdk_bdev
*bdev
;
716 struct spdk_lvol
*lvol
;
719 SPDK_INFOLOG(SPDK_LOG_LVOL_RPC
, "Inflating lvol\n");
721 if (spdk_json_decode_object(params
, rpc_inflate_lvol_bdev_decoders
,
722 SPDK_COUNTOF(rpc_inflate_lvol_bdev_decoders
),
724 SPDK_INFOLOG(SPDK_LOG_LVOL_RPC
, "spdk_json_decode_object failed\n");
729 bdev
= spdk_bdev_get_by_name(req
.name
);
731 SPDK_ERRLOG("bdev '%s' does not exist\n", req
.name
);
736 lvol
= vbdev_lvol_get_from_bdev(bdev
);
738 SPDK_ERRLOG("lvol does not exist\n");
743 spdk_lvol_inflate(lvol
, _spdk_rpc_inflate_lvol_bdev_cb
, request
);
745 free_rpc_inflate_lvol_bdev(&req
);
749 spdk_jsonrpc_send_error_response(request
, SPDK_JSONRPC_ERROR_INVALID_PARAMS
, spdk_strerror(-rc
));
750 free_rpc_inflate_lvol_bdev(&req
);
753 SPDK_RPC_REGISTER("inflate_lvol_bdev", spdk_rpc_inflate_lvol_bdev
, SPDK_RPC_RUNTIME
)
756 spdk_rpc_decouple_parent_lvol_bdev(struct spdk_jsonrpc_request
*request
,
757 const struct spdk_json_val
*params
)
759 struct rpc_inflate_lvol_bdev req
= {};
760 struct spdk_bdev
*bdev
;
761 struct spdk_lvol
*lvol
;
764 SPDK_INFOLOG(SPDK_LOG_LVOL_RPC
, "Decoupling parent of lvol\n");
766 if (spdk_json_decode_object(params
, rpc_inflate_lvol_bdev_decoders
,
767 SPDK_COUNTOF(rpc_inflate_lvol_bdev_decoders
),
769 SPDK_INFOLOG(SPDK_LOG_LVOL_RPC
, "spdk_json_decode_object failed\n");
774 bdev
= spdk_bdev_get_by_name(req
.name
);
776 SPDK_ERRLOG("bdev '%s' does not exist\n", req
.name
);
781 lvol
= vbdev_lvol_get_from_bdev(bdev
);
783 SPDK_ERRLOG("lvol does not exist\n");
788 spdk_lvol_decouple_parent(lvol
, _spdk_rpc_inflate_lvol_bdev_cb
, request
);
790 free_rpc_inflate_lvol_bdev(&req
);
794 spdk_jsonrpc_send_error_response(request
, SPDK_JSONRPC_ERROR_INVALID_PARAMS
, spdk_strerror(-rc
));
795 free_rpc_inflate_lvol_bdev(&req
);
798 SPDK_RPC_REGISTER("decouple_parent_lvol_bdev", spdk_rpc_decouple_parent_lvol_bdev
, SPDK_RPC_RUNTIME
)
800 struct rpc_resize_lvol_bdev
{
806 free_rpc_resize_lvol_bdev(struct rpc_resize_lvol_bdev
*req
)
811 static const struct spdk_json_object_decoder rpc_resize_lvol_bdev_decoders
[] = {
812 {"name", offsetof(struct rpc_resize_lvol_bdev
, name
), spdk_json_decode_string
},
813 {"size", offsetof(struct rpc_resize_lvol_bdev
, size
), spdk_json_decode_uint64
},
817 _spdk_rpc_resize_lvol_bdev_cb(void *cb_arg
, int lvolerrno
)
819 struct spdk_json_write_ctx
*w
;
820 struct spdk_jsonrpc_request
*request
= cb_arg
;
822 if (lvolerrno
!= 0) {
826 w
= spdk_jsonrpc_begin_result(request
);
831 spdk_json_write_bool(w
, true);
832 spdk_jsonrpc_end_result(request
, w
);
836 spdk_jsonrpc_send_error_response(request
, SPDK_JSONRPC_ERROR_INVALID_PARAMS
,
837 spdk_strerror(-lvolerrno
));
841 spdk_rpc_resize_lvol_bdev(struct spdk_jsonrpc_request
*request
,
842 const struct spdk_json_val
*params
)
844 struct rpc_resize_lvol_bdev req
= {};
845 struct spdk_bdev
*bdev
;
846 struct spdk_lvol
*lvol
;
849 SPDK_INFOLOG(SPDK_LOG_LVOL_RPC
, "Resizing lvol\n");
851 if (spdk_json_decode_object(params
, rpc_resize_lvol_bdev_decoders
,
852 SPDK_COUNTOF(rpc_resize_lvol_bdev_decoders
),
854 SPDK_INFOLOG(SPDK_LOG_LVOL_RPC
, "spdk_json_decode_object failed\n");
859 if (req
.name
== NULL
) {
860 SPDK_ERRLOG("missing name param\n");
865 bdev
= spdk_bdev_get_by_name(req
.name
);
867 SPDK_ERRLOG("no bdev for provided name %s\n", req
.name
);
872 lvol
= vbdev_lvol_get_from_bdev(bdev
);
878 vbdev_lvol_resize(lvol
, req
.size
, _spdk_rpc_resize_lvol_bdev_cb
, request
);
880 free_rpc_resize_lvol_bdev(&req
);
884 spdk_jsonrpc_send_error_response(request
, SPDK_JSONRPC_ERROR_INVALID_PARAMS
,
886 free_rpc_resize_lvol_bdev(&req
);
889 SPDK_RPC_REGISTER("resize_lvol_bdev", spdk_rpc_resize_lvol_bdev
, SPDK_RPC_RUNTIME
)
891 struct rpc_destroy_lvol_bdev
{
896 free_rpc_destroy_lvol_bdev(struct rpc_destroy_lvol_bdev
*req
)
901 static const struct spdk_json_object_decoder rpc_destroy_lvol_bdev_decoders
[] = {
902 {"name", offsetof(struct rpc_destroy_lvol_bdev
, name
), spdk_json_decode_string
},
906 _spdk_rpc_destroy_lvol_bdev_cb(void *cb_arg
, int lvolerrno
)
908 struct spdk_json_write_ctx
*w
;
909 struct spdk_jsonrpc_request
*request
= cb_arg
;
911 if (lvolerrno
!= 0) {
915 w
= spdk_jsonrpc_begin_result(request
);
920 spdk_json_write_bool(w
, true);
921 spdk_jsonrpc_end_result(request
, w
);
925 spdk_jsonrpc_send_error_response(request
, SPDK_JSONRPC_ERROR_INTERNAL_ERROR
,
926 spdk_strerror(-lvolerrno
));
930 spdk_rpc_destroy_lvol_bdev(struct spdk_jsonrpc_request
*request
,
931 const struct spdk_json_val
*params
)
933 struct rpc_destroy_lvol_bdev req
= {};
934 struct spdk_bdev
*bdev
;
935 struct spdk_lvol
*lvol
;
938 if (spdk_json_decode_object(params
, rpc_destroy_lvol_bdev_decoders
,
939 SPDK_COUNTOF(rpc_destroy_lvol_bdev_decoders
),
941 SPDK_INFOLOG(SPDK_LOG_LVOL_RPC
, "spdk_json_decode_object failed\n");
946 bdev
= spdk_bdev_get_by_name(req
.name
);
948 SPDK_ERRLOG("no bdev for provided name %s\n", req
.name
);
953 lvol
= vbdev_lvol_get_from_bdev(bdev
);
959 vbdev_lvol_destroy(lvol
, _spdk_rpc_destroy_lvol_bdev_cb
, request
);
961 free_rpc_destroy_lvol_bdev(&req
);
965 spdk_jsonrpc_send_error_response(request
, SPDK_JSONRPC_ERROR_INVALID_PARAMS
,
967 free_rpc_destroy_lvol_bdev(&req
);
970 SPDK_RPC_REGISTER("destroy_lvol_bdev", spdk_rpc_destroy_lvol_bdev
, SPDK_RPC_RUNTIME
)
972 struct rpc_get_lvol_stores
{
978 free_rpc_get_lvol_stores(struct rpc_get_lvol_stores
*req
)
984 static const struct spdk_json_object_decoder rpc_get_lvol_stores_decoders
[] = {
985 {"uuid", offsetof(struct rpc_get_lvol_stores
, uuid
), spdk_json_decode_string
, true},
986 {"lvs_name", offsetof(struct rpc_get_lvol_stores
, lvs_name
), spdk_json_decode_string
, true},
990 spdk_rpc_dump_lvol_store_info(struct spdk_json_write_ctx
*w
, struct lvol_store_bdev
*lvs_bdev
)
992 struct spdk_blob_store
*bs
;
993 uint64_t cluster_size
, block_size
;
994 char uuid
[SPDK_UUID_STRING_LEN
];
996 bs
= lvs_bdev
->lvs
->blobstore
;
997 cluster_size
= spdk_bs_get_cluster_size(bs
);
998 /* Block size of lvols is always size of blob store page */
999 block_size
= spdk_bs_get_page_size(bs
);
1001 spdk_json_write_object_begin(w
);
1003 spdk_uuid_fmt_lower(uuid
, sizeof(uuid
), &lvs_bdev
->lvs
->uuid
);
1004 spdk_json_write_name(w
, "uuid");
1005 spdk_json_write_string(w
, uuid
);
1007 spdk_json_write_name(w
, "name");
1008 spdk_json_write_string(w
, lvs_bdev
->lvs
->name
);
1010 spdk_json_write_name(w
, "base_bdev");
1011 spdk_json_write_string(w
, spdk_bdev_get_name(lvs_bdev
->bdev
));
1013 spdk_json_write_name(w
, "total_data_clusters");
1014 spdk_json_write_uint64(w
, spdk_bs_total_data_cluster_count(bs
));
1016 spdk_json_write_name(w
, "free_clusters");
1017 spdk_json_write_uint64(w
, spdk_bs_free_cluster_count(bs
));
1019 spdk_json_write_name(w
, "block_size");
1020 spdk_json_write_uint64(w
, block_size
);
1022 spdk_json_write_name(w
, "cluster_size");
1023 spdk_json_write_uint64(w
, cluster_size
);
1025 spdk_json_write_object_end(w
);
1029 spdk_rpc_get_lvol_stores(struct spdk_jsonrpc_request
*request
,
1030 const struct spdk_json_val
*params
)
1032 struct rpc_get_lvol_stores req
= {};
1033 struct spdk_json_write_ctx
*w
;
1034 struct lvol_store_bdev
*lvs_bdev
= NULL
;
1035 struct spdk_lvol_store
*lvs
= NULL
;
1038 if (params
!= NULL
) {
1039 if (spdk_json_decode_object(params
, rpc_get_lvol_stores_decoders
,
1040 SPDK_COUNTOF(rpc_get_lvol_stores_decoders
),
1042 SPDK_INFOLOG(SPDK_LOG_LVOL_RPC
, "spdk_json_decode_object failed\n");
1047 rc
= vbdev_get_lvol_store_by_uuid_xor_name(req
.uuid
, req
.lvs_name
, &lvs
);
1052 lvs_bdev
= vbdev_get_lvs_bdev_by_lvs(lvs
);
1053 if (lvs_bdev
== NULL
) {
1059 w
= spdk_jsonrpc_begin_result(request
);
1061 free_rpc_get_lvol_stores(&req
);
1065 spdk_json_write_array_begin(w
);
1067 if (lvs_bdev
!= NULL
) {
1068 spdk_rpc_dump_lvol_store_info(w
, lvs_bdev
);
1070 for (lvs_bdev
= vbdev_lvol_store_first(); lvs_bdev
!= NULL
;
1071 lvs_bdev
= vbdev_lvol_store_next(lvs_bdev
)) {
1072 spdk_rpc_dump_lvol_store_info(w
, lvs_bdev
);
1075 spdk_json_write_array_end(w
);
1077 spdk_jsonrpc_end_result(request
, w
);
1079 free_rpc_get_lvol_stores(&req
);
1084 spdk_jsonrpc_send_error_response(request
, SPDK_JSONRPC_ERROR_INVALID_PARAMS
,
1085 spdk_strerror(-rc
));
1086 free_rpc_get_lvol_stores(&req
);
1089 SPDK_RPC_REGISTER("get_lvol_stores", spdk_rpc_get_lvol_stores
, SPDK_RPC_RUNTIME
)