xref: /spdk/test/unit/lib/bdev/vbdev_lvol.c/vbdev_lvol_ut.c (revision 73f79a5c56823bb53e2891c7e16a961b3c192fbc)
1 /*-
2  *   BSD LICENSE
3  *
4  *   Copyright (c) Intel Corporation.
5  *   All rights reserved.
6  *
7  *   Redistribution and use in source and binary forms, with or without
8  *   modification, are permitted provided that the following conditions
9  *   are met:
10  *
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
16  *       distribution.
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.
20  *
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.
32  */
33 
34 #include "spdk_cunit.h"
35 #include "spdk/string.h"
36 
37 #include "bdev/lvol/vbdev_lvol.c"
38 
39 #include "unit/lib/json_mock.c"
40 
41 #define SPDK_BS_PAGE_SIZE 0x1000
42 
43 int g_lvolerrno;
44 int g_lvserrno;
45 int g_cluster_size;
46 int g_registered_bdevs;
47 int g_num_lvols = 0;
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;
55 
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;
65 
66 int
67 spdk_bdev_alias_add(struct spdk_bdev *bdev, const char *alias)
68 {
69 	struct spdk_bdev_alias *tmp;
70 
71 	CU_ASSERT(alias != NULL);
72 	CU_ASSERT(bdev != NULL);
73 	if (g_bdev_alias_already_exists) {
74 		return -EEXIST;
75 	}
76 
77 	tmp = calloc(1, sizeof(*tmp));
78 	SPDK_CU_ASSERT_FATAL(tmp != NULL);
79 
80 	tmp->alias = strdup(alias);
81 	SPDK_CU_ASSERT_FATAL(tmp->alias != NULL);
82 
83 	TAILQ_INSERT_TAIL(&bdev->aliases, tmp, tailq);
84 
85 	return 0;
86 }
87 
88 int
89 spdk_bdev_alias_del(struct spdk_bdev *bdev, const char *alias)
90 {
91 	struct spdk_bdev_alias *tmp;
92 
93 	CU_ASSERT(alias != NULL);
94 	CU_ASSERT(bdev != NULL);
95 
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);
99 			free(tmp->alias);
100 			free(tmp);
101 			return 0;
102 		}
103 	}
104 
105 	return -ENOENT;
106 }
107 
108 void
109 spdk_bdev_alias_del_all(struct spdk_bdev *bdev)
110 {
111 	struct spdk_bdev_alias *p, *tmp;
112 
113 	TAILQ_FOREACH_SAFE(p, &bdev->aliases, tailq, tmp) {
114 		TAILQ_REMOVE(&bdev->aliases, p, tailq);
115 		free(p->alias);
116 		free(p);
117 	}
118 }
119 
120 void
121 spdk_bdev_destruct_done(struct spdk_bdev *bdev, int bdeverrno)
122 {
123 }
124 
125 void
126 spdk_lvs_rename(struct spdk_lvol_store *lvs, const char *new_name,
127 		spdk_lvs_op_complete cb_fn, void *cb_arg)
128 {
129 	if (g_lvs_with_name_already_exists) {
130 		g_lvolerrno = -EEXIST;
131 	} else {
132 		snprintf(lvs->name, sizeof(lvs->name), "%s", new_name);
133 		g_lvolerrno = 0;
134 	}
135 
136 	cb_fn(cb_arg, g_lvolerrno);
137 }
138 
139 void
140 spdk_lvol_rename(struct spdk_lvol *lvol, const char *new_name,
141 		 spdk_lvol_op_complete cb_fn, void *cb_arg)
142 {
143 	struct spdk_lvol *tmp;
144 
145 	if (strncmp(lvol->name, new_name, SPDK_LVOL_NAME_MAX) == 0) {
146 		cb_fn(cb_arg, 0);
147 		return;
148 	}
149 
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);
154 			return;
155 		}
156 	}
157 
158 	snprintf(lvol->name, sizeof(lvol->name), "%s", new_name);
159 
160 	cb_fn(cb_arg, g_lvolerrno);
161 }
162 
163 void
164 spdk_lvol_open(struct spdk_lvol *lvol, spdk_lvol_op_with_handle_complete cb_fn, void *cb_arg)
165 {
166 	cb_fn(cb_arg, lvol, g_lvolerrno);
167 }
168 
169 uint64_t
170 spdk_blob_get_num_clusters(struct spdk_blob *b)
171 {
172 	return 0;
173 }
174 
175 int
176 spdk_blob_get_clones(struct spdk_blob_store *bs, spdk_blob_id blobid, spdk_blob_id *ids,
177 		     size_t *count)
178 {
179 	*count = 0;
180 	return 0;
181 }
182 
183 spdk_blob_id
184 spdk_blob_get_parent_snapshot(struct spdk_blob_store *bs, spdk_blob_id blobid)
185 {
186 	return 0;
187 }
188 
189 bool g_blob_is_read_only = false;
190 
191 bool
192 spdk_blob_is_read_only(struct spdk_blob *blob)
193 {
194 	return g_blob_is_read_only;
195 }
196 
197 bool
198 spdk_blob_is_snapshot(struct spdk_blob *blob)
199 {
200 	return false;
201 }
202 
203 bool
204 spdk_blob_is_clone(struct spdk_blob *blob)
205 {
206 	return false;
207 }
208 
209 bool
210 spdk_blob_is_thin_provisioned(struct spdk_blob *blob)
211 {
212 	return false;
213 }
214 
215 static struct spdk_lvol *_lvol_create(struct spdk_lvol_store *lvs);
216 
217 void
218 spdk_lvs_load(struct spdk_bs_dev *dev,
219 	      spdk_lvs_op_with_handle_complete cb_fn, void *cb_arg)
220 {
221 	struct spdk_lvol_store *lvs = NULL;
222 	int i;
223 	int lvserrno = g_lvserrno;
224 
225 	if (lvserrno != 0) {
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);
231 		dev->destroy(dev);
232 		return;
233 	}
234 
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);
240 	lvs->bs_dev = dev;
241 	for (i = 0; i < g_num_lvols; i++) {
242 		_lvol_create(lvs);
243 	}
244 
245 	cb_fn(cb_arg, lvs, lvserrno);
246 }
247 
248 int
249 spdk_bs_bdev_claim(struct spdk_bs_dev *bs_dev, struct spdk_bdev_module *module)
250 {
251 	if (lvol_already_opened == true) {
252 		return -1;
253 	}
254 
255 	lvol_already_opened = true;
256 
257 	return 0;
258 }
259 
260 void
261 spdk_bdev_unregister(struct spdk_bdev *vbdev, spdk_bdev_unregister_cb cb_fn, void *cb_arg)
262 {
263 	int rc;
264 
265 	SPDK_CU_ASSERT_FATAL(vbdev != NULL);
266 	rc = vbdev->fn_table->destruct(vbdev->ctxt);
267 
268 	SPDK_CU_ASSERT_FATAL(cb_fn != NULL);
269 	cb_fn(cb_arg, rc);
270 }
271 
272 void
273 spdk_bdev_module_finish_done(void)
274 {
275 	return;
276 }
277 
278 uint64_t
279 spdk_bs_get_page_size(struct spdk_blob_store *bs)
280 {
281 	return SPDK_BS_PAGE_SIZE;
282 }
283 
284 uint64_t
285 spdk_bs_get_io_unit_size(struct spdk_blob_store *bs)
286 {
287 	return SPDK_BS_PAGE_SIZE;
288 }
289 
290 static void
291 bdev_blob_destroy(struct spdk_bs_dev *bs_dev)
292 {
293 	CU_ASSERT(bs_dev != NULL);
294 	free(bs_dev);
295 	lvol_already_opened = false;
296 }
297 
298 struct spdk_bs_dev *
299 spdk_bdev_create_bs_dev(struct spdk_bdev *bdev, spdk_bdev_remove_cb_t remove_cb, void *remove_ctx)
300 {
301 	struct spdk_bs_dev *bs_dev;
302 
303 	if (lvol_already_opened == true || bdev == NULL) {
304 		return NULL;
305 	}
306 
307 	bs_dev = calloc(1, sizeof(*bs_dev));
308 	SPDK_CU_ASSERT_FATAL(bs_dev != NULL);
309 	bs_dev->destroy = bdev_blob_destroy;
310 
311 	return bs_dev;
312 }
313 
314 void
315 spdk_lvs_opts_init(struct spdk_lvs_opts *opts)
316 {
317 }
318 
319 int
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)
322 {
323 	struct spdk_lvol_store *lvs;
324 	int error = 0;
325 
326 	if (lvol_store_initialize_fail) {
327 		return -1;
328 	}
329 
330 	if (lvol_store_initialize_cb_fail) {
331 		bs_dev->destroy(bs_dev);
332 		lvs = NULL;
333 		error = -1;
334 	} else {
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;
342 		error = 0;
343 	}
344 	cb_fn(cb_arg, lvs, error);
345 
346 	return 0;
347 }
348 
349 int
350 spdk_lvs_unload(struct spdk_lvol_store *lvs, spdk_lvs_op_complete cb_fn, void *cb_arg)
351 {
352 	struct spdk_lvol *lvol, *tmp;
353 
354 	TAILQ_FOREACH_SAFE(lvol, &lvs->lvols, link, tmp) {
355 		TAILQ_REMOVE(&lvs->lvols, lvol, link);
356 		free(lvol);
357 	}
358 	g_lvol_store = NULL;
359 
360 	lvs->bs_dev->destroy(lvs->bs_dev);
361 	free(lvs);
362 
363 	if (cb_fn != NULL) {
364 		cb_fn(cb_arg, 0);
365 	}
366 
367 	return 0;
368 }
369 
370 int
371 spdk_lvs_destroy(struct spdk_lvol_store *lvs, spdk_lvs_op_complete cb_fn,
372 		 void *cb_arg)
373 {
374 	struct spdk_lvol *lvol, *tmp;
375 	char *alias;
376 
377 	TAILQ_FOREACH_SAFE(lvol, &lvs->lvols, link, tmp) {
378 		TAILQ_REMOVE(&lvs->lvols, lvol, link);
379 
380 		alias = spdk_sprintf_alloc("%s/%s", lvs->name, lvol->name);
381 		if (alias == NULL) {
382 			SPDK_ERRLOG("Cannot alloc memory for alias\n");
383 			return -1;
384 		}
385 		spdk_bdev_alias_del(lvol->bdev, alias);
386 
387 		free(alias);
388 		free(lvol);
389 	}
390 	g_lvol_store = NULL;
391 
392 	lvs->bs_dev->destroy(lvs->bs_dev);
393 	free(lvs);
394 
395 	if (cb_fn != NULL) {
396 		cb_fn(cb_arg, 0);
397 	}
398 
399 	return 0;
400 }
401 
402 void
403 spdk_lvol_resize(struct spdk_lvol *lvol, size_t sz,  spdk_lvol_op_complete cb_fn, void *cb_arg)
404 {
405 	cb_fn(cb_arg, 0);
406 }
407 
408 void
409 spdk_lvol_set_read_only(struct spdk_lvol *lvol, spdk_lvol_op_complete cb_fn, void *cb_arg)
410 {
411 	cb_fn(cb_arg, 0);
412 }
413 
414 int
415 spdk_bdev_notify_blockcnt_change(struct spdk_bdev *bdev, uint64_t size)
416 {
417 	bdev->blockcnt = size;
418 	return 0;
419 }
420 
421 uint64_t
422 spdk_bs_get_cluster_size(struct spdk_blob_store *bs)
423 {
424 	return g_cluster_size;
425 }
426 
427 struct spdk_bdev *
428 spdk_bdev_get_by_name(const char *bdev_name)
429 {
430 	if (!strcmp(g_base_bdev->name, bdev_name)) {
431 		return g_base_bdev;
432 	}
433 
434 	return NULL;
435 }
436 
437 void
438 spdk_lvol_close(struct spdk_lvol *lvol, spdk_lvol_op_complete cb_fn, void *cb_arg)
439 {
440 	lvol->ref_count--;
441 
442 	SPDK_CU_ASSERT_FATAL(cb_fn != NULL);
443 	cb_fn(cb_arg, 0);
444 }
445 
446 bool
447 spdk_lvol_deletable(struct spdk_lvol *lvol)
448 {
449 	return g_lvol_deletable;
450 }
451 
452 void
453 spdk_lvol_destroy(struct spdk_lvol *lvol, spdk_lvol_op_complete cb_fn, void *cb_arg)
454 {
455 	if (lvol->ref_count != 0) {
456 		cb_fn(cb_arg, -ENODEV);
457 	}
458 
459 	TAILQ_REMOVE(&lvol->lvol_store->lvols, lvol, link);
460 
461 	SPDK_CU_ASSERT_FATAL(cb_fn != NULL);
462 	cb_fn(cb_arg, 0);
463 
464 	g_lvol = NULL;
465 	free(lvol);
466 }
467 
468 void
469 spdk_bdev_io_complete(struct spdk_bdev_io *bdev_io, enum spdk_bdev_io_status status)
470 {
471 }
472 
473 struct spdk_io_channel *spdk_lvol_get_io_channel(struct spdk_lvol *lvol)
474 {
475 	CU_ASSERT(lvol == g_lvol);
476 	return g_ch;
477 }
478 
479 void
480 spdk_bdev_io_get_buf(struct spdk_bdev_io *bdev_io, spdk_bdev_io_get_buf_cb cb, uint64_t len)
481 {
482 	CU_ASSERT(cb == lvol_read);
483 }
484 
485 void
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)
489 {
490 }
491 
492 void
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)
496 {
497 }
498 
499 void
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)
502 {
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);
507 }
508 
509 void
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)
512 {
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);
517 }
518 
519 void
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)
523 {
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);
528 }
529 
530 void
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)
534 {
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);
539 }
540 
541 void
542 spdk_bdev_module_list_add(struct spdk_bdev_module *bdev_module)
543 {
544 }
545 
546 const char *
547 spdk_bdev_get_name(const struct spdk_bdev *bdev)
548 {
549 	return "test";
550 }
551 
552 int
553 spdk_vbdev_register(struct spdk_bdev *vbdev, struct spdk_bdev **base_bdevs, int base_bdev_count)
554 {
555 	TAILQ_INIT(&vbdev->aliases);
556 
557 	g_registered_bdevs++;
558 	return 0;
559 }
560 
561 void
562 spdk_bdev_module_examine_done(struct spdk_bdev_module *module)
563 {
564 	SPDK_CU_ASSERT_FATAL(g_examine_done != true);
565 	g_examine_done = true;
566 }
567 
568 static struct spdk_lvol *
569 _lvol_create(struct spdk_lvol_store *lvs)
570 {
571 	struct spdk_lvol *lvol = calloc(1, sizeof(*lvol));
572 
573 	SPDK_CU_ASSERT_FATAL(lvol != NULL);
574 
575 	lvol->lvol_store = lvs;
576 	lvol->ref_count++;
577 	snprintf(lvol->unique_id, sizeof(lvol->unique_id), "%s", "UNIT_TEST_UUID");
578 
579 	TAILQ_INSERT_TAIL(&lvol->lvol_store->lvols, lvol, link);
580 
581 	return lvol;
582 }
583 
584 int
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,
587 		 void *cb_arg)
588 {
589 	struct spdk_lvol *lvol;
590 
591 	lvol = _lvol_create(lvs);
592 	snprintf(lvol->name, sizeof(lvol->name), "%s", name);
593 	cb_fn(cb_arg, lvol, 0);
594 
595 	return 0;
596 }
597 
598 void
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)
601 {
602 	struct spdk_lvol *snap;
603 
604 	snap = _lvol_create(lvol->lvol_store);
605 	snprintf(snap->name, sizeof(snap->name), "%s", snapshot_name);
606 	cb_fn(cb_arg, snap, 0);
607 }
608 
609 void
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)
612 {
613 	struct spdk_lvol *clone;
614 
615 	clone = _lvol_create(lvol->lvol_store);
616 	snprintf(clone->name, sizeof(clone->name), "%s", clone_name);
617 	cb_fn(cb_arg, clone, 0);
618 }
619 
620 static void
621 lvol_store_op_complete(void *cb_arg, int lvserrno)
622 {
623 	g_lvserrno = lvserrno;
624 	return;
625 }
626 
627 static void
628 lvol_store_op_with_handle_complete(void *cb_arg, struct spdk_lvol_store *lvs, int lvserrno)
629 {
630 	g_lvserrno = lvserrno;
631 	g_lvol_store = lvs;
632 	return;
633 }
634 
635 static void
636 vbdev_lvol_create_complete(void *cb_arg, struct spdk_lvol *lvol, int lvolerrno)
637 {
638 	g_lvolerrno = lvolerrno;
639 	g_lvol = lvol;
640 }
641 
642 static void
643 vbdev_lvol_resize_complete(void *cb_arg, int lvolerrno)
644 {
645 	g_lvolerrno = lvolerrno;
646 }
647 
648 static void
649 vbdev_lvol_set_read_only_complete(void *cb_arg, int lvolerrno)
650 {
651 	g_lvolerrno = lvolerrno;
652 }
653 
654 static void
655 vbdev_lvol_rename_complete(void *cb_arg, int lvolerrno)
656 {
657 	g_lvolerrno = lvolerrno;
658 }
659 
660 static void
661 ut_lvs_destroy(void)
662 {
663 	int rc = 0;
664 	int sz = 10;
665 	struct spdk_lvol_store *lvs;
666 
667 	/* Lvol store is successfully created */
668 	rc = vbdev_lvs_create(&g_bdev, "lvs", 0, lvol_store_op_with_handle_complete, NULL);
669 	CU_ASSERT(rc == 0);
670 	CU_ASSERT(g_lvserrno == 0);
671 	SPDK_CU_ASSERT_FATAL(g_lvol_store != NULL);
672 	CU_ASSERT(g_lvol_store->bs_dev != NULL);
673 
674 	lvs = g_lvol_store;
675 	g_lvol_store = NULL;
676 
677 	spdk_uuid_generate(&lvs->uuid);
678 
679 	/* Successfully create lvol, which should be unloaded with lvs later */
680 	g_lvolerrno = -1;
681 	rc = vbdev_lvol_create(lvs, "lvol", sz, false, LVOL_CLEAR_WITH_DEFAULT, vbdev_lvol_create_complete,
682 			       NULL);
683 	CU_ASSERT(rc == 0);
684 	CU_ASSERT(g_lvolerrno == 0);
685 	SPDK_CU_ASSERT_FATAL(g_lvol != NULL);
686 
687 	/* Unload lvol store */
688 	vbdev_lvs_destruct(lvs, lvol_store_op_complete, NULL);
689 	CU_ASSERT(g_lvserrno == 0);
690 	CU_ASSERT(g_lvol_store == NULL);
691 }
692 
693 static void
694 ut_lvol_init(void)
695 {
696 	struct spdk_lvol_store *lvs;
697 	int sz = 10;
698 	int rc;
699 
700 	/* Lvol store is successfully created */
701 	rc = vbdev_lvs_create(&g_bdev, "lvs", 0, lvol_store_op_with_handle_complete, NULL);
702 	CU_ASSERT(rc == 0);
703 	CU_ASSERT(g_lvserrno == 0);
704 	SPDK_CU_ASSERT_FATAL(g_lvol_store != NULL);
705 	CU_ASSERT(g_lvol_store->bs_dev != NULL);
706 	lvs = g_lvol_store;
707 
708 	/* Successful lvol create */
709 	g_lvolerrno = -1;
710 	rc = vbdev_lvol_create(lvs, "lvol", sz, false, LVOL_CLEAR_WITH_DEFAULT, vbdev_lvol_create_complete,
711 			       NULL);
712 	SPDK_CU_ASSERT_FATAL(rc == 0);
713 	CU_ASSERT(g_lvol != NULL);
714 	CU_ASSERT(g_lvolerrno == 0);
715 
716 	/* Successful lvol destroy */
717 	vbdev_lvol_destroy(g_lvol, lvol_store_op_complete, NULL);
718 	CU_ASSERT(g_lvol == NULL);
719 
720 	/* Destroy lvol store */
721 	vbdev_lvs_destruct(lvs, lvol_store_op_complete, NULL);
722 	CU_ASSERT(g_lvserrno == 0);
723 	CU_ASSERT(g_lvol_store == NULL);
724 }
725 
726 static void
727 ut_lvol_snapshot(void)
728 {
729 	struct spdk_lvol_store *lvs;
730 	int sz = 10;
731 	int rc;
732 	struct spdk_lvol *lvol = NULL;
733 
734 	/* Lvol store is successfully created */
735 	rc = vbdev_lvs_create(&g_bdev, "lvs", 0, lvol_store_op_with_handle_complete, NULL);
736 	CU_ASSERT(rc == 0);
737 	CU_ASSERT(g_lvserrno == 0);
738 	SPDK_CU_ASSERT_FATAL(g_lvol_store != NULL);
739 	CU_ASSERT(g_lvol_store->bs_dev != NULL);
740 	lvs = g_lvol_store;
741 
742 	/* Successful lvol create */
743 	g_lvolerrno = -1;
744 	rc = vbdev_lvol_create(lvs, "lvol", sz, false, LVOL_CLEAR_WITH_DEFAULT, vbdev_lvol_create_complete,
745 			       NULL);
746 	SPDK_CU_ASSERT_FATAL(rc == 0);
747 	SPDK_CU_ASSERT_FATAL(g_lvol != NULL);
748 	CU_ASSERT(g_lvolerrno == 0);
749 
750 	lvol = g_lvol;
751 
752 	/* Successful snap create */
753 	vbdev_lvol_create_snapshot(lvol, "snap", vbdev_lvol_create_complete, NULL);
754 	SPDK_CU_ASSERT_FATAL(rc == 0);
755 	CU_ASSERT(g_lvol != NULL);
756 	CU_ASSERT(g_lvolerrno == 0);
757 
758 	/* Successful lvol destroy */
759 	vbdev_lvol_destroy(g_lvol, lvol_store_op_complete, NULL);
760 	CU_ASSERT(g_lvol == NULL);
761 
762 	/* Successful snap destroy */
763 	g_lvol = lvol;
764 	vbdev_lvol_destroy(g_lvol, lvol_store_op_complete, NULL);
765 	CU_ASSERT(g_lvol == NULL);
766 
767 	/* Destroy lvol store */
768 	vbdev_lvs_destruct(lvs, lvol_store_op_complete, NULL);
769 	CU_ASSERT(g_lvserrno == 0);
770 	CU_ASSERT(g_lvol_store == NULL);
771 }
772 
773 static void
774 ut_lvol_clone(void)
775 {
776 	struct spdk_lvol_store *lvs;
777 	int sz = 10;
778 	int rc;
779 	struct spdk_lvol *lvol = NULL;
780 	struct spdk_lvol *snap = NULL;
781 	struct spdk_lvol *clone = NULL;
782 
783 	/* Lvol store is successfully created */
784 	rc = vbdev_lvs_create(&g_bdev, "lvs", 0, lvol_store_op_with_handle_complete, NULL);
785 	CU_ASSERT(rc == 0);
786 	CU_ASSERT(g_lvserrno == 0);
787 	SPDK_CU_ASSERT_FATAL(g_lvol_store != NULL);
788 	CU_ASSERT(g_lvol_store->bs_dev != NULL);
789 	lvs = g_lvol_store;
790 
791 	/* Successful lvol create */
792 	g_lvolerrno = -1;
793 	rc = vbdev_lvol_create(lvs, "lvol", sz, false, LVOL_CLEAR_WITH_DEFAULT, vbdev_lvol_create_complete,
794 			       NULL);
795 	SPDK_CU_ASSERT_FATAL(rc == 0);
796 	SPDK_CU_ASSERT_FATAL(g_lvol != NULL);
797 	CU_ASSERT(g_lvolerrno == 0);
798 
799 	lvol = g_lvol;
800 
801 	/* Successful snap create */
802 	vbdev_lvol_create_snapshot(lvol, "snap", vbdev_lvol_create_complete, NULL);
803 	SPDK_CU_ASSERT_FATAL(rc == 0);
804 	SPDK_CU_ASSERT_FATAL(g_lvol != NULL);
805 	CU_ASSERT(g_lvolerrno == 0);
806 
807 	snap = g_lvol;
808 
809 	/* Successful clone create */
810 	vbdev_lvol_create_clone(snap, "clone", vbdev_lvol_create_complete, NULL);
811 
812 	SPDK_CU_ASSERT_FATAL(rc == 0);
813 	SPDK_CU_ASSERT_FATAL(g_lvol != NULL);
814 	CU_ASSERT(g_lvolerrno == 0);
815 
816 	clone = g_lvol;
817 
818 	/* Successful lvol destroy */
819 	g_lvol = lvol;
820 	vbdev_lvol_destroy(g_lvol, lvol_store_op_complete, NULL);
821 	CU_ASSERT(g_lvol == NULL);
822 
823 	/* Successful clone destroy */
824 	g_lvol = clone;
825 	vbdev_lvol_destroy(g_lvol, lvol_store_op_complete, NULL);
826 	CU_ASSERT(g_lvol == NULL);
827 
828 	/* Successful lvol destroy */
829 	g_lvol = snap;
830 	vbdev_lvol_destroy(g_lvol, lvol_store_op_complete, NULL);
831 	CU_ASSERT(g_lvol == NULL);
832 
833 	/* Destroy lvol store */
834 	vbdev_lvs_destruct(lvs, lvol_store_op_complete, NULL);
835 	CU_ASSERT(g_lvserrno == 0);
836 	CU_ASSERT(g_lvol_store == NULL);
837 }
838 
839 static void
840 ut_lvol_hotremove(void)
841 {
842 	int rc = 0;
843 
844 	lvol_store_initialize_fail = false;
845 	lvol_store_initialize_cb_fail = false;
846 	lvol_already_opened = false;
847 
848 	/* Lvol store is successfully created */
849 	rc = vbdev_lvs_create(&g_bdev, "lvs", 0, lvol_store_op_with_handle_complete, NULL);
850 	CU_ASSERT(rc == 0);
851 	CU_ASSERT(g_lvserrno == 0);
852 	SPDK_CU_ASSERT_FATAL(g_lvol_store != NULL);
853 	CU_ASSERT(g_lvol_store->bs_dev != NULL);
854 
855 	/* Hot remove callback with NULL - stability check */
856 	vbdev_lvs_hotremove_cb(NULL);
857 
858 	/* Hot remove lvs on bdev removal */
859 	vbdev_lvs_hotremove_cb(&g_bdev);
860 
861 	CU_ASSERT(g_lvol_store == NULL);
862 	CU_ASSERT(TAILQ_EMPTY(&g_spdk_lvol_pairs));
863 
864 }
865 
866 static void
867 ut_lvs_examine_check(bool success)
868 {
869 	struct lvol_store_bdev *lvs_bdev;
870 
871 	/* Examine was finished regardless of result */
872 	CU_ASSERT(g_examine_done == true);
873 	g_examine_done = false;
874 
875 	if (success) {
876 		SPDK_CU_ASSERT_FATAL(!TAILQ_EMPTY(&g_spdk_lvol_pairs));
877 		lvs_bdev = TAILQ_FIRST(&g_spdk_lvol_pairs);
878 		SPDK_CU_ASSERT_FATAL(lvs_bdev != NULL);
879 		g_lvol_store = lvs_bdev->lvs;
880 		SPDK_CU_ASSERT_FATAL(g_lvol_store != NULL);
881 		CU_ASSERT(g_lvol_store->bs_dev != NULL);
882 	} else {
883 		SPDK_CU_ASSERT_FATAL(TAILQ_EMPTY(&g_spdk_lvol_pairs));
884 		g_lvol_store = NULL;
885 	}
886 }
887 
888 static void
889 ut_lvol_examine(void)
890 {
891 	/* Examine unsuccessfully - bdev already opened */
892 	g_lvserrno = -1;
893 	lvol_already_opened = true;
894 	vbdev_lvs_examine(&g_bdev);
895 	ut_lvs_examine_check(false);
896 
897 	/* Examine unsuccessfully - fail on lvol store */
898 	g_lvserrno = -1;
899 	lvol_already_opened = false;
900 	vbdev_lvs_examine(&g_bdev);
901 	ut_lvs_examine_check(false);
902 
903 	/* Examine successfully
904 	 * - one lvol fails to load
905 	 * - lvs is loaded with no lvols present */
906 	g_lvserrno = 0;
907 	g_lvolerrno = -1;
908 	g_num_lvols = 1;
909 	lvol_already_opened = false;
910 	g_registered_bdevs = 0;
911 	vbdev_lvs_examine(&g_bdev);
912 	ut_lvs_examine_check(true);
913 	CU_ASSERT(g_registered_bdevs == 0);
914 	CU_ASSERT(TAILQ_EMPTY(&g_lvol_store->lvols));
915 	vbdev_lvs_destruct(g_lvol_store, lvol_store_op_complete, NULL);
916 	CU_ASSERT(g_lvserrno == 0);
917 	CU_ASSERT(g_lvol_store == NULL);
918 
919 	/* Examine successfully */
920 	g_lvserrno = 0;
921 	g_lvolerrno = 0;
922 	g_registered_bdevs = 0;
923 	lvol_already_opened = false;
924 	vbdev_lvs_examine(&g_bdev);
925 	ut_lvs_examine_check(true);
926 	CU_ASSERT(g_registered_bdevs != 0);
927 	SPDK_CU_ASSERT_FATAL(!TAILQ_EMPTY(&g_lvol_store->lvols));
928 	vbdev_lvs_destruct(g_lvol_store, lvol_store_op_complete, NULL);
929 	CU_ASSERT(g_lvserrno == 0);
930 }
931 
932 static void
933 ut_lvol_rename(void)
934 {
935 	struct spdk_lvol_store *lvs;
936 	struct spdk_lvol *lvol;
937 	struct spdk_lvol *lvol2;
938 	int sz = 10;
939 	int rc;
940 
941 	/* Lvol store is successfully created */
942 	rc = vbdev_lvs_create(&g_bdev, "lvs", 0, lvol_store_op_with_handle_complete, NULL);
943 	CU_ASSERT(rc == 0);
944 	CU_ASSERT(g_lvserrno == 0);
945 	SPDK_CU_ASSERT_FATAL(g_lvol_store != NULL);
946 	CU_ASSERT(g_lvol_store->bs_dev != NULL);
947 	lvs = g_lvol_store;
948 
949 	/* Successful lvols create */
950 	g_lvolerrno = -1;
951 	rc = vbdev_lvol_create(lvs, "lvol", sz, false, LVOL_CLEAR_WITH_DEFAULT, vbdev_lvol_create_complete,
952 			       NULL);
953 	SPDK_CU_ASSERT_FATAL(rc == 0);
954 	CU_ASSERT(g_lvol != NULL);
955 	CU_ASSERT(g_lvolerrno == 0);
956 	lvol = g_lvol;
957 
958 	g_lvolerrno = -1;
959 	rc = vbdev_lvol_create(lvs, "lvol2", sz, false, LVOL_CLEAR_WITH_DEFAULT, vbdev_lvol_create_complete,
960 			       NULL);
961 	SPDK_CU_ASSERT_FATAL(rc == 0);
962 	CU_ASSERT(g_lvol != NULL);
963 	CU_ASSERT(g_lvolerrno == 0);
964 	lvol2 = g_lvol;
965 
966 	/* Successful rename lvol */
967 	vbdev_lvol_rename(lvol, "new_lvol_name", vbdev_lvol_rename_complete, NULL);
968 	SPDK_CU_ASSERT_FATAL(g_lvolerrno == 0);
969 	CU_ASSERT_STRING_EQUAL(lvol->name, "new_lvol_name");
970 
971 	/* Renaming lvol with name already existing */
972 	g_bdev_alias_already_exists = true;
973 	vbdev_lvol_rename(lvol2, "new_lvol_name", vbdev_lvol_rename_complete, NULL);
974 	g_bdev_alias_already_exists = false;
975 	SPDK_CU_ASSERT_FATAL(g_lvolerrno != 0);
976 	CU_ASSERT_STRING_NOT_EQUAL(lvol2->name, "new_lvol_name");
977 
978 	/* Renaming lvol with it's own name */
979 	vbdev_lvol_rename(lvol, "new_lvol_name", vbdev_lvol_rename_complete, NULL);
980 	SPDK_CU_ASSERT_FATAL(g_lvolerrno == 0);
981 	CU_ASSERT_STRING_EQUAL(lvol->name, "new_lvol_name");
982 
983 	/* Successful lvols destroy */
984 	vbdev_lvol_destroy(lvol, lvol_store_op_complete, NULL);
985 	CU_ASSERT(g_lvol == NULL);
986 
987 	vbdev_lvol_destroy(lvol2, lvol_store_op_complete, NULL);
988 	CU_ASSERT(g_lvol == NULL);
989 
990 	/* Destroy lvol store */
991 	vbdev_lvs_destruct(lvs, lvol_store_op_complete, NULL);
992 	CU_ASSERT(g_lvserrno == 0);
993 	CU_ASSERT(g_lvol_store == NULL);
994 }
995 
996 static void
997 ut_lvol_destroy(void)
998 {
999 	struct spdk_lvol_store *lvs;
1000 	struct spdk_lvol *lvol;
1001 	struct spdk_lvol *lvol2;
1002 	int sz = 10;
1003 	int rc;
1004 
1005 	/* Lvol store is successfully created */
1006 	rc = vbdev_lvs_create(&g_bdev, "lvs", 0, lvol_store_op_with_handle_complete, NULL);
1007 	CU_ASSERT(rc == 0);
1008 	CU_ASSERT(g_lvserrno == 0);
1009 	SPDK_CU_ASSERT_FATAL(g_lvol_store != NULL);
1010 	CU_ASSERT(g_lvol_store->bs_dev != NULL);
1011 	lvs = g_lvol_store;
1012 
1013 	/* Successful lvols create */
1014 	g_lvolerrno = -1;
1015 	rc = vbdev_lvol_create(lvs, "lvol", sz, false, LVOL_CLEAR_WITH_DEFAULT, vbdev_lvol_create_complete,
1016 			       NULL);
1017 	SPDK_CU_ASSERT_FATAL(rc == 0);
1018 	CU_ASSERT(g_lvol != NULL);
1019 	CU_ASSERT(g_lvolerrno == 0);
1020 	lvol = g_lvol;
1021 
1022 	g_lvolerrno = -1;
1023 	rc = vbdev_lvol_create(lvs, "lvol2", sz, false, LVOL_CLEAR_WITH_DEFAULT, vbdev_lvol_create_complete,
1024 			       NULL);
1025 	SPDK_CU_ASSERT_FATAL(rc == 0);
1026 	CU_ASSERT(g_lvol != NULL);
1027 	CU_ASSERT(g_lvolerrno == 0);
1028 	lvol2 = g_lvol;
1029 
1030 	/* Unsuccessful lvols destroy */
1031 	g_lvol_deletable = false;
1032 	vbdev_lvol_destroy(lvol, lvol_store_op_complete, NULL);
1033 	CU_ASSERT(g_lvol != NULL);
1034 	CU_ASSERT(g_lvserrno == -EPERM);
1035 
1036 	g_lvol_deletable = true;
1037 	/* Successful lvols destroy */
1038 	vbdev_lvol_destroy(lvol, lvol_store_op_complete, NULL);
1039 	CU_ASSERT(g_lvol == NULL);
1040 	CU_ASSERT(g_lvolerrno == 0);
1041 
1042 	/* Hot remove lvol bdev */
1043 	vbdev_lvol_unregister(lvol2);
1044 
1045 	/* Unload lvol store */
1046 	vbdev_lvs_unload(lvs, lvol_store_op_complete, NULL);
1047 	CU_ASSERT(g_lvserrno == 0);
1048 	CU_ASSERT(g_lvol_store == NULL);
1049 }
1050 
1051 static void
1052 ut_lvol_resize(void)
1053 {
1054 	struct spdk_lvol_store *lvs;
1055 	struct spdk_lvol *lvol;
1056 	int sz = 10;
1057 	int rc = 0;
1058 
1059 	/* Lvol store is successfully created */
1060 	rc = vbdev_lvs_create(&g_bdev, "lvs", 0, lvol_store_op_with_handle_complete, NULL);
1061 	CU_ASSERT(rc == 0);
1062 	CU_ASSERT(g_lvserrno == 0);
1063 	SPDK_CU_ASSERT_FATAL(g_lvol_store != NULL);
1064 	CU_ASSERT(g_lvol_store->bs_dev != NULL);
1065 	lvs = g_lvol_store;
1066 
1067 	/* Successful lvol create */
1068 	g_lvolerrno = -1;
1069 	rc = vbdev_lvol_create(lvs, "lvol", sz, false, LVOL_CLEAR_WITH_DEFAULT, vbdev_lvol_create_complete,
1070 			       NULL);
1071 	CU_ASSERT(rc == 0);
1072 	CU_ASSERT(g_lvolerrno == 0);
1073 	SPDK_CU_ASSERT_FATAL(g_lvol != NULL);
1074 	lvol = g_lvol;
1075 
1076 	/* Successful lvol resize */
1077 	g_lvolerrno = -1;
1078 	vbdev_lvol_resize(lvol, 20, vbdev_lvol_resize_complete, NULL);
1079 	CU_ASSERT(g_lvolerrno == 0);
1080 	CU_ASSERT(lvol->bdev->blockcnt == 20 * g_cluster_size / lvol->bdev->blocklen);
1081 
1082 	/* Resize with NULL lvol */
1083 	vbdev_lvol_resize(NULL, 20, vbdev_lvol_resize_complete, NULL);
1084 	CU_ASSERT(g_lvolerrno != 0);
1085 
1086 	/* Successful lvol destroy */
1087 	vbdev_lvol_destroy(lvol, lvol_store_op_complete, NULL);
1088 	CU_ASSERT(g_lvol == NULL);
1089 
1090 	/* Destroy lvol store */
1091 	vbdev_lvs_destruct(lvs, lvol_store_op_complete, NULL);
1092 	CU_ASSERT(g_lvserrno == 0);
1093 	CU_ASSERT(g_lvol_store == NULL);
1094 }
1095 
1096 static void
1097 ut_lvol_set_read_only(void)
1098 {
1099 	struct spdk_lvol_store *lvs;
1100 	struct spdk_lvol *lvol;
1101 	int sz = 10;
1102 	int rc = 0;
1103 
1104 	/* Lvol store is successfully created */
1105 	rc = vbdev_lvs_create(&g_bdev, "lvs", 0, lvol_store_op_with_handle_complete, NULL);
1106 	CU_ASSERT(rc == 0);
1107 	CU_ASSERT(g_lvserrno == 0);
1108 	SPDK_CU_ASSERT_FATAL(g_lvol_store != NULL);
1109 	CU_ASSERT(g_lvol_store->bs_dev != NULL);
1110 	lvs = g_lvol_store;
1111 
1112 	/* Successful lvol create */
1113 	g_lvolerrno = -1;
1114 	rc = vbdev_lvol_create(lvs, "lvol", sz, false, LVOL_CLEAR_WITH_DEFAULT, vbdev_lvol_create_complete,
1115 			       NULL);
1116 	CU_ASSERT(rc == 0);
1117 	CU_ASSERT(g_lvolerrno == 0);
1118 	SPDK_CU_ASSERT_FATAL(g_lvol != NULL);
1119 	lvol = g_lvol;
1120 
1121 	/* Successful set lvol as read only */
1122 	g_lvolerrno = -1;
1123 	vbdev_lvol_set_read_only(lvol, vbdev_lvol_set_read_only_complete, NULL);
1124 	CU_ASSERT(g_lvolerrno == 0);
1125 
1126 	/* Successful lvol destroy */
1127 	vbdev_lvol_destroy(lvol, lvol_store_op_complete, NULL);
1128 	CU_ASSERT(g_lvol == NULL);
1129 
1130 	/* Destroy lvol store */
1131 	vbdev_lvs_destruct(lvs, lvol_store_op_complete, NULL);
1132 	CU_ASSERT(g_lvserrno == 0);
1133 	CU_ASSERT(g_lvol_store == NULL);
1134 }
1135 
1136 static void
1137 ut_lvs_unload(void)
1138 {
1139 	int rc = 0;
1140 	int sz = 10;
1141 	struct spdk_lvol_store *lvs;
1142 
1143 	/* Lvol store is successfully created */
1144 	rc = vbdev_lvs_create(&g_bdev, "lvs", 0, lvol_store_op_with_handle_complete, NULL);
1145 	CU_ASSERT(rc == 0);
1146 	CU_ASSERT(g_lvserrno == 0);
1147 	SPDK_CU_ASSERT_FATAL(g_lvol_store != NULL);
1148 	CU_ASSERT(g_lvol_store->bs_dev != NULL);
1149 
1150 	lvs = g_lvol_store;
1151 	g_lvol_store = NULL;
1152 
1153 	spdk_uuid_generate(&lvs->uuid);
1154 
1155 	/* Successfully create lvol, which should be destroyed with lvs later */
1156 	g_lvolerrno = -1;
1157 	rc = vbdev_lvol_create(lvs, "lvol", sz, false, LVOL_CLEAR_WITH_DEFAULT, vbdev_lvol_create_complete,
1158 			       NULL);
1159 	CU_ASSERT(rc == 0);
1160 	CU_ASSERT(g_lvolerrno == 0);
1161 	SPDK_CU_ASSERT_FATAL(g_lvol != NULL);
1162 
1163 	/* Unload lvol store */
1164 	vbdev_lvs_unload(lvs, lvol_store_op_complete, NULL);
1165 	CU_ASSERT(g_lvserrno == 0);
1166 	CU_ASSERT(g_lvol_store == NULL);
1167 	CU_ASSERT(g_lvol != NULL);
1168 }
1169 
1170 static void
1171 ut_lvs_init(void)
1172 {
1173 	int rc = 0;
1174 	struct spdk_lvol_store *lvs;
1175 
1176 	/* spdk_lvs_init() fails */
1177 	lvol_store_initialize_fail = true;
1178 
1179 	rc = vbdev_lvs_create(&g_bdev, "lvs", 0, lvol_store_op_with_handle_complete, NULL);
1180 	CU_ASSERT(rc != 0);
1181 	CU_ASSERT(g_lvserrno == 0);
1182 	CU_ASSERT(g_lvol_store == NULL);
1183 
1184 	lvol_store_initialize_fail = false;
1185 
1186 	/* spdk_lvs_init_cb() fails */
1187 	lvol_store_initialize_cb_fail = true;
1188 
1189 	rc = vbdev_lvs_create(&g_bdev, "lvs", 0, lvol_store_op_with_handle_complete, NULL);
1190 	CU_ASSERT(rc == 0);
1191 	CU_ASSERT(g_lvserrno != 0);
1192 	CU_ASSERT(g_lvol_store == NULL);
1193 
1194 	lvol_store_initialize_cb_fail = false;
1195 
1196 	/* Lvol store is successfully created */
1197 	rc = vbdev_lvs_create(&g_bdev, "lvs", 0, lvol_store_op_with_handle_complete, NULL);
1198 	CU_ASSERT(rc == 0);
1199 	CU_ASSERT(g_lvserrno == 0);
1200 	SPDK_CU_ASSERT_FATAL(g_lvol_store != NULL);
1201 	CU_ASSERT(g_lvol_store->bs_dev != NULL);
1202 
1203 	lvs = g_lvol_store;
1204 	g_lvol_store = NULL;
1205 
1206 	/* Bdev with lvol store already claimed */
1207 	rc = vbdev_lvs_create(&g_bdev, "lvs", 0, lvol_store_op_with_handle_complete, NULL);
1208 	CU_ASSERT(rc != 0);
1209 	CU_ASSERT(g_lvserrno == 0);
1210 	CU_ASSERT(g_lvol_store == NULL);
1211 
1212 	/* Destruct lvol store */
1213 	vbdev_lvs_destruct(lvs, lvol_store_op_complete, NULL);
1214 	CU_ASSERT(g_lvserrno == 0);
1215 	CU_ASSERT(g_lvol_store == NULL);
1216 }
1217 
1218 static void
1219 ut_vbdev_lvol_get_io_channel(void)
1220 {
1221 	struct spdk_io_channel *ch;
1222 
1223 	g_lvol = calloc(1, sizeof(struct spdk_lvol));
1224 	SPDK_CU_ASSERT_FATAL(g_lvol != NULL);
1225 
1226 	ch = vbdev_lvol_get_io_channel(g_lvol);
1227 	CU_ASSERT(ch == g_ch);
1228 
1229 	free(g_lvol);
1230 }
1231 
1232 static void
1233 ut_vbdev_lvol_io_type_supported(void)
1234 {
1235 	struct spdk_lvol *lvol;
1236 	bool ret;
1237 
1238 	lvol = calloc(1, sizeof(struct spdk_lvol));
1239 	SPDK_CU_ASSERT_FATAL(lvol != NULL);
1240 
1241 	g_blob_is_read_only = false;
1242 
1243 	/* Supported types */
1244 	ret = vbdev_lvol_io_type_supported(lvol, SPDK_BDEV_IO_TYPE_READ);
1245 	CU_ASSERT(ret == true);
1246 	ret = vbdev_lvol_io_type_supported(lvol, SPDK_BDEV_IO_TYPE_WRITE);
1247 	CU_ASSERT(ret == true);
1248 	ret = vbdev_lvol_io_type_supported(lvol, SPDK_BDEV_IO_TYPE_RESET);
1249 	CU_ASSERT(ret == true);
1250 	ret = vbdev_lvol_io_type_supported(lvol, SPDK_BDEV_IO_TYPE_UNMAP);
1251 	CU_ASSERT(ret == true);
1252 	ret = vbdev_lvol_io_type_supported(lvol, SPDK_BDEV_IO_TYPE_WRITE_ZEROES);
1253 	CU_ASSERT(ret == true);
1254 
1255 	/* Unsupported types */
1256 	ret = vbdev_lvol_io_type_supported(lvol, SPDK_BDEV_IO_TYPE_FLUSH);
1257 	CU_ASSERT(ret == false);
1258 	ret = vbdev_lvol_io_type_supported(lvol, SPDK_BDEV_IO_TYPE_NVME_ADMIN);
1259 	CU_ASSERT(ret == false);
1260 	ret = vbdev_lvol_io_type_supported(lvol, SPDK_BDEV_IO_TYPE_NVME_IO);
1261 	CU_ASSERT(ret == false);
1262 
1263 	g_blob_is_read_only = true;
1264 
1265 	/* Supported types */
1266 	ret = vbdev_lvol_io_type_supported(lvol, SPDK_BDEV_IO_TYPE_READ);
1267 	CU_ASSERT(ret == true);
1268 	ret = vbdev_lvol_io_type_supported(lvol, SPDK_BDEV_IO_TYPE_RESET);
1269 	CU_ASSERT(ret == true);
1270 
1271 	/* Unsupported types */
1272 	ret = vbdev_lvol_io_type_supported(lvol, SPDK_BDEV_IO_TYPE_WRITE);
1273 	CU_ASSERT(ret == false);
1274 	ret = vbdev_lvol_io_type_supported(lvol, SPDK_BDEV_IO_TYPE_UNMAP);
1275 	CU_ASSERT(ret == false);
1276 	ret = vbdev_lvol_io_type_supported(lvol, SPDK_BDEV_IO_TYPE_WRITE_ZEROES);
1277 	CU_ASSERT(ret == false);
1278 	ret = vbdev_lvol_io_type_supported(lvol, SPDK_BDEV_IO_TYPE_FLUSH);
1279 	CU_ASSERT(ret == false);
1280 	ret = vbdev_lvol_io_type_supported(lvol, SPDK_BDEV_IO_TYPE_NVME_ADMIN);
1281 	CU_ASSERT(ret == false);
1282 	ret = vbdev_lvol_io_type_supported(lvol, SPDK_BDEV_IO_TYPE_NVME_IO);
1283 	CU_ASSERT(ret == false);
1284 
1285 	free(lvol);
1286 }
1287 
1288 static void
1289 ut_lvol_read_write(void)
1290 {
1291 	g_io = calloc(1, sizeof(struct spdk_bdev_io) + sizeof(struct lvol_task));
1292 	SPDK_CU_ASSERT_FATAL(g_io != NULL);
1293 	g_base_bdev = calloc(1, sizeof(struct spdk_bdev));
1294 	SPDK_CU_ASSERT_FATAL(g_base_bdev != NULL);
1295 	g_lvol = calloc(1, sizeof(struct spdk_lvol));
1296 	SPDK_CU_ASSERT_FATAL(g_lvol != NULL);
1297 
1298 	g_task = (struct lvol_task *)g_io->driver_ctx;
1299 	g_io->bdev = g_base_bdev;
1300 	g_io->bdev->ctxt = g_lvol;
1301 	g_io->u.bdev.offset_blocks = 20;
1302 	g_io->u.bdev.num_blocks = 20;
1303 
1304 	lvol_read(g_ch, g_io);
1305 	CU_ASSERT(g_task->status == SPDK_BDEV_IO_STATUS_SUCCESS);
1306 
1307 	lvol_write(g_lvol, g_ch, g_io);
1308 	CU_ASSERT(g_task->status == SPDK_BDEV_IO_STATUS_SUCCESS);
1309 
1310 	free(g_io);
1311 	free(g_base_bdev);
1312 	free(g_lvol);
1313 }
1314 
1315 static void
1316 ut_vbdev_lvol_submit_request(void)
1317 {
1318 	struct spdk_lvol request_lvol = {};
1319 	g_io = calloc(1, sizeof(struct spdk_bdev_io) + sizeof(struct lvol_task));
1320 	SPDK_CU_ASSERT_FATAL(g_io != NULL);
1321 	g_base_bdev = calloc(1, sizeof(struct spdk_bdev));
1322 	SPDK_CU_ASSERT_FATAL(g_base_bdev != NULL);
1323 	g_task = (struct lvol_task *)g_io->driver_ctx;
1324 	g_io->bdev = g_base_bdev;
1325 
1326 	g_io->type = SPDK_BDEV_IO_TYPE_READ;
1327 	g_base_bdev->ctxt = &request_lvol;
1328 	vbdev_lvol_submit_request(g_ch, g_io);
1329 
1330 	free(g_io);
1331 	free(g_base_bdev);
1332 }
1333 
1334 static void
1335 ut_lvs_rename(void)
1336 {
1337 	int rc = 0;
1338 	int sz = 10;
1339 	struct spdk_lvol_store *lvs;
1340 
1341 	/* Lvol store is successfully created */
1342 	rc = vbdev_lvs_create(&g_bdev, "old_lvs_name", 0, lvol_store_op_with_handle_complete, NULL);
1343 	CU_ASSERT(rc == 0);
1344 	CU_ASSERT(g_lvserrno == 0);
1345 	SPDK_CU_ASSERT_FATAL(g_lvol_store != NULL);
1346 	CU_ASSERT(g_lvol_store->bs_dev != NULL);
1347 
1348 	lvs = g_lvol_store;
1349 	g_lvol_store = NULL;
1350 
1351 	g_base_bdev = calloc(1, sizeof(*g_base_bdev));
1352 	SPDK_CU_ASSERT_FATAL(g_base_bdev != NULL);
1353 
1354 	/* Successfully create lvol, which should be destroyed with lvs later */
1355 	g_lvolerrno = -1;
1356 	rc = vbdev_lvol_create(lvs, "lvol", sz, false, LVOL_CLEAR_WITH_DEFAULT, vbdev_lvol_create_complete,
1357 			       NULL);
1358 	CU_ASSERT(rc == 0);
1359 	CU_ASSERT(g_lvolerrno == 0);
1360 	SPDK_CU_ASSERT_FATAL(g_lvol != NULL);
1361 
1362 	/* Trying to rename lvs with lvols created */
1363 	vbdev_lvs_rename(lvs, "new_lvs_name", lvol_store_op_complete, NULL);
1364 	CU_ASSERT(g_lvserrno == 0);
1365 	CU_ASSERT_STRING_EQUAL(lvs->name, "new_lvs_name");
1366 	CU_ASSERT_STRING_EQUAL(TAILQ_FIRST(&g_lvol->bdev->aliases)->alias, "new_lvs_name/lvol");
1367 
1368 	/* Trying to rename lvs with name already used by another lvs */
1369 	/* This is a bdev_lvol test, so g_lvs_with_name_already_exists simulates
1370 	 * existing lvs with name 'another_new_lvs_name' and this name in fact is not compared */
1371 	g_lvs_with_name_already_exists = true;
1372 	vbdev_lvs_rename(lvs, "another_new_lvs_name", lvol_store_op_complete, NULL);
1373 	CU_ASSERT(g_lvserrno == -EEXIST);
1374 	CU_ASSERT_STRING_EQUAL(lvs->name, "new_lvs_name");
1375 	CU_ASSERT_STRING_EQUAL(TAILQ_FIRST(&g_lvol->bdev->aliases)->alias, "new_lvs_name/lvol");
1376 	g_lvs_with_name_already_exists = false;
1377 
1378 	/* Unload lvol store */
1379 	g_lvol_store = lvs;
1380 	vbdev_lvs_destruct(g_lvol_store, lvol_store_op_complete, NULL);
1381 	CU_ASSERT(g_lvserrno == 0);
1382 	CU_ASSERT(g_lvol_store == NULL);
1383 
1384 	free(g_base_bdev->name);
1385 	free(g_base_bdev);
1386 }
1387 
1388 int main(int argc, char **argv)
1389 {
1390 	CU_pSuite	suite = NULL;
1391 	unsigned int	num_failures;
1392 
1393 	if (CU_initialize_registry() != CUE_SUCCESS) {
1394 		return CU_get_error();
1395 	}
1396 
1397 	suite = CU_add_suite("lvol", NULL, NULL);
1398 	if (suite == NULL) {
1399 		CU_cleanup_registry();
1400 		return CU_get_error();
1401 	}
1402 
1403 	if (
1404 		CU_add_test(suite, "ut_lvs_init", ut_lvs_init) == NULL ||
1405 		CU_add_test(suite, "ut_lvol_init", ut_lvol_init) == NULL ||
1406 		CU_add_test(suite, "ut_lvol_snapshot", ut_lvol_snapshot) == NULL ||
1407 		CU_add_test(suite, "ut_lvol_clone", ut_lvol_clone) == NULL ||
1408 		CU_add_test(suite, "ut_lvs_destroy", ut_lvs_destroy) == NULL ||
1409 		CU_add_test(suite, "ut_lvs_unload", ut_lvs_unload) == NULL ||
1410 		CU_add_test(suite, "ut_lvol_resize", ut_lvol_resize) == NULL ||
1411 		CU_add_test(suite, "ut_lvol_set_read_only", ut_lvol_set_read_only) == NULL ||
1412 		CU_add_test(suite, "lvol_hotremove", ut_lvol_hotremove) == NULL ||
1413 		CU_add_test(suite, "ut_vbdev_lvol_get_io_channel", ut_vbdev_lvol_get_io_channel) == NULL ||
1414 		CU_add_test(suite, "ut_vbdev_lvol_io_type_supported", ut_vbdev_lvol_io_type_supported) == NULL ||
1415 		CU_add_test(suite, "ut_lvol_read_write", ut_lvol_read_write) == NULL ||
1416 		CU_add_test(suite, "ut_vbdev_lvol_submit_request", ut_vbdev_lvol_submit_request) == NULL ||
1417 		CU_add_test(suite, "lvol_examine", ut_lvol_examine) == NULL ||
1418 		CU_add_test(suite, "ut_lvol_rename", ut_lvol_rename) == NULL ||
1419 		CU_add_test(suite, "ut_lvol_destroy", ut_lvol_destroy) == NULL ||
1420 		CU_add_test(suite, "ut_lvs_rename", ut_lvs_rename) == NULL
1421 	) {
1422 		CU_cleanup_registry();
1423 		return CU_get_error();
1424 	}
1425 
1426 	CU_basic_set_mode(CU_BRM_VERBOSE);
1427 	CU_basic_run_tests();
1428 	num_failures = CU_get_number_of_failures();
1429 	CU_cleanup_registry();
1430 	return num_failures;
1431 }
1432