]> git.proxmox.com Git - ceph.git/blob - ceph/src/spdk/test/unit/lib/bdev/vbdev_lvol.c/vbdev_lvol_ut.c
import 15.2.0 Octopus source
[ceph.git] / ceph / src / spdk / test / unit / lib / bdev / vbdev_lvol.c / vbdev_lvol_ut.c
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_get_buf_cb);
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_bdev_register(struct spdk_bdev *vbdev)
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, LVS_CLEAR_WITH_UNMAP, lvol_store_op_with_handle_complete,
669 NULL);
670 CU_ASSERT(rc == 0);
671 CU_ASSERT(g_lvserrno == 0);
672 SPDK_CU_ASSERT_FATAL(g_lvol_store != NULL);
673 CU_ASSERT(g_lvol_store->bs_dev != NULL);
674
675 lvs = g_lvol_store;
676 g_lvol_store = NULL;
677
678 spdk_uuid_generate(&lvs->uuid);
679
680 /* Successfully create lvol, which should be unloaded with lvs later */
681 g_lvolerrno = -1;
682 rc = vbdev_lvol_create(lvs, "lvol", sz, false, LVOL_CLEAR_WITH_DEFAULT, vbdev_lvol_create_complete,
683 NULL);
684 CU_ASSERT(rc == 0);
685 CU_ASSERT(g_lvolerrno == 0);
686 SPDK_CU_ASSERT_FATAL(g_lvol != NULL);
687
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);
692 }
693
694 static void
695 ut_lvol_init(void)
696 {
697 struct spdk_lvol_store *lvs;
698 int sz = 10;
699 int rc;
700
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,
703 NULL);
704 CU_ASSERT(rc == 0);
705 CU_ASSERT(g_lvserrno == 0);
706 SPDK_CU_ASSERT_FATAL(g_lvol_store != NULL);
707 CU_ASSERT(g_lvol_store->bs_dev != NULL);
708 lvs = g_lvol_store;
709
710 /* Successful lvol create */
711 g_lvolerrno = -1;
712 rc = vbdev_lvol_create(lvs, "lvol", sz, false, LVOL_CLEAR_WITH_DEFAULT, vbdev_lvol_create_complete,
713 NULL);
714 SPDK_CU_ASSERT_FATAL(rc == 0);
715 CU_ASSERT(g_lvol != NULL);
716 CU_ASSERT(g_lvolerrno == 0);
717
718 /* Successful lvol destroy */
719 vbdev_lvol_destroy(g_lvol, lvol_store_op_complete, NULL);
720 CU_ASSERT(g_lvol == NULL);
721
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);
726 }
727
728 static void
729 ut_lvol_snapshot(void)
730 {
731 struct spdk_lvol_store *lvs;
732 int sz = 10;
733 int rc;
734 struct spdk_lvol *lvol = NULL;
735
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,
738 NULL);
739 CU_ASSERT(rc == 0);
740 CU_ASSERT(g_lvserrno == 0);
741 SPDK_CU_ASSERT_FATAL(g_lvol_store != NULL);
742 CU_ASSERT(g_lvol_store->bs_dev != NULL);
743 lvs = g_lvol_store;
744
745 /* Successful lvol create */
746 g_lvolerrno = -1;
747 rc = vbdev_lvol_create(lvs, "lvol", sz, false, LVOL_CLEAR_WITH_DEFAULT, vbdev_lvol_create_complete,
748 NULL);
749 SPDK_CU_ASSERT_FATAL(rc == 0);
750 SPDK_CU_ASSERT_FATAL(g_lvol != NULL);
751 CU_ASSERT(g_lvolerrno == 0);
752
753 lvol = g_lvol;
754
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);
760
761 /* Successful lvol destroy */
762 vbdev_lvol_destroy(g_lvol, lvol_store_op_complete, NULL);
763 CU_ASSERT(g_lvol == NULL);
764
765 /* Successful snap destroy */
766 g_lvol = lvol;
767 vbdev_lvol_destroy(g_lvol, lvol_store_op_complete, NULL);
768 CU_ASSERT(g_lvol == NULL);
769
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);
774 }
775
776 static void
777 ut_lvol_clone(void)
778 {
779 struct spdk_lvol_store *lvs;
780 int sz = 10;
781 int rc;
782 struct spdk_lvol *lvol = NULL;
783 struct spdk_lvol *snap = NULL;
784 struct spdk_lvol *clone = NULL;
785
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,
788 NULL);
789 CU_ASSERT(rc == 0);
790 CU_ASSERT(g_lvserrno == 0);
791 SPDK_CU_ASSERT_FATAL(g_lvol_store != NULL);
792 CU_ASSERT(g_lvol_store->bs_dev != NULL);
793 lvs = g_lvol_store;
794
795 /* Successful lvol create */
796 g_lvolerrno = -1;
797 rc = vbdev_lvol_create(lvs, "lvol", sz, false, LVOL_CLEAR_WITH_DEFAULT, vbdev_lvol_create_complete,
798 NULL);
799 SPDK_CU_ASSERT_FATAL(rc == 0);
800 SPDK_CU_ASSERT_FATAL(g_lvol != NULL);
801 CU_ASSERT(g_lvolerrno == 0);
802
803 lvol = g_lvol;
804
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);
810
811 snap = g_lvol;
812
813 /* Successful clone create */
814 vbdev_lvol_create_clone(snap, "clone", vbdev_lvol_create_complete, NULL);
815
816 SPDK_CU_ASSERT_FATAL(rc == 0);
817 SPDK_CU_ASSERT_FATAL(g_lvol != NULL);
818 CU_ASSERT(g_lvolerrno == 0);
819
820 clone = g_lvol;
821
822 /* Successful lvol destroy */
823 g_lvol = lvol;
824 vbdev_lvol_destroy(g_lvol, lvol_store_op_complete, NULL);
825 CU_ASSERT(g_lvol == NULL);
826
827 /* Successful clone destroy */
828 g_lvol = clone;
829 vbdev_lvol_destroy(g_lvol, lvol_store_op_complete, NULL);
830 CU_ASSERT(g_lvol == NULL);
831
832 /* Successful lvol destroy */
833 g_lvol = snap;
834 vbdev_lvol_destroy(g_lvol, lvol_store_op_complete, NULL);
835 CU_ASSERT(g_lvol == NULL);
836
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);
841 }
842
843 static void
844 ut_lvol_hotremove(void)
845 {
846 int rc = 0;
847
848 lvol_store_initialize_fail = false;
849 lvol_store_initialize_cb_fail = false;
850 lvol_already_opened = false;
851
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,
854 NULL);
855 CU_ASSERT(rc == 0);
856 CU_ASSERT(g_lvserrno == 0);
857 SPDK_CU_ASSERT_FATAL(g_lvol_store != NULL);
858 CU_ASSERT(g_lvol_store->bs_dev != NULL);
859
860 /* Hot remove callback with NULL - stability check */
861 vbdev_lvs_hotremove_cb(NULL);
862
863 /* Hot remove lvs on bdev removal */
864 vbdev_lvs_hotremove_cb(&g_bdev);
865
866 CU_ASSERT(g_lvol_store == NULL);
867 CU_ASSERT(TAILQ_EMPTY(&g_spdk_lvol_pairs));
868
869 }
870
871 static void
872 ut_lvs_examine_check(bool success)
873 {
874 struct lvol_store_bdev *lvs_bdev;
875
876 /* Examine was finished regardless of result */
877 CU_ASSERT(g_examine_done == true);
878 g_examine_done = false;
879
880 if (success) {
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);
887 } else {
888 SPDK_CU_ASSERT_FATAL(TAILQ_EMPTY(&g_spdk_lvol_pairs));
889 g_lvol_store = NULL;
890 }
891 }
892
893 static void
894 ut_lvol_examine(void)
895 {
896 /* Examine unsuccessfully - bdev already opened */
897 g_lvserrno = -1;
898 lvol_already_opened = true;
899 vbdev_lvs_examine(&g_bdev);
900 ut_lvs_examine_check(false);
901
902 /* Examine unsuccessfully - fail on lvol store */
903 g_lvserrno = -1;
904 lvol_already_opened = false;
905 vbdev_lvs_examine(&g_bdev);
906 ut_lvs_examine_check(false);
907
908 /* Examine successfully
909 * - one lvol fails to load
910 * - lvs is loaded with no lvols present */
911 g_lvserrno = 0;
912 g_lvolerrno = -1;
913 g_num_lvols = 1;
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);
923
924 /* Examine successfully */
925 g_lvserrno = 0;
926 g_lvolerrno = 0;
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);
935 }
936
937 static void
938 ut_lvol_rename(void)
939 {
940 struct spdk_lvol_store *lvs;
941 struct spdk_lvol *lvol;
942 struct spdk_lvol *lvol2;
943 int sz = 10;
944 int rc;
945
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,
948 NULL);
949 CU_ASSERT(rc == 0);
950 CU_ASSERT(g_lvserrno == 0);
951 SPDK_CU_ASSERT_FATAL(g_lvol_store != NULL);
952 CU_ASSERT(g_lvol_store->bs_dev != NULL);
953 lvs = g_lvol_store;
954
955 /* Successful lvols create */
956 g_lvolerrno = -1;
957 rc = vbdev_lvol_create(lvs, "lvol", sz, false, LVOL_CLEAR_WITH_DEFAULT, vbdev_lvol_create_complete,
958 NULL);
959 SPDK_CU_ASSERT_FATAL(rc == 0);
960 CU_ASSERT(g_lvol != NULL);
961 CU_ASSERT(g_lvolerrno == 0);
962 lvol = g_lvol;
963
964 g_lvolerrno = -1;
965 rc = vbdev_lvol_create(lvs, "lvol2", sz, false, LVOL_CLEAR_WITH_DEFAULT, vbdev_lvol_create_complete,
966 NULL);
967 SPDK_CU_ASSERT_FATAL(rc == 0);
968 CU_ASSERT(g_lvol != NULL);
969 CU_ASSERT(g_lvolerrno == 0);
970 lvol2 = g_lvol;
971
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");
976
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");
983
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");
988
989 /* Successful lvols destroy */
990 vbdev_lvol_destroy(lvol, lvol_store_op_complete, NULL);
991 CU_ASSERT(g_lvol == NULL);
992
993 vbdev_lvol_destroy(lvol2, lvol_store_op_complete, NULL);
994 CU_ASSERT(g_lvol == NULL);
995
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);
1000 }
1001
1002 static void
1003 ut_lvol_destroy(void)
1004 {
1005 struct spdk_lvol_store *lvs;
1006 struct spdk_lvol *lvol;
1007 struct spdk_lvol *lvol2;
1008 int sz = 10;
1009 int rc;
1010
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,
1013 NULL);
1014 CU_ASSERT(rc == 0);
1015 CU_ASSERT(g_lvserrno == 0);
1016 SPDK_CU_ASSERT_FATAL(g_lvol_store != NULL);
1017 CU_ASSERT(g_lvol_store->bs_dev != NULL);
1018 lvs = g_lvol_store;
1019
1020 /* Successful lvols create */
1021 g_lvolerrno = -1;
1022 rc = vbdev_lvol_create(lvs, "lvol", sz, false, LVOL_CLEAR_WITH_DEFAULT, vbdev_lvol_create_complete,
1023 NULL);
1024 SPDK_CU_ASSERT_FATAL(rc == 0);
1025 CU_ASSERT(g_lvol != NULL);
1026 CU_ASSERT(g_lvolerrno == 0);
1027 lvol = g_lvol;
1028
1029 g_lvolerrno = -1;
1030 rc = vbdev_lvol_create(lvs, "lvol2", sz, false, LVOL_CLEAR_WITH_DEFAULT, vbdev_lvol_create_complete,
1031 NULL);
1032 SPDK_CU_ASSERT_FATAL(rc == 0);
1033 CU_ASSERT(g_lvol != NULL);
1034 CU_ASSERT(g_lvolerrno == 0);
1035 lvol2 = g_lvol;
1036
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);
1042
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);
1048
1049 /* Hot remove lvol bdev */
1050 vbdev_lvol_unregister(lvol2);
1051
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);
1056 }
1057
1058 static void
1059 ut_lvol_resize(void)
1060 {
1061 struct spdk_lvol_store *lvs;
1062 struct spdk_lvol *lvol;
1063 int sz = 10;
1064 int rc = 0;
1065
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,
1068 NULL);
1069 CU_ASSERT(rc == 0);
1070 CU_ASSERT(g_lvserrno == 0);
1071 SPDK_CU_ASSERT_FATAL(g_lvol_store != NULL);
1072 CU_ASSERT(g_lvol_store->bs_dev != NULL);
1073 lvs = g_lvol_store;
1074
1075 /* Successful lvol create */
1076 g_lvolerrno = -1;
1077 rc = vbdev_lvol_create(lvs, "lvol", sz, false, LVOL_CLEAR_WITH_DEFAULT, vbdev_lvol_create_complete,
1078 NULL);
1079 CU_ASSERT(rc == 0);
1080 CU_ASSERT(g_lvolerrno == 0);
1081 SPDK_CU_ASSERT_FATAL(g_lvol != NULL);
1082 lvol = g_lvol;
1083
1084 /* Successful lvol resize */
1085 g_lvolerrno = -1;
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);
1089
1090 /* Resize with NULL lvol */
1091 vbdev_lvol_resize(NULL, 20, vbdev_lvol_resize_complete, NULL);
1092 CU_ASSERT(g_lvolerrno != 0);
1093
1094 /* Successful lvol destroy */
1095 vbdev_lvol_destroy(lvol, lvol_store_op_complete, NULL);
1096 CU_ASSERT(g_lvol == NULL);
1097
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);
1102 }
1103
1104 static void
1105 ut_lvol_set_read_only(void)
1106 {
1107 struct spdk_lvol_store *lvs;
1108 struct spdk_lvol *lvol;
1109 int sz = 10;
1110 int rc = 0;
1111
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,
1114 NULL);
1115 CU_ASSERT(rc == 0);
1116 CU_ASSERT(g_lvserrno == 0);
1117 SPDK_CU_ASSERT_FATAL(g_lvol_store != NULL);
1118 CU_ASSERT(g_lvol_store->bs_dev != NULL);
1119 lvs = g_lvol_store;
1120
1121 /* Successful lvol create */
1122 g_lvolerrno = -1;
1123 rc = vbdev_lvol_create(lvs, "lvol", sz, false, LVOL_CLEAR_WITH_DEFAULT, vbdev_lvol_create_complete,
1124 NULL);
1125 CU_ASSERT(rc == 0);
1126 CU_ASSERT(g_lvolerrno == 0);
1127 SPDK_CU_ASSERT_FATAL(g_lvol != NULL);
1128 lvol = g_lvol;
1129
1130 /* Successful set lvol as read only */
1131 g_lvolerrno = -1;
1132 vbdev_lvol_set_read_only(lvol, vbdev_lvol_set_read_only_complete, NULL);
1133 CU_ASSERT(g_lvolerrno == 0);
1134
1135 /* Successful lvol destroy */
1136 vbdev_lvol_destroy(lvol, lvol_store_op_complete, NULL);
1137 CU_ASSERT(g_lvol == NULL);
1138
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);
1143 }
1144
1145 static void
1146 ut_lvs_unload(void)
1147 {
1148 int rc = 0;
1149 int sz = 10;
1150 struct spdk_lvol_store *lvs;
1151
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,
1154 NULL);
1155 CU_ASSERT(rc == 0);
1156 CU_ASSERT(g_lvserrno == 0);
1157 SPDK_CU_ASSERT_FATAL(g_lvol_store != NULL);
1158 CU_ASSERT(g_lvol_store->bs_dev != NULL);
1159
1160 lvs = g_lvol_store;
1161 g_lvol_store = NULL;
1162
1163 spdk_uuid_generate(&lvs->uuid);
1164
1165 /* Successfully create lvol, which should be destroyed with lvs later */
1166 g_lvolerrno = -1;
1167 rc = vbdev_lvol_create(lvs, "lvol", sz, false, LVOL_CLEAR_WITH_DEFAULT, vbdev_lvol_create_complete,
1168 NULL);
1169 CU_ASSERT(rc == 0);
1170 CU_ASSERT(g_lvolerrno == 0);
1171 SPDK_CU_ASSERT_FATAL(g_lvol != NULL);
1172
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);
1178 }
1179
1180 static void
1181 ut_lvs_init(void)
1182 {
1183 int rc = 0;
1184 struct spdk_lvol_store *lvs;
1185
1186 /* spdk_lvs_init() fails */
1187 lvol_store_initialize_fail = true;
1188
1189 rc = vbdev_lvs_create(&g_bdev, "lvs", 0, LVS_CLEAR_WITH_UNMAP, lvol_store_op_with_handle_complete,
1190 NULL);
1191 CU_ASSERT(rc != 0);
1192 CU_ASSERT(g_lvserrno == 0);
1193 CU_ASSERT(g_lvol_store == NULL);
1194
1195 lvol_store_initialize_fail = false;
1196
1197 /* spdk_lvs_init_cb() fails */
1198 lvol_store_initialize_cb_fail = true;
1199
1200 rc = vbdev_lvs_create(&g_bdev, "lvs", 0, LVS_CLEAR_WITH_UNMAP, lvol_store_op_with_handle_complete,
1201 NULL);
1202 CU_ASSERT(rc == 0);
1203 CU_ASSERT(g_lvserrno != 0);
1204 CU_ASSERT(g_lvol_store == NULL);
1205
1206 lvol_store_initialize_cb_fail = false;
1207
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,
1210 NULL);
1211 CU_ASSERT(rc == 0);
1212 CU_ASSERT(g_lvserrno == 0);
1213 SPDK_CU_ASSERT_FATAL(g_lvol_store != NULL);
1214 CU_ASSERT(g_lvol_store->bs_dev != NULL);
1215
1216 lvs = g_lvol_store;
1217 g_lvol_store = NULL;
1218
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,
1221 NULL);
1222 CU_ASSERT(rc != 0);
1223 CU_ASSERT(g_lvserrno == 0);
1224 CU_ASSERT(g_lvol_store == NULL);
1225
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);
1230 }
1231
1232 static void
1233 ut_vbdev_lvol_get_io_channel(void)
1234 {
1235 struct spdk_io_channel *ch;
1236
1237 g_lvol = calloc(1, sizeof(struct spdk_lvol));
1238 SPDK_CU_ASSERT_FATAL(g_lvol != NULL);
1239
1240 ch = vbdev_lvol_get_io_channel(g_lvol);
1241 CU_ASSERT(ch == g_ch);
1242
1243 free(g_lvol);
1244 }
1245
1246 static void
1247 ut_vbdev_lvol_io_type_supported(void)
1248 {
1249 struct spdk_lvol *lvol;
1250 bool ret;
1251
1252 lvol = calloc(1, sizeof(struct spdk_lvol));
1253 SPDK_CU_ASSERT_FATAL(lvol != NULL);
1254
1255 g_blob_is_read_only = false;
1256
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);
1268
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);
1276
1277 g_blob_is_read_only = true;
1278
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);
1284
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);
1298
1299 free(lvol);
1300 }
1301
1302 static void
1303 ut_lvol_read_write(void)
1304 {
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);
1311
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;
1317
1318 lvol_read(g_ch, g_io);
1319 CU_ASSERT(g_task->status == SPDK_BDEV_IO_STATUS_SUCCESS);
1320
1321 lvol_write(g_lvol, g_ch, g_io);
1322 CU_ASSERT(g_task->status == SPDK_BDEV_IO_STATUS_SUCCESS);
1323
1324 free(g_io);
1325 free(g_base_bdev);
1326 free(g_lvol);
1327 }
1328
1329 static void
1330 ut_vbdev_lvol_submit_request(void)
1331 {
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;
1339
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);
1343
1344 free(g_io);
1345 free(g_base_bdev);
1346 }
1347
1348 static void
1349 ut_lvs_rename(void)
1350 {
1351 int rc = 0;
1352 int sz = 10;
1353 struct spdk_lvol_store *lvs;
1354
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);
1358 CU_ASSERT(rc == 0);
1359 CU_ASSERT(g_lvserrno == 0);
1360 SPDK_CU_ASSERT_FATAL(g_lvol_store != NULL);
1361 CU_ASSERT(g_lvol_store->bs_dev != NULL);
1362
1363 lvs = g_lvol_store;
1364 g_lvol_store = NULL;
1365
1366 g_base_bdev = calloc(1, sizeof(*g_base_bdev));
1367 SPDK_CU_ASSERT_FATAL(g_base_bdev != NULL);
1368
1369 /* Successfully create lvol, which should be destroyed with lvs later */
1370 g_lvolerrno = -1;
1371 rc = vbdev_lvol_create(lvs, "lvol", sz, false, LVOL_CLEAR_WITH_DEFAULT, vbdev_lvol_create_complete,
1372 NULL);
1373 CU_ASSERT(rc == 0);
1374 CU_ASSERT(g_lvolerrno == 0);
1375 SPDK_CU_ASSERT_FATAL(g_lvol != NULL);
1376
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");
1382
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;
1392
1393 /* Unload lvol store */
1394 g_lvol_store = lvs;
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);
1398
1399 free(g_base_bdev->name);
1400 free(g_base_bdev);
1401 }
1402
1403 int main(int argc, char **argv)
1404 {
1405 CU_pSuite suite = NULL;
1406 unsigned int num_failures;
1407
1408 if (CU_initialize_registry() != CUE_SUCCESS) {
1409 return CU_get_error();
1410 }
1411
1412 suite = CU_add_suite("lvol", NULL, NULL);
1413 if (suite == NULL) {
1414 CU_cleanup_registry();
1415 return CU_get_error();
1416 }
1417
1418 if (
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
1436 ) {
1437 CU_cleanup_registry();
1438 return CU_get_error();
1439 }
1440
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;
1446 }