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.
34 #include "spdk_cunit.h"
35 #include "spdk/string.h"
37 #include "bdev/lvol/vbdev_lvol.c"
39 #include "unit/lib/json_mock.c"
41 #define SPDK_BS_PAGE_SIZE 0x1000
46 int g_registered_bdevs
;
48 struct spdk_lvol_store
*g_lvs
= NULL
;
49 struct spdk_lvol
*g_lvol
= NULL
;
50 struct lvol_store_bdev
*g_lvs_bdev
= NULL
;
51 struct spdk_bdev
*g_base_bdev
= NULL
;
52 struct spdk_bdev_io
*g_io
= NULL
;
53 struct spdk_io_channel
*g_ch
= NULL
;
54 struct lvol_task
*g_task
= NULL
;
56 static struct spdk_bdev g_bdev
= {};
57 static struct spdk_lvol_store
*g_lvol_store
= NULL
;
58 bool lvol_store_initialize_fail
= false;
59 bool lvol_store_initialize_cb_fail
= false;
60 bool lvol_already_opened
= false;
61 bool g_examine_done
= false;
62 bool g_bdev_alias_already_exists
= false;
63 bool g_lvs_with_name_already_exists
= false;
64 bool g_lvol_deletable
= true;
67 spdk_bdev_alias_add(struct spdk_bdev
*bdev
, const char *alias
)
69 struct spdk_bdev_alias
*tmp
;
71 CU_ASSERT(alias
!= NULL
);
72 CU_ASSERT(bdev
!= NULL
);
73 if (g_bdev_alias_already_exists
) {
77 tmp
= calloc(1, sizeof(*tmp
));
78 SPDK_CU_ASSERT_FATAL(tmp
!= NULL
);
80 tmp
->alias
= strdup(alias
);
81 SPDK_CU_ASSERT_FATAL(tmp
->alias
!= NULL
);
83 TAILQ_INSERT_TAIL(&bdev
->aliases
, tmp
, tailq
);
89 spdk_bdev_alias_del(struct spdk_bdev
*bdev
, const char *alias
)
91 struct spdk_bdev_alias
*tmp
;
93 CU_ASSERT(alias
!= NULL
);
94 CU_ASSERT(bdev
!= NULL
);
96 TAILQ_FOREACH(tmp
, &bdev
->aliases
, tailq
) {
97 if (strncmp(alias
, tmp
->alias
, SPDK_LVOL_NAME_MAX
) == 0) {
98 TAILQ_REMOVE(&bdev
->aliases
, tmp
, tailq
);
109 spdk_bdev_alias_del_all(struct spdk_bdev
*bdev
)
111 struct spdk_bdev_alias
*p
, *tmp
;
113 TAILQ_FOREACH_SAFE(p
, &bdev
->aliases
, tailq
, tmp
) {
114 TAILQ_REMOVE(&bdev
->aliases
, p
, tailq
);
121 spdk_bdev_destruct_done(struct spdk_bdev
*bdev
, int bdeverrno
)
126 spdk_lvs_rename(struct spdk_lvol_store
*lvs
, const char *new_name
,
127 spdk_lvs_op_complete cb_fn
, void *cb_arg
)
129 if (g_lvs_with_name_already_exists
) {
130 g_lvolerrno
= -EEXIST
;
132 snprintf(lvs
->name
, sizeof(lvs
->name
), "%s", new_name
);
136 cb_fn(cb_arg
, g_lvolerrno
);
140 spdk_lvol_rename(struct spdk_lvol
*lvol
, const char *new_name
,
141 spdk_lvol_op_complete cb_fn
, void *cb_arg
)
143 struct spdk_lvol
*tmp
;
145 if (strncmp(lvol
->name
, new_name
, SPDK_LVOL_NAME_MAX
) == 0) {
150 TAILQ_FOREACH(tmp
, &lvol
->lvol_store
->lvols
, link
) {
151 if (strncmp(tmp
->name
, new_name
, SPDK_LVOL_NAME_MAX
) == 0) {
152 SPDK_ERRLOG("Lvol %s already exists in lvol store %s\n", new_name
, lvol
->lvol_store
->name
);
153 cb_fn(cb_arg
, -EEXIST
);
158 snprintf(lvol
->name
, sizeof(lvol
->name
), "%s", new_name
);
160 cb_fn(cb_arg
, g_lvolerrno
);
164 spdk_lvol_open(struct spdk_lvol
*lvol
, spdk_lvol_op_with_handle_complete cb_fn
, void *cb_arg
)
166 cb_fn(cb_arg
, lvol
, g_lvolerrno
);
170 spdk_blob_get_num_clusters(struct spdk_blob
*b
)
176 spdk_blob_get_clones(struct spdk_blob_store
*bs
, spdk_blob_id blobid
, spdk_blob_id
*ids
,
184 spdk_blob_get_parent_snapshot(struct spdk_blob_store
*bs
, spdk_blob_id blobid
)
189 bool g_blob_is_read_only
= false;
192 spdk_blob_is_read_only(struct spdk_blob
*blob
)
194 return g_blob_is_read_only
;
198 spdk_blob_is_snapshot(struct spdk_blob
*blob
)
204 spdk_blob_is_clone(struct spdk_blob
*blob
)
210 spdk_blob_is_thin_provisioned(struct spdk_blob
*blob
)
215 static struct spdk_lvol
*_lvol_create(struct spdk_lvol_store
*lvs
);
218 spdk_lvs_load(struct spdk_bs_dev
*dev
,
219 spdk_lvs_op_with_handle_complete cb_fn
, void *cb_arg
)
221 struct spdk_lvol_store
*lvs
= NULL
;
223 int lvserrno
= g_lvserrno
;
226 /* On error blobstore destroys bs_dev itself,
227 * by puttin back io channels.
228 * This operation is asynchronous, and completed
229 * after calling the callback for lvol. */
230 cb_fn(cb_arg
, g_lvol_store
, lvserrno
);
235 lvs
= calloc(1, sizeof(*lvs
));
236 SPDK_CU_ASSERT_FATAL(lvs
!= NULL
);
237 TAILQ_INIT(&lvs
->lvols
);
238 TAILQ_INIT(&lvs
->pending_lvols
);
239 spdk_uuid_generate(&lvs
->uuid
);
241 for (i
= 0; i
< g_num_lvols
; i
++) {
245 cb_fn(cb_arg
, lvs
, lvserrno
);
249 spdk_bs_bdev_claim(struct spdk_bs_dev
*bs_dev
, struct spdk_bdev_module
*module
)
251 if (lvol_already_opened
== true) {
255 lvol_already_opened
= true;
261 spdk_bdev_unregister(struct spdk_bdev
*vbdev
, spdk_bdev_unregister_cb cb_fn
, void *cb_arg
)
265 SPDK_CU_ASSERT_FATAL(vbdev
!= NULL
);
266 rc
= vbdev
->fn_table
->destruct(vbdev
->ctxt
);
268 SPDK_CU_ASSERT_FATAL(cb_fn
!= NULL
);
273 spdk_bdev_module_finish_done(void)
279 spdk_bs_get_page_size(struct spdk_blob_store
*bs
)
281 return SPDK_BS_PAGE_SIZE
;
285 spdk_bs_get_io_unit_size(struct spdk_blob_store
*bs
)
287 return SPDK_BS_PAGE_SIZE
;
291 bdev_blob_destroy(struct spdk_bs_dev
*bs_dev
)
293 CU_ASSERT(bs_dev
!= NULL
);
295 lvol_already_opened
= false;
299 spdk_bdev_create_bs_dev(struct spdk_bdev
*bdev
, spdk_bdev_remove_cb_t remove_cb
, void *remove_ctx
)
301 struct spdk_bs_dev
*bs_dev
;
303 if (lvol_already_opened
== true || bdev
== NULL
) {
307 bs_dev
= calloc(1, sizeof(*bs_dev
));
308 SPDK_CU_ASSERT_FATAL(bs_dev
!= NULL
);
309 bs_dev
->destroy
= bdev_blob_destroy
;
315 spdk_lvs_opts_init(struct spdk_lvs_opts
*opts
)
320 spdk_lvs_init(struct spdk_bs_dev
*bs_dev
, struct spdk_lvs_opts
*o
,
321 spdk_lvs_op_with_handle_complete cb_fn
, void *cb_arg
)
323 struct spdk_lvol_store
*lvs
;
326 if (lvol_store_initialize_fail
) {
330 if (lvol_store_initialize_cb_fail
) {
331 bs_dev
->destroy(bs_dev
);
335 lvs
= calloc(1, sizeof(*lvs
));
336 SPDK_CU_ASSERT_FATAL(lvs
!= NULL
);
337 TAILQ_INIT(&lvs
->lvols
);
338 TAILQ_INIT(&lvs
->pending_lvols
);
339 spdk_uuid_generate(&lvs
->uuid
);
340 snprintf(lvs
->name
, sizeof(lvs
->name
), "%s", o
->name
);
341 lvs
->bs_dev
= bs_dev
;
344 cb_fn(cb_arg
, lvs
, error
);
350 spdk_lvs_unload(struct spdk_lvol_store
*lvs
, spdk_lvs_op_complete cb_fn
, void *cb_arg
)
352 struct spdk_lvol
*lvol
, *tmp
;
354 TAILQ_FOREACH_SAFE(lvol
, &lvs
->lvols
, link
, tmp
) {
355 TAILQ_REMOVE(&lvs
->lvols
, lvol
, link
);
360 lvs
->bs_dev
->destroy(lvs
->bs_dev
);
371 spdk_lvs_destroy(struct spdk_lvol_store
*lvs
, spdk_lvs_op_complete cb_fn
,
374 struct spdk_lvol
*lvol
, *tmp
;
377 TAILQ_FOREACH_SAFE(lvol
, &lvs
->lvols
, link
, tmp
) {
378 TAILQ_REMOVE(&lvs
->lvols
, lvol
, link
);
380 alias
= spdk_sprintf_alloc("%s/%s", lvs
->name
, lvol
->name
);
382 SPDK_ERRLOG("Cannot alloc memory for alias\n");
385 spdk_bdev_alias_del(lvol
->bdev
, alias
);
392 lvs
->bs_dev
->destroy(lvs
->bs_dev
);
403 spdk_lvol_resize(struct spdk_lvol
*lvol
, size_t sz
, spdk_lvol_op_complete cb_fn
, void *cb_arg
)
409 spdk_lvol_set_read_only(struct spdk_lvol
*lvol
, spdk_lvol_op_complete cb_fn
, void *cb_arg
)
415 spdk_bdev_notify_blockcnt_change(struct spdk_bdev
*bdev
, uint64_t size
)
417 bdev
->blockcnt
= size
;
422 spdk_bs_get_cluster_size(struct spdk_blob_store
*bs
)
424 return g_cluster_size
;
428 spdk_bdev_get_by_name(const char *bdev_name
)
430 if (!strcmp(g_base_bdev
->name
, bdev_name
)) {
438 spdk_lvol_close(struct spdk_lvol
*lvol
, spdk_lvol_op_complete cb_fn
, void *cb_arg
)
442 SPDK_CU_ASSERT_FATAL(cb_fn
!= NULL
);
447 spdk_lvol_deletable(struct spdk_lvol
*lvol
)
449 return g_lvol_deletable
;
453 spdk_lvol_destroy(struct spdk_lvol
*lvol
, spdk_lvol_op_complete cb_fn
, void *cb_arg
)
455 if (lvol
->ref_count
!= 0) {
456 cb_fn(cb_arg
, -ENODEV
);
459 TAILQ_REMOVE(&lvol
->lvol_store
->lvols
, lvol
, link
);
461 SPDK_CU_ASSERT_FATAL(cb_fn
!= NULL
);
469 spdk_bdev_io_complete(struct spdk_bdev_io
*bdev_io
, enum spdk_bdev_io_status status
)
473 struct spdk_io_channel
*spdk_lvol_get_io_channel(struct spdk_lvol
*lvol
)
475 CU_ASSERT(lvol
== g_lvol
);
480 spdk_bdev_io_get_buf(struct spdk_bdev_io
*bdev_io
, spdk_bdev_io_get_buf_cb cb
, uint64_t len
)
482 CU_ASSERT(cb
== lvol_get_buf_cb
);
486 spdk_blob_io_read(struct spdk_blob
*blob
, struct spdk_io_channel
*channel
,
487 void *payload
, uint64_t offset
, uint64_t length
,
488 spdk_blob_op_complete cb_fn
, void *cb_arg
)
493 spdk_blob_io_write(struct spdk_blob
*blob
, struct spdk_io_channel
*channel
,
494 void *payload
, uint64_t offset
, uint64_t length
,
495 spdk_blob_op_complete cb_fn
, void *cb_arg
)
500 spdk_blob_io_unmap(struct spdk_blob
*blob
, struct spdk_io_channel
*channel
,
501 uint64_t offset
, uint64_t length
, spdk_blob_op_complete cb_fn
, void *cb_arg
)
503 CU_ASSERT(blob
== NULL
);
504 CU_ASSERT(channel
== g_ch
);
505 CU_ASSERT(offset
== g_io
->u
.bdev
.offset_blocks
);
506 CU_ASSERT(length
== g_io
->u
.bdev
.num_blocks
);
510 spdk_blob_io_write_zeroes(struct spdk_blob
*blob
, struct spdk_io_channel
*channel
,
511 uint64_t offset
, uint64_t length
, spdk_blob_op_complete cb_fn
, void *cb_arg
)
513 CU_ASSERT(blob
== NULL
);
514 CU_ASSERT(channel
== g_ch
);
515 CU_ASSERT(offset
== g_io
->u
.bdev
.offset_blocks
);
516 CU_ASSERT(length
== g_io
->u
.bdev
.num_blocks
);
520 spdk_blob_io_writev(struct spdk_blob
*blob
, struct spdk_io_channel
*channel
,
521 struct iovec
*iov
, int iovcnt
, uint64_t offset
, uint64_t length
,
522 spdk_blob_op_complete cb_fn
, void *cb_arg
)
524 CU_ASSERT(blob
== NULL
);
525 CU_ASSERT(channel
== g_ch
);
526 CU_ASSERT(offset
== g_io
->u
.bdev
.offset_blocks
);
527 CU_ASSERT(length
== g_io
->u
.bdev
.num_blocks
);
531 spdk_blob_io_readv(struct spdk_blob
*blob
, struct spdk_io_channel
*channel
,
532 struct iovec
*iov
, int iovcnt
, uint64_t offset
, uint64_t length
,
533 spdk_blob_op_complete cb_fn
, void *cb_arg
)
535 CU_ASSERT(blob
== NULL
);
536 CU_ASSERT(channel
== g_ch
);
537 CU_ASSERT(offset
== g_io
->u
.bdev
.offset_blocks
);
538 CU_ASSERT(length
== g_io
->u
.bdev
.num_blocks
);
542 spdk_bdev_module_list_add(struct spdk_bdev_module
*bdev_module
)
547 spdk_bdev_get_name(const struct spdk_bdev
*bdev
)
553 spdk_bdev_register(struct spdk_bdev
*vbdev
)
555 TAILQ_INIT(&vbdev
->aliases
);
557 g_registered_bdevs
++;
562 spdk_bdev_module_examine_done(struct spdk_bdev_module
*module
)
564 SPDK_CU_ASSERT_FATAL(g_examine_done
!= true);
565 g_examine_done
= true;
568 static struct spdk_lvol
*
569 _lvol_create(struct spdk_lvol_store
*lvs
)
571 struct spdk_lvol
*lvol
= calloc(1, sizeof(*lvol
));
573 SPDK_CU_ASSERT_FATAL(lvol
!= NULL
);
575 lvol
->lvol_store
= lvs
;
577 snprintf(lvol
->unique_id
, sizeof(lvol
->unique_id
), "%s", "UNIT_TEST_UUID");
579 TAILQ_INSERT_TAIL(&lvol
->lvol_store
->lvols
, lvol
, link
);
585 spdk_lvol_create(struct spdk_lvol_store
*lvs
, const char *name
, size_t sz
,
586 bool thin_provision
, enum lvol_clear_method clear_method
, spdk_lvol_op_with_handle_complete cb_fn
,
589 struct spdk_lvol
*lvol
;
591 lvol
= _lvol_create(lvs
);
592 snprintf(lvol
->name
, sizeof(lvol
->name
), "%s", name
);
593 cb_fn(cb_arg
, lvol
, 0);
599 spdk_lvol_create_snapshot(struct spdk_lvol
*lvol
, const char *snapshot_name
,
600 spdk_lvol_op_with_handle_complete cb_fn
, void *cb_arg
)
602 struct spdk_lvol
*snap
;
604 snap
= _lvol_create(lvol
->lvol_store
);
605 snprintf(snap
->name
, sizeof(snap
->name
), "%s", snapshot_name
);
606 cb_fn(cb_arg
, snap
, 0);
610 spdk_lvol_create_clone(struct spdk_lvol
*lvol
, const char *clone_name
,
611 spdk_lvol_op_with_handle_complete cb_fn
, void *cb_arg
)
613 struct spdk_lvol
*clone
;
615 clone
= _lvol_create(lvol
->lvol_store
);
616 snprintf(clone
->name
, sizeof(clone
->name
), "%s", clone_name
);
617 cb_fn(cb_arg
, clone
, 0);
621 lvol_store_op_complete(void *cb_arg
, int lvserrno
)
623 g_lvserrno
= lvserrno
;
628 lvol_store_op_with_handle_complete(void *cb_arg
, struct spdk_lvol_store
*lvs
, int lvserrno
)
630 g_lvserrno
= lvserrno
;
636 vbdev_lvol_create_complete(void *cb_arg
, struct spdk_lvol
*lvol
, int lvolerrno
)
638 g_lvolerrno
= lvolerrno
;
643 vbdev_lvol_resize_complete(void *cb_arg
, int lvolerrno
)
645 g_lvolerrno
= lvolerrno
;
649 vbdev_lvol_set_read_only_complete(void *cb_arg
, int lvolerrno
)
651 g_lvolerrno
= lvolerrno
;
655 vbdev_lvol_rename_complete(void *cb_arg
, int lvolerrno
)
657 g_lvolerrno
= lvolerrno
;
665 struct spdk_lvol_store
*lvs
;
667 /* Lvol store is successfully created */
668 rc
= vbdev_lvs_create(&g_bdev
, "lvs", 0, LVS_CLEAR_WITH_UNMAP
, lvol_store_op_with_handle_complete
,
671 CU_ASSERT(g_lvserrno
== 0);
672 SPDK_CU_ASSERT_FATAL(g_lvol_store
!= NULL
);
673 CU_ASSERT(g_lvol_store
->bs_dev
!= NULL
);
678 spdk_uuid_generate(&lvs
->uuid
);
680 /* Successfully create lvol, which should be unloaded with lvs later */
682 rc
= vbdev_lvol_create(lvs
, "lvol", sz
, false, LVOL_CLEAR_WITH_DEFAULT
, vbdev_lvol_create_complete
,
685 CU_ASSERT(g_lvolerrno
== 0);
686 SPDK_CU_ASSERT_FATAL(g_lvol
!= NULL
);
688 /* Unload lvol store */
689 vbdev_lvs_destruct(lvs
, lvol_store_op_complete
, NULL
);
690 CU_ASSERT(g_lvserrno
== 0);
691 CU_ASSERT(g_lvol_store
== NULL
);
697 struct spdk_lvol_store
*lvs
;
701 /* Lvol store is successfully created */
702 rc
= vbdev_lvs_create(&g_bdev
, "lvs", 0, LVS_CLEAR_WITH_UNMAP
, lvol_store_op_with_handle_complete
,
705 CU_ASSERT(g_lvserrno
== 0);
706 SPDK_CU_ASSERT_FATAL(g_lvol_store
!= NULL
);
707 CU_ASSERT(g_lvol_store
->bs_dev
!= NULL
);
710 /* Successful lvol create */
712 rc
= vbdev_lvol_create(lvs
, "lvol", sz
, false, LVOL_CLEAR_WITH_DEFAULT
, vbdev_lvol_create_complete
,
714 SPDK_CU_ASSERT_FATAL(rc
== 0);
715 CU_ASSERT(g_lvol
!= NULL
);
716 CU_ASSERT(g_lvolerrno
== 0);
718 /* Successful lvol destroy */
719 vbdev_lvol_destroy(g_lvol
, lvol_store_op_complete
, NULL
);
720 CU_ASSERT(g_lvol
== NULL
);
722 /* Destroy lvol store */
723 vbdev_lvs_destruct(lvs
, lvol_store_op_complete
, NULL
);
724 CU_ASSERT(g_lvserrno
== 0);
725 CU_ASSERT(g_lvol_store
== NULL
);
729 ut_lvol_snapshot(void)
731 struct spdk_lvol_store
*lvs
;
734 struct spdk_lvol
*lvol
= NULL
;
736 /* Lvol store is successfully created */
737 rc
= vbdev_lvs_create(&g_bdev
, "lvs", 0, LVS_CLEAR_WITH_UNMAP
, lvol_store_op_with_handle_complete
,
740 CU_ASSERT(g_lvserrno
== 0);
741 SPDK_CU_ASSERT_FATAL(g_lvol_store
!= NULL
);
742 CU_ASSERT(g_lvol_store
->bs_dev
!= NULL
);
745 /* Successful lvol create */
747 rc
= vbdev_lvol_create(lvs
, "lvol", sz
, false, LVOL_CLEAR_WITH_DEFAULT
, vbdev_lvol_create_complete
,
749 SPDK_CU_ASSERT_FATAL(rc
== 0);
750 SPDK_CU_ASSERT_FATAL(g_lvol
!= NULL
);
751 CU_ASSERT(g_lvolerrno
== 0);
755 /* Successful snap create */
756 vbdev_lvol_create_snapshot(lvol
, "snap", vbdev_lvol_create_complete
, NULL
);
757 SPDK_CU_ASSERT_FATAL(rc
== 0);
758 CU_ASSERT(g_lvol
!= NULL
);
759 CU_ASSERT(g_lvolerrno
== 0);
761 /* Successful lvol destroy */
762 vbdev_lvol_destroy(g_lvol
, lvol_store_op_complete
, NULL
);
763 CU_ASSERT(g_lvol
== NULL
);
765 /* Successful snap destroy */
767 vbdev_lvol_destroy(g_lvol
, lvol_store_op_complete
, NULL
);
768 CU_ASSERT(g_lvol
== NULL
);
770 /* Destroy lvol store */
771 vbdev_lvs_destruct(lvs
, lvol_store_op_complete
, NULL
);
772 CU_ASSERT(g_lvserrno
== 0);
773 CU_ASSERT(g_lvol_store
== NULL
);
779 struct spdk_lvol_store
*lvs
;
782 struct spdk_lvol
*lvol
= NULL
;
783 struct spdk_lvol
*snap
= NULL
;
784 struct spdk_lvol
*clone
= NULL
;
786 /* Lvol store is successfully created */
787 rc
= vbdev_lvs_create(&g_bdev
, "lvs", 0, LVS_CLEAR_WITH_UNMAP
, lvol_store_op_with_handle_complete
,
790 CU_ASSERT(g_lvserrno
== 0);
791 SPDK_CU_ASSERT_FATAL(g_lvol_store
!= NULL
);
792 CU_ASSERT(g_lvol_store
->bs_dev
!= NULL
);
795 /* Successful lvol create */
797 rc
= vbdev_lvol_create(lvs
, "lvol", sz
, false, LVOL_CLEAR_WITH_DEFAULT
, vbdev_lvol_create_complete
,
799 SPDK_CU_ASSERT_FATAL(rc
== 0);
800 SPDK_CU_ASSERT_FATAL(g_lvol
!= NULL
);
801 CU_ASSERT(g_lvolerrno
== 0);
805 /* Successful snap create */
806 vbdev_lvol_create_snapshot(lvol
, "snap", vbdev_lvol_create_complete
, NULL
);
807 SPDK_CU_ASSERT_FATAL(rc
== 0);
808 SPDK_CU_ASSERT_FATAL(g_lvol
!= NULL
);
809 CU_ASSERT(g_lvolerrno
== 0);
813 /* Successful clone create */
814 vbdev_lvol_create_clone(snap
, "clone", vbdev_lvol_create_complete
, NULL
);
816 SPDK_CU_ASSERT_FATAL(rc
== 0);
817 SPDK_CU_ASSERT_FATAL(g_lvol
!= NULL
);
818 CU_ASSERT(g_lvolerrno
== 0);
822 /* Successful lvol destroy */
824 vbdev_lvol_destroy(g_lvol
, lvol_store_op_complete
, NULL
);
825 CU_ASSERT(g_lvol
== NULL
);
827 /* Successful clone destroy */
829 vbdev_lvol_destroy(g_lvol
, lvol_store_op_complete
, NULL
);
830 CU_ASSERT(g_lvol
== NULL
);
832 /* Successful lvol destroy */
834 vbdev_lvol_destroy(g_lvol
, lvol_store_op_complete
, NULL
);
835 CU_ASSERT(g_lvol
== NULL
);
837 /* Destroy lvol store */
838 vbdev_lvs_destruct(lvs
, lvol_store_op_complete
, NULL
);
839 CU_ASSERT(g_lvserrno
== 0);
840 CU_ASSERT(g_lvol_store
== NULL
);
844 ut_lvol_hotremove(void)
848 lvol_store_initialize_fail
= false;
849 lvol_store_initialize_cb_fail
= false;
850 lvol_already_opened
= false;
852 /* Lvol store is successfully created */
853 rc
= vbdev_lvs_create(&g_bdev
, "lvs", 0, LVS_CLEAR_WITH_UNMAP
, lvol_store_op_with_handle_complete
,
856 CU_ASSERT(g_lvserrno
== 0);
857 SPDK_CU_ASSERT_FATAL(g_lvol_store
!= NULL
);
858 CU_ASSERT(g_lvol_store
->bs_dev
!= NULL
);
860 /* Hot remove callback with NULL - stability check */
861 vbdev_lvs_hotremove_cb(NULL
);
863 /* Hot remove lvs on bdev removal */
864 vbdev_lvs_hotremove_cb(&g_bdev
);
866 CU_ASSERT(g_lvol_store
== NULL
);
867 CU_ASSERT(TAILQ_EMPTY(&g_spdk_lvol_pairs
));
872 ut_lvs_examine_check(bool success
)
874 struct lvol_store_bdev
*lvs_bdev
;
876 /* Examine was finished regardless of result */
877 CU_ASSERT(g_examine_done
== true);
878 g_examine_done
= false;
881 SPDK_CU_ASSERT_FATAL(!TAILQ_EMPTY(&g_spdk_lvol_pairs
));
882 lvs_bdev
= TAILQ_FIRST(&g_spdk_lvol_pairs
);
883 SPDK_CU_ASSERT_FATAL(lvs_bdev
!= NULL
);
884 g_lvol_store
= lvs_bdev
->lvs
;
885 SPDK_CU_ASSERT_FATAL(g_lvol_store
!= NULL
);
886 CU_ASSERT(g_lvol_store
->bs_dev
!= NULL
);
888 SPDK_CU_ASSERT_FATAL(TAILQ_EMPTY(&g_spdk_lvol_pairs
));
894 ut_lvol_examine(void)
896 /* Examine unsuccessfully - bdev already opened */
898 lvol_already_opened
= true;
899 vbdev_lvs_examine(&g_bdev
);
900 ut_lvs_examine_check(false);
902 /* Examine unsuccessfully - fail on lvol store */
904 lvol_already_opened
= false;
905 vbdev_lvs_examine(&g_bdev
);
906 ut_lvs_examine_check(false);
908 /* Examine successfully
909 * - one lvol fails to load
910 * - lvs is loaded with no lvols present */
914 lvol_already_opened
= false;
915 g_registered_bdevs
= 0;
916 vbdev_lvs_examine(&g_bdev
);
917 ut_lvs_examine_check(true);
918 CU_ASSERT(g_registered_bdevs
== 0);
919 CU_ASSERT(TAILQ_EMPTY(&g_lvol_store
->lvols
));
920 vbdev_lvs_destruct(g_lvol_store
, lvol_store_op_complete
, NULL
);
921 CU_ASSERT(g_lvserrno
== 0);
922 CU_ASSERT(g_lvol_store
== NULL
);
924 /* Examine successfully */
927 g_registered_bdevs
= 0;
928 lvol_already_opened
= false;
929 vbdev_lvs_examine(&g_bdev
);
930 ut_lvs_examine_check(true);
931 CU_ASSERT(g_registered_bdevs
!= 0);
932 SPDK_CU_ASSERT_FATAL(!TAILQ_EMPTY(&g_lvol_store
->lvols
));
933 vbdev_lvs_destruct(g_lvol_store
, lvol_store_op_complete
, NULL
);
934 CU_ASSERT(g_lvserrno
== 0);
940 struct spdk_lvol_store
*lvs
;
941 struct spdk_lvol
*lvol
;
942 struct spdk_lvol
*lvol2
;
946 /* Lvol store is successfully created */
947 rc
= vbdev_lvs_create(&g_bdev
, "lvs", 0, LVS_CLEAR_WITH_UNMAP
, lvol_store_op_with_handle_complete
,
950 CU_ASSERT(g_lvserrno
== 0);
951 SPDK_CU_ASSERT_FATAL(g_lvol_store
!= NULL
);
952 CU_ASSERT(g_lvol_store
->bs_dev
!= NULL
);
955 /* Successful lvols create */
957 rc
= vbdev_lvol_create(lvs
, "lvol", sz
, false, LVOL_CLEAR_WITH_DEFAULT
, vbdev_lvol_create_complete
,
959 SPDK_CU_ASSERT_FATAL(rc
== 0);
960 CU_ASSERT(g_lvol
!= NULL
);
961 CU_ASSERT(g_lvolerrno
== 0);
965 rc
= vbdev_lvol_create(lvs
, "lvol2", sz
, false, LVOL_CLEAR_WITH_DEFAULT
, vbdev_lvol_create_complete
,
967 SPDK_CU_ASSERT_FATAL(rc
== 0);
968 CU_ASSERT(g_lvol
!= NULL
);
969 CU_ASSERT(g_lvolerrno
== 0);
972 /* Successful rename lvol */
973 vbdev_lvol_rename(lvol
, "new_lvol_name", vbdev_lvol_rename_complete
, NULL
);
974 SPDK_CU_ASSERT_FATAL(g_lvolerrno
== 0);
975 CU_ASSERT_STRING_EQUAL(lvol
->name
, "new_lvol_name");
977 /* Renaming lvol with name already existing */
978 g_bdev_alias_already_exists
= true;
979 vbdev_lvol_rename(lvol2
, "new_lvol_name", vbdev_lvol_rename_complete
, NULL
);
980 g_bdev_alias_already_exists
= false;
981 SPDK_CU_ASSERT_FATAL(g_lvolerrno
!= 0);
982 CU_ASSERT_STRING_NOT_EQUAL(lvol2
->name
, "new_lvol_name");
984 /* Renaming lvol with it's own name */
985 vbdev_lvol_rename(lvol
, "new_lvol_name", vbdev_lvol_rename_complete
, NULL
);
986 SPDK_CU_ASSERT_FATAL(g_lvolerrno
== 0);
987 CU_ASSERT_STRING_EQUAL(lvol
->name
, "new_lvol_name");
989 /* Successful lvols destroy */
990 vbdev_lvol_destroy(lvol
, lvol_store_op_complete
, NULL
);
991 CU_ASSERT(g_lvol
== NULL
);
993 vbdev_lvol_destroy(lvol2
, lvol_store_op_complete
, NULL
);
994 CU_ASSERT(g_lvol
== NULL
);
996 /* Destroy lvol store */
997 vbdev_lvs_destruct(lvs
, lvol_store_op_complete
, NULL
);
998 CU_ASSERT(g_lvserrno
== 0);
999 CU_ASSERT(g_lvol_store
== NULL
);
1003 ut_lvol_destroy(void)
1005 struct spdk_lvol_store
*lvs
;
1006 struct spdk_lvol
*lvol
;
1007 struct spdk_lvol
*lvol2
;
1011 /* Lvol store is successfully created */
1012 rc
= vbdev_lvs_create(&g_bdev
, "lvs", 0, LVS_CLEAR_WITH_UNMAP
, lvol_store_op_with_handle_complete
,
1015 CU_ASSERT(g_lvserrno
== 0);
1016 SPDK_CU_ASSERT_FATAL(g_lvol_store
!= NULL
);
1017 CU_ASSERT(g_lvol_store
->bs_dev
!= NULL
);
1020 /* Successful lvols create */
1022 rc
= vbdev_lvol_create(lvs
, "lvol", sz
, false, LVOL_CLEAR_WITH_DEFAULT
, vbdev_lvol_create_complete
,
1024 SPDK_CU_ASSERT_FATAL(rc
== 0);
1025 CU_ASSERT(g_lvol
!= NULL
);
1026 CU_ASSERT(g_lvolerrno
== 0);
1030 rc
= vbdev_lvol_create(lvs
, "lvol2", sz
, false, LVOL_CLEAR_WITH_DEFAULT
, vbdev_lvol_create_complete
,
1032 SPDK_CU_ASSERT_FATAL(rc
== 0);
1033 CU_ASSERT(g_lvol
!= NULL
);
1034 CU_ASSERT(g_lvolerrno
== 0);
1037 /* Unsuccessful lvols destroy */
1038 g_lvol_deletable
= false;
1039 vbdev_lvol_destroy(lvol
, lvol_store_op_complete
, NULL
);
1040 CU_ASSERT(g_lvol
!= NULL
);
1041 CU_ASSERT(g_lvserrno
== -EPERM
);
1043 g_lvol_deletable
= true;
1044 /* Successful lvols destroy */
1045 vbdev_lvol_destroy(lvol
, lvol_store_op_complete
, NULL
);
1046 CU_ASSERT(g_lvol
== NULL
);
1047 CU_ASSERT(g_lvolerrno
== 0);
1049 /* Hot remove lvol bdev */
1050 vbdev_lvol_unregister(lvol2
);
1052 /* Unload lvol store */
1053 vbdev_lvs_unload(lvs
, lvol_store_op_complete
, NULL
);
1054 CU_ASSERT(g_lvserrno
== 0);
1055 CU_ASSERT(g_lvol_store
== NULL
);
1059 ut_lvol_resize(void)
1061 struct spdk_lvol_store
*lvs
;
1062 struct spdk_lvol
*lvol
;
1066 /* Lvol store is successfully created */
1067 rc
= vbdev_lvs_create(&g_bdev
, "lvs", 0, LVS_CLEAR_WITH_UNMAP
, lvol_store_op_with_handle_complete
,
1070 CU_ASSERT(g_lvserrno
== 0);
1071 SPDK_CU_ASSERT_FATAL(g_lvol_store
!= NULL
);
1072 CU_ASSERT(g_lvol_store
->bs_dev
!= NULL
);
1075 /* Successful lvol create */
1077 rc
= vbdev_lvol_create(lvs
, "lvol", sz
, false, LVOL_CLEAR_WITH_DEFAULT
, vbdev_lvol_create_complete
,
1080 CU_ASSERT(g_lvolerrno
== 0);
1081 SPDK_CU_ASSERT_FATAL(g_lvol
!= NULL
);
1084 /* Successful lvol resize */
1086 vbdev_lvol_resize(lvol
, 20, vbdev_lvol_resize_complete
, NULL
);
1087 CU_ASSERT(g_lvolerrno
== 0);
1088 CU_ASSERT(lvol
->bdev
->blockcnt
== 20 * g_cluster_size
/ lvol
->bdev
->blocklen
);
1090 /* Resize with NULL lvol */
1091 vbdev_lvol_resize(NULL
, 20, vbdev_lvol_resize_complete
, NULL
);
1092 CU_ASSERT(g_lvolerrno
!= 0);
1094 /* Successful lvol destroy */
1095 vbdev_lvol_destroy(lvol
, lvol_store_op_complete
, NULL
);
1096 CU_ASSERT(g_lvol
== NULL
);
1098 /* Destroy lvol store */
1099 vbdev_lvs_destruct(lvs
, lvol_store_op_complete
, NULL
);
1100 CU_ASSERT(g_lvserrno
== 0);
1101 CU_ASSERT(g_lvol_store
== NULL
);
1105 ut_lvol_set_read_only(void)
1107 struct spdk_lvol_store
*lvs
;
1108 struct spdk_lvol
*lvol
;
1112 /* Lvol store is successfully created */
1113 rc
= vbdev_lvs_create(&g_bdev
, "lvs", 0, LVS_CLEAR_WITH_UNMAP
, lvol_store_op_with_handle_complete
,
1116 CU_ASSERT(g_lvserrno
== 0);
1117 SPDK_CU_ASSERT_FATAL(g_lvol_store
!= NULL
);
1118 CU_ASSERT(g_lvol_store
->bs_dev
!= NULL
);
1121 /* Successful lvol create */
1123 rc
= vbdev_lvol_create(lvs
, "lvol", sz
, false, LVOL_CLEAR_WITH_DEFAULT
, vbdev_lvol_create_complete
,
1126 CU_ASSERT(g_lvolerrno
== 0);
1127 SPDK_CU_ASSERT_FATAL(g_lvol
!= NULL
);
1130 /* Successful set lvol as read only */
1132 vbdev_lvol_set_read_only(lvol
, vbdev_lvol_set_read_only_complete
, NULL
);
1133 CU_ASSERT(g_lvolerrno
== 0);
1135 /* Successful lvol destroy */
1136 vbdev_lvol_destroy(lvol
, lvol_store_op_complete
, NULL
);
1137 CU_ASSERT(g_lvol
== NULL
);
1139 /* Destroy lvol store */
1140 vbdev_lvs_destruct(lvs
, lvol_store_op_complete
, NULL
);
1141 CU_ASSERT(g_lvserrno
== 0);
1142 CU_ASSERT(g_lvol_store
== NULL
);
1150 struct spdk_lvol_store
*lvs
;
1152 /* Lvol store is successfully created */
1153 rc
= vbdev_lvs_create(&g_bdev
, "lvs", 0, LVS_CLEAR_WITH_UNMAP
, lvol_store_op_with_handle_complete
,
1156 CU_ASSERT(g_lvserrno
== 0);
1157 SPDK_CU_ASSERT_FATAL(g_lvol_store
!= NULL
);
1158 CU_ASSERT(g_lvol_store
->bs_dev
!= NULL
);
1161 g_lvol_store
= NULL
;
1163 spdk_uuid_generate(&lvs
->uuid
);
1165 /* Successfully create lvol, which should be destroyed with lvs later */
1167 rc
= vbdev_lvol_create(lvs
, "lvol", sz
, false, LVOL_CLEAR_WITH_DEFAULT
, vbdev_lvol_create_complete
,
1170 CU_ASSERT(g_lvolerrno
== 0);
1171 SPDK_CU_ASSERT_FATAL(g_lvol
!= NULL
);
1173 /* Unload lvol store */
1174 vbdev_lvs_unload(lvs
, lvol_store_op_complete
, NULL
);
1175 CU_ASSERT(g_lvserrno
== 0);
1176 CU_ASSERT(g_lvol_store
== NULL
);
1177 CU_ASSERT(g_lvol
!= NULL
);
1184 struct spdk_lvol_store
*lvs
;
1186 /* spdk_lvs_init() fails */
1187 lvol_store_initialize_fail
= true;
1189 rc
= vbdev_lvs_create(&g_bdev
, "lvs", 0, LVS_CLEAR_WITH_UNMAP
, lvol_store_op_with_handle_complete
,
1192 CU_ASSERT(g_lvserrno
== 0);
1193 CU_ASSERT(g_lvol_store
== NULL
);
1195 lvol_store_initialize_fail
= false;
1197 /* spdk_lvs_init_cb() fails */
1198 lvol_store_initialize_cb_fail
= true;
1200 rc
= vbdev_lvs_create(&g_bdev
, "lvs", 0, LVS_CLEAR_WITH_UNMAP
, lvol_store_op_with_handle_complete
,
1203 CU_ASSERT(g_lvserrno
!= 0);
1204 CU_ASSERT(g_lvol_store
== NULL
);
1206 lvol_store_initialize_cb_fail
= false;
1208 /* Lvol store is successfully created */
1209 rc
= vbdev_lvs_create(&g_bdev
, "lvs", 0, LVS_CLEAR_WITH_UNMAP
, lvol_store_op_with_handle_complete
,
1212 CU_ASSERT(g_lvserrno
== 0);
1213 SPDK_CU_ASSERT_FATAL(g_lvol_store
!= NULL
);
1214 CU_ASSERT(g_lvol_store
->bs_dev
!= NULL
);
1217 g_lvol_store
= NULL
;
1219 /* Bdev with lvol store already claimed */
1220 rc
= vbdev_lvs_create(&g_bdev
, "lvs", 0, LVS_CLEAR_WITH_UNMAP
, lvol_store_op_with_handle_complete
,
1223 CU_ASSERT(g_lvserrno
== 0);
1224 CU_ASSERT(g_lvol_store
== NULL
);
1226 /* Destruct lvol store */
1227 vbdev_lvs_destruct(lvs
, lvol_store_op_complete
, NULL
);
1228 CU_ASSERT(g_lvserrno
== 0);
1229 CU_ASSERT(g_lvol_store
== NULL
);
1233 ut_vbdev_lvol_get_io_channel(void)
1235 struct spdk_io_channel
*ch
;
1237 g_lvol
= calloc(1, sizeof(struct spdk_lvol
));
1238 SPDK_CU_ASSERT_FATAL(g_lvol
!= NULL
);
1240 ch
= vbdev_lvol_get_io_channel(g_lvol
);
1241 CU_ASSERT(ch
== g_ch
);
1247 ut_vbdev_lvol_io_type_supported(void)
1249 struct spdk_lvol
*lvol
;
1252 lvol
= calloc(1, sizeof(struct spdk_lvol
));
1253 SPDK_CU_ASSERT_FATAL(lvol
!= NULL
);
1255 g_blob_is_read_only
= false;
1257 /* Supported types */
1258 ret
= vbdev_lvol_io_type_supported(lvol
, SPDK_BDEV_IO_TYPE_READ
);
1259 CU_ASSERT(ret
== true);
1260 ret
= vbdev_lvol_io_type_supported(lvol
, SPDK_BDEV_IO_TYPE_WRITE
);
1261 CU_ASSERT(ret
== true);
1262 ret
= vbdev_lvol_io_type_supported(lvol
, SPDK_BDEV_IO_TYPE_RESET
);
1263 CU_ASSERT(ret
== true);
1264 ret
= vbdev_lvol_io_type_supported(lvol
, SPDK_BDEV_IO_TYPE_UNMAP
);
1265 CU_ASSERT(ret
== true);
1266 ret
= vbdev_lvol_io_type_supported(lvol
, SPDK_BDEV_IO_TYPE_WRITE_ZEROES
);
1267 CU_ASSERT(ret
== true);
1269 /* Unsupported types */
1270 ret
= vbdev_lvol_io_type_supported(lvol
, SPDK_BDEV_IO_TYPE_FLUSH
);
1271 CU_ASSERT(ret
== false);
1272 ret
= vbdev_lvol_io_type_supported(lvol
, SPDK_BDEV_IO_TYPE_NVME_ADMIN
);
1273 CU_ASSERT(ret
== false);
1274 ret
= vbdev_lvol_io_type_supported(lvol
, SPDK_BDEV_IO_TYPE_NVME_IO
);
1275 CU_ASSERT(ret
== false);
1277 g_blob_is_read_only
= true;
1279 /* Supported types */
1280 ret
= vbdev_lvol_io_type_supported(lvol
, SPDK_BDEV_IO_TYPE_READ
);
1281 CU_ASSERT(ret
== true);
1282 ret
= vbdev_lvol_io_type_supported(lvol
, SPDK_BDEV_IO_TYPE_RESET
);
1283 CU_ASSERT(ret
== true);
1285 /* Unsupported types */
1286 ret
= vbdev_lvol_io_type_supported(lvol
, SPDK_BDEV_IO_TYPE_WRITE
);
1287 CU_ASSERT(ret
== false);
1288 ret
= vbdev_lvol_io_type_supported(lvol
, SPDK_BDEV_IO_TYPE_UNMAP
);
1289 CU_ASSERT(ret
== false);
1290 ret
= vbdev_lvol_io_type_supported(lvol
, SPDK_BDEV_IO_TYPE_WRITE_ZEROES
);
1291 CU_ASSERT(ret
== false);
1292 ret
= vbdev_lvol_io_type_supported(lvol
, SPDK_BDEV_IO_TYPE_FLUSH
);
1293 CU_ASSERT(ret
== false);
1294 ret
= vbdev_lvol_io_type_supported(lvol
, SPDK_BDEV_IO_TYPE_NVME_ADMIN
);
1295 CU_ASSERT(ret
== false);
1296 ret
= vbdev_lvol_io_type_supported(lvol
, SPDK_BDEV_IO_TYPE_NVME_IO
);
1297 CU_ASSERT(ret
== false);
1303 ut_lvol_read_write(void)
1305 g_io
= calloc(1, sizeof(struct spdk_bdev_io
) + sizeof(struct lvol_task
));
1306 SPDK_CU_ASSERT_FATAL(g_io
!= NULL
);
1307 g_base_bdev
= calloc(1, sizeof(struct spdk_bdev
));
1308 SPDK_CU_ASSERT_FATAL(g_base_bdev
!= NULL
);
1309 g_lvol
= calloc(1, sizeof(struct spdk_lvol
));
1310 SPDK_CU_ASSERT_FATAL(g_lvol
!= NULL
);
1312 g_task
= (struct lvol_task
*)g_io
->driver_ctx
;
1313 g_io
->bdev
= g_base_bdev
;
1314 g_io
->bdev
->ctxt
= g_lvol
;
1315 g_io
->u
.bdev
.offset_blocks
= 20;
1316 g_io
->u
.bdev
.num_blocks
= 20;
1318 lvol_read(g_ch
, g_io
);
1319 CU_ASSERT(g_task
->status
== SPDK_BDEV_IO_STATUS_SUCCESS
);
1321 lvol_write(g_lvol
, g_ch
, g_io
);
1322 CU_ASSERT(g_task
->status
== SPDK_BDEV_IO_STATUS_SUCCESS
);
1330 ut_vbdev_lvol_submit_request(void)
1332 struct spdk_lvol request_lvol
= {};
1333 g_io
= calloc(1, sizeof(struct spdk_bdev_io
) + sizeof(struct lvol_task
));
1334 SPDK_CU_ASSERT_FATAL(g_io
!= NULL
);
1335 g_base_bdev
= calloc(1, sizeof(struct spdk_bdev
));
1336 SPDK_CU_ASSERT_FATAL(g_base_bdev
!= NULL
);
1337 g_task
= (struct lvol_task
*)g_io
->driver_ctx
;
1338 g_io
->bdev
= g_base_bdev
;
1340 g_io
->type
= SPDK_BDEV_IO_TYPE_READ
;
1341 g_base_bdev
->ctxt
= &request_lvol
;
1342 vbdev_lvol_submit_request(g_ch
, g_io
);
1353 struct spdk_lvol_store
*lvs
;
1355 /* Lvol store is successfully created */
1356 rc
= vbdev_lvs_create(&g_bdev
, "old_lvs_name", 0, LVS_CLEAR_WITH_UNMAP
,
1357 lvol_store_op_with_handle_complete
, NULL
);
1359 CU_ASSERT(g_lvserrno
== 0);
1360 SPDK_CU_ASSERT_FATAL(g_lvol_store
!= NULL
);
1361 CU_ASSERT(g_lvol_store
->bs_dev
!= NULL
);
1364 g_lvol_store
= NULL
;
1366 g_base_bdev
= calloc(1, sizeof(*g_base_bdev
));
1367 SPDK_CU_ASSERT_FATAL(g_base_bdev
!= NULL
);
1369 /* Successfully create lvol, which should be destroyed with lvs later */
1371 rc
= vbdev_lvol_create(lvs
, "lvol", sz
, false, LVOL_CLEAR_WITH_DEFAULT
, vbdev_lvol_create_complete
,
1374 CU_ASSERT(g_lvolerrno
== 0);
1375 SPDK_CU_ASSERT_FATAL(g_lvol
!= NULL
);
1377 /* Trying to rename lvs with lvols created */
1378 vbdev_lvs_rename(lvs
, "new_lvs_name", lvol_store_op_complete
, NULL
);
1379 CU_ASSERT(g_lvserrno
== 0);
1380 CU_ASSERT_STRING_EQUAL(lvs
->name
, "new_lvs_name");
1381 CU_ASSERT_STRING_EQUAL(TAILQ_FIRST(&g_lvol
->bdev
->aliases
)->alias
, "new_lvs_name/lvol");
1383 /* Trying to rename lvs with name already used by another lvs */
1384 /* This is a bdev_lvol test, so g_lvs_with_name_already_exists simulates
1385 * existing lvs with name 'another_new_lvs_name' and this name in fact is not compared */
1386 g_lvs_with_name_already_exists
= true;
1387 vbdev_lvs_rename(lvs
, "another_new_lvs_name", lvol_store_op_complete
, NULL
);
1388 CU_ASSERT(g_lvserrno
== -EEXIST
);
1389 CU_ASSERT_STRING_EQUAL(lvs
->name
, "new_lvs_name");
1390 CU_ASSERT_STRING_EQUAL(TAILQ_FIRST(&g_lvol
->bdev
->aliases
)->alias
, "new_lvs_name/lvol");
1391 g_lvs_with_name_already_exists
= false;
1393 /* Unload lvol store */
1395 vbdev_lvs_destruct(g_lvol_store
, lvol_store_op_complete
, NULL
);
1396 CU_ASSERT(g_lvserrno
== 0);
1397 CU_ASSERT(g_lvol_store
== NULL
);
1399 free(g_base_bdev
->name
);
1403 int main(int argc
, char **argv
)
1405 CU_pSuite suite
= NULL
;
1406 unsigned int num_failures
;
1408 if (CU_initialize_registry() != CUE_SUCCESS
) {
1409 return CU_get_error();
1412 suite
= CU_add_suite("lvol", NULL
, NULL
);
1413 if (suite
== NULL
) {
1414 CU_cleanup_registry();
1415 return CU_get_error();
1419 CU_add_test(suite
, "ut_lvs_init", ut_lvs_init
) == NULL
||
1420 CU_add_test(suite
, "ut_lvol_init", ut_lvol_init
) == NULL
||
1421 CU_add_test(suite
, "ut_lvol_snapshot", ut_lvol_snapshot
) == NULL
||
1422 CU_add_test(suite
, "ut_lvol_clone", ut_lvol_clone
) == NULL
||
1423 CU_add_test(suite
, "ut_lvs_destroy", ut_lvs_destroy
) == NULL
||
1424 CU_add_test(suite
, "ut_lvs_unload", ut_lvs_unload
) == NULL
||
1425 CU_add_test(suite
, "ut_lvol_resize", ut_lvol_resize
) == NULL
||
1426 CU_add_test(suite
, "ut_lvol_set_read_only", ut_lvol_set_read_only
) == NULL
||
1427 CU_add_test(suite
, "lvol_hotremove", ut_lvol_hotremove
) == NULL
||
1428 CU_add_test(suite
, "ut_vbdev_lvol_get_io_channel", ut_vbdev_lvol_get_io_channel
) == NULL
||
1429 CU_add_test(suite
, "ut_vbdev_lvol_io_type_supported", ut_vbdev_lvol_io_type_supported
) == NULL
||
1430 CU_add_test(suite
, "ut_lvol_read_write", ut_lvol_read_write
) == NULL
||
1431 CU_add_test(suite
, "ut_vbdev_lvol_submit_request", ut_vbdev_lvol_submit_request
) == NULL
||
1432 CU_add_test(suite
, "lvol_examine", ut_lvol_examine
) == NULL
||
1433 CU_add_test(suite
, "ut_lvol_rename", ut_lvol_rename
) == NULL
||
1434 CU_add_test(suite
, "ut_lvol_destroy", ut_lvol_destroy
) == NULL
||
1435 CU_add_test(suite
, "ut_lvs_rename", ut_lvs_rename
) == NULL
1437 CU_cleanup_registry();
1438 return CU_get_error();
1441 CU_basic_set_mode(CU_BRM_VERBOSE
);
1442 CU_basic_run_tests();
1443 num_failures
= CU_get_number_of_failures();
1444 CU_cleanup_registry();
1445 return num_failures
;