xref: /spdk/test/unit/lib/bdev/bdev.c/bdev_ut.c (revision 7ed0ec6832d9a5cf49bdc35f8e9c00fa80a5f67b)
1 /*-
2  *   BSD LICENSE
3  *
4  *   Copyright (c) Intel Corporation. All rights reserved.
5  *   Copyright (c) 2019 Mellanox Technologies LTD. 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 
36 #include "common/lib/ut_multithread.c"
37 #include "unit/lib/json_mock.c"
38 
39 #include "spdk/config.h"
40 /* HACK: disable VTune integration so the unit test doesn't need VTune headers and libs to build */
41 #undef SPDK_CONFIG_VTUNE
42 
43 #include "bdev/bdev.c"
44 
45 DEFINE_STUB(spdk_conf_find_section, struct spdk_conf_section *, (struct spdk_conf *cp,
46 		const char *name), NULL);
47 DEFINE_STUB(spdk_conf_section_get_nmval, char *,
48 	    (struct spdk_conf_section *sp, const char *key, int idx1, int idx2), NULL);
49 DEFINE_STUB(spdk_conf_section_get_intval, int, (struct spdk_conf_section *sp, const char *key), -1);
50 
51 struct spdk_trace_histories *g_trace_histories;
52 DEFINE_STUB_V(spdk_trace_add_register_fn, (struct spdk_trace_register_fn *reg_fn));
53 DEFINE_STUB_V(spdk_trace_register_owner, (uint8_t type, char id_prefix));
54 DEFINE_STUB_V(spdk_trace_register_object, (uint8_t type, char id_prefix));
55 DEFINE_STUB_V(spdk_trace_register_description, (const char *name,
56 		uint16_t tpoint_id, uint8_t owner_type,
57 		uint8_t object_type, uint8_t new_object,
58 		uint8_t arg1_type, const char *arg1_name));
59 DEFINE_STUB_V(_spdk_trace_record, (uint64_t tsc, uint16_t tpoint_id, uint16_t poller_id,
60 				   uint32_t size, uint64_t object_id, uint64_t arg1));
61 DEFINE_STUB(spdk_notify_send, uint64_t, (const char *type, const char *ctx), 0);
62 DEFINE_STUB(spdk_notify_type_register, struct spdk_notify_type *, (const char *type), NULL);
63 
64 
65 int g_status;
66 int g_count;
67 enum spdk_bdev_event_type g_event_type1;
68 enum spdk_bdev_event_type g_event_type2;
69 struct spdk_histogram_data *g_histogram;
70 void *g_unregister_arg;
71 int g_unregister_rc;
72 
73 void
74 spdk_scsi_nvme_translate(const struct spdk_bdev_io *bdev_io,
75 			 int *sc, int *sk, int *asc, int *ascq)
76 {
77 }
78 
79 static int
80 null_init(void)
81 {
82 	return 0;
83 }
84 
85 static int
86 null_clean(void)
87 {
88 	return 0;
89 }
90 
91 static int
92 stub_destruct(void *ctx)
93 {
94 	return 0;
95 }
96 
97 struct ut_expected_io {
98 	uint8_t				type;
99 	uint64_t			offset;
100 	uint64_t			length;
101 	int				iovcnt;
102 	struct iovec			iov[BDEV_IO_NUM_CHILD_IOV];
103 	void				*md_buf;
104 	TAILQ_ENTRY(ut_expected_io)	link;
105 };
106 
107 struct bdev_ut_channel {
108 	TAILQ_HEAD(, spdk_bdev_io)	outstanding_io;
109 	uint32_t			outstanding_io_count;
110 	TAILQ_HEAD(, ut_expected_io)	expected_io;
111 };
112 
113 static bool g_io_done;
114 static struct spdk_bdev_io *g_bdev_io;
115 static enum spdk_bdev_io_status g_io_status;
116 static enum spdk_bdev_io_status g_io_exp_status = SPDK_BDEV_IO_STATUS_SUCCESS;
117 static uint32_t g_bdev_ut_io_device;
118 static struct bdev_ut_channel *g_bdev_ut_channel;
119 
120 static struct ut_expected_io *
121 ut_alloc_expected_io(uint8_t type, uint64_t offset, uint64_t length, int iovcnt)
122 {
123 	struct ut_expected_io *expected_io;
124 
125 	expected_io = calloc(1, sizeof(*expected_io));
126 	SPDK_CU_ASSERT_FATAL(expected_io != NULL);
127 
128 	expected_io->type = type;
129 	expected_io->offset = offset;
130 	expected_io->length = length;
131 	expected_io->iovcnt = iovcnt;
132 
133 	return expected_io;
134 }
135 
136 static void
137 ut_expected_io_set_iov(struct ut_expected_io *expected_io, int pos, void *base, size_t len)
138 {
139 	expected_io->iov[pos].iov_base = base;
140 	expected_io->iov[pos].iov_len = len;
141 }
142 
143 static void
144 stub_submit_request(struct spdk_io_channel *_ch, struct spdk_bdev_io *bdev_io)
145 {
146 	struct bdev_ut_channel *ch = spdk_io_channel_get_ctx(_ch);
147 	struct ut_expected_io *expected_io;
148 	struct iovec *iov, *expected_iov;
149 	int i;
150 
151 	g_bdev_io = bdev_io;
152 
153 	TAILQ_INSERT_TAIL(&ch->outstanding_io, bdev_io, module_link);
154 	ch->outstanding_io_count++;
155 
156 	expected_io = TAILQ_FIRST(&ch->expected_io);
157 	if (expected_io == NULL) {
158 		return;
159 	}
160 	TAILQ_REMOVE(&ch->expected_io, expected_io, link);
161 
162 	if (expected_io->type != SPDK_BDEV_IO_TYPE_INVALID) {
163 		CU_ASSERT(bdev_io->type == expected_io->type);
164 	}
165 
166 	if (expected_io->md_buf != NULL) {
167 		CU_ASSERT(expected_io->md_buf == bdev_io->u.bdev.md_buf);
168 	}
169 
170 	if (expected_io->length == 0) {
171 		free(expected_io);
172 		return;
173 	}
174 
175 	CU_ASSERT(expected_io->offset == bdev_io->u.bdev.offset_blocks);
176 	CU_ASSERT(expected_io->length = bdev_io->u.bdev.num_blocks);
177 
178 	if (expected_io->iovcnt == 0) {
179 		free(expected_io);
180 		/* UNMAP, WRITE_ZEROES and FLUSH don't have iovs, so we can just return now. */
181 		return;
182 	}
183 
184 	CU_ASSERT(expected_io->iovcnt == bdev_io->u.bdev.iovcnt);
185 	for (i = 0; i < expected_io->iovcnt; i++) {
186 		iov = &bdev_io->u.bdev.iovs[i];
187 		expected_iov = &expected_io->iov[i];
188 		CU_ASSERT(iov->iov_len == expected_iov->iov_len);
189 		CU_ASSERT(iov->iov_base == expected_iov->iov_base);
190 	}
191 
192 	free(expected_io);
193 }
194 
195 static void
196 stub_submit_request_aligned_buffer_cb(struct spdk_io_channel *_ch,
197 				      struct spdk_bdev_io *bdev_io, bool success)
198 {
199 	CU_ASSERT(success == true);
200 
201 	stub_submit_request(_ch, bdev_io);
202 }
203 
204 static void
205 stub_submit_request_aligned_buffer(struct spdk_io_channel *_ch, struct spdk_bdev_io *bdev_io)
206 {
207 	spdk_bdev_io_get_buf(bdev_io, stub_submit_request_aligned_buffer_cb,
208 			     bdev_io->u.bdev.num_blocks * bdev_io->bdev->blocklen);
209 }
210 
211 static uint32_t
212 stub_complete_io(uint32_t num_to_complete)
213 {
214 	struct bdev_ut_channel *ch = g_bdev_ut_channel;
215 	struct spdk_bdev_io *bdev_io;
216 	static enum spdk_bdev_io_status io_status;
217 	uint32_t num_completed = 0;
218 
219 	while (num_completed < num_to_complete) {
220 		if (TAILQ_EMPTY(&ch->outstanding_io)) {
221 			break;
222 		}
223 		bdev_io = TAILQ_FIRST(&ch->outstanding_io);
224 		TAILQ_REMOVE(&ch->outstanding_io, bdev_io, module_link);
225 		ch->outstanding_io_count--;
226 		io_status = g_io_exp_status == SPDK_BDEV_IO_STATUS_SUCCESS ? SPDK_BDEV_IO_STATUS_SUCCESS :
227 			    g_io_exp_status;
228 		spdk_bdev_io_complete(bdev_io, io_status);
229 		num_completed++;
230 	}
231 
232 	return num_completed;
233 }
234 
235 static struct spdk_io_channel *
236 bdev_ut_get_io_channel(void *ctx)
237 {
238 	return spdk_get_io_channel(&g_bdev_ut_io_device);
239 }
240 
241 static bool g_io_types_supported[SPDK_BDEV_NUM_IO_TYPES] = {
242 	[SPDK_BDEV_IO_TYPE_READ]		= true,
243 	[SPDK_BDEV_IO_TYPE_WRITE]		= true,
244 	[SPDK_BDEV_IO_TYPE_UNMAP]		= true,
245 	[SPDK_BDEV_IO_TYPE_FLUSH]		= true,
246 	[SPDK_BDEV_IO_TYPE_RESET]		= true,
247 	[SPDK_BDEV_IO_TYPE_NVME_ADMIN]		= true,
248 	[SPDK_BDEV_IO_TYPE_NVME_IO]		= true,
249 	[SPDK_BDEV_IO_TYPE_NVME_IO_MD]		= true,
250 	[SPDK_BDEV_IO_TYPE_WRITE_ZEROES]	= true,
251 	[SPDK_BDEV_IO_TYPE_ZCOPY]		= true,
252 };
253 
254 static void
255 ut_enable_io_type(enum spdk_bdev_io_type io_type, bool enable)
256 {
257 	g_io_types_supported[io_type] = enable;
258 }
259 
260 static bool
261 stub_io_type_supported(void *_bdev, enum spdk_bdev_io_type io_type)
262 {
263 	return g_io_types_supported[io_type];
264 }
265 
266 static struct spdk_bdev_fn_table fn_table = {
267 	.destruct = stub_destruct,
268 	.submit_request = stub_submit_request,
269 	.get_io_channel = bdev_ut_get_io_channel,
270 	.io_type_supported = stub_io_type_supported,
271 };
272 
273 static int
274 bdev_ut_create_ch(void *io_device, void *ctx_buf)
275 {
276 	struct bdev_ut_channel *ch = ctx_buf;
277 
278 	CU_ASSERT(g_bdev_ut_channel == NULL);
279 	g_bdev_ut_channel = ch;
280 
281 	TAILQ_INIT(&ch->outstanding_io);
282 	ch->outstanding_io_count = 0;
283 	TAILQ_INIT(&ch->expected_io);
284 	return 0;
285 }
286 
287 static void
288 bdev_ut_destroy_ch(void *io_device, void *ctx_buf)
289 {
290 	CU_ASSERT(g_bdev_ut_channel != NULL);
291 	g_bdev_ut_channel = NULL;
292 }
293 
294 struct spdk_bdev_module bdev_ut_if;
295 
296 static int
297 bdev_ut_module_init(void)
298 {
299 	spdk_io_device_register(&g_bdev_ut_io_device, bdev_ut_create_ch, bdev_ut_destroy_ch,
300 				sizeof(struct bdev_ut_channel), NULL);
301 	spdk_bdev_module_init_done(&bdev_ut_if);
302 	return 0;
303 }
304 
305 static void
306 bdev_ut_module_fini(void)
307 {
308 	spdk_io_device_unregister(&g_bdev_ut_io_device, NULL);
309 }
310 
311 struct spdk_bdev_module bdev_ut_if = {
312 	.name = "bdev_ut",
313 	.module_init = bdev_ut_module_init,
314 	.module_fini = bdev_ut_module_fini,
315 	.async_init = true,
316 };
317 
318 static void vbdev_ut_examine(struct spdk_bdev *bdev);
319 
320 static int
321 vbdev_ut_module_init(void)
322 {
323 	return 0;
324 }
325 
326 static void
327 vbdev_ut_module_fini(void)
328 {
329 }
330 
331 struct spdk_bdev_module vbdev_ut_if = {
332 	.name = "vbdev_ut",
333 	.module_init = vbdev_ut_module_init,
334 	.module_fini = vbdev_ut_module_fini,
335 	.examine_config = vbdev_ut_examine,
336 };
337 
338 SPDK_BDEV_MODULE_REGISTER(bdev_ut, &bdev_ut_if)
339 SPDK_BDEV_MODULE_REGISTER(vbdev_ut, &vbdev_ut_if)
340 
341 static void
342 vbdev_ut_examine(struct spdk_bdev *bdev)
343 {
344 	spdk_bdev_module_examine_done(&vbdev_ut_if);
345 }
346 
347 static struct spdk_bdev *
348 allocate_bdev(char *name)
349 {
350 	struct spdk_bdev *bdev;
351 	int rc;
352 
353 	bdev = calloc(1, sizeof(*bdev));
354 	SPDK_CU_ASSERT_FATAL(bdev != NULL);
355 
356 	bdev->name = name;
357 	bdev->fn_table = &fn_table;
358 	bdev->module = &bdev_ut_if;
359 	bdev->blockcnt = 1024;
360 	bdev->blocklen = 512;
361 
362 	rc = spdk_bdev_register(bdev);
363 	CU_ASSERT(rc == 0);
364 
365 	return bdev;
366 }
367 
368 static struct spdk_bdev *
369 allocate_vbdev(char *name)
370 {
371 	struct spdk_bdev *bdev;
372 	int rc;
373 
374 	bdev = calloc(1, sizeof(*bdev));
375 	SPDK_CU_ASSERT_FATAL(bdev != NULL);
376 
377 	bdev->name = name;
378 	bdev->fn_table = &fn_table;
379 	bdev->module = &vbdev_ut_if;
380 
381 	rc = spdk_bdev_register(bdev);
382 	CU_ASSERT(rc == 0);
383 
384 	return bdev;
385 }
386 
387 static void
388 free_bdev(struct spdk_bdev *bdev)
389 {
390 	spdk_bdev_unregister(bdev, NULL, NULL);
391 	poll_threads();
392 	memset(bdev, 0xFF, sizeof(*bdev));
393 	free(bdev);
394 }
395 
396 static void
397 free_vbdev(struct spdk_bdev *bdev)
398 {
399 	spdk_bdev_unregister(bdev, NULL, NULL);
400 	poll_threads();
401 	memset(bdev, 0xFF, sizeof(*bdev));
402 	free(bdev);
403 }
404 
405 static void
406 get_device_stat_cb(struct spdk_bdev *bdev, struct spdk_bdev_io_stat *stat, void *cb_arg, int rc)
407 {
408 	const char *bdev_name;
409 
410 	CU_ASSERT(bdev != NULL);
411 	CU_ASSERT(rc == 0);
412 	bdev_name = spdk_bdev_get_name(bdev);
413 	CU_ASSERT_STRING_EQUAL(bdev_name, "bdev0");
414 
415 	free(stat);
416 	free_bdev(bdev);
417 
418 	*(bool *)cb_arg = true;
419 }
420 
421 static void
422 bdev_unregister_cb(void *cb_arg, int rc)
423 {
424 	g_unregister_arg = cb_arg;
425 	g_unregister_rc = rc;
426 }
427 
428 static void
429 bdev_open_cb1(enum spdk_bdev_event_type type, struct spdk_bdev *bdev, void *event_ctx)
430 {
431 	struct spdk_bdev_desc *desc = *(struct spdk_bdev_desc **)event_ctx;
432 
433 	g_event_type1 = type;
434 	if (SPDK_BDEV_EVENT_REMOVE == type) {
435 		spdk_bdev_close(desc);
436 	}
437 }
438 
439 static void
440 bdev_open_cb2(enum spdk_bdev_event_type type, struct spdk_bdev *bdev, void *event_ctx)
441 {
442 	struct spdk_bdev_desc *desc = *(struct spdk_bdev_desc **)event_ctx;
443 
444 	g_event_type2 = type;
445 	if (SPDK_BDEV_EVENT_REMOVE == type) {
446 		spdk_bdev_close(desc);
447 	}
448 }
449 
450 static void
451 get_device_stat_test(void)
452 {
453 	struct spdk_bdev *bdev;
454 	struct spdk_bdev_io_stat *stat;
455 	bool done;
456 
457 	bdev = allocate_bdev("bdev0");
458 	stat = calloc(1, sizeof(struct spdk_bdev_io_stat));
459 	if (stat == NULL) {
460 		free_bdev(bdev);
461 		return;
462 	}
463 
464 	done = false;
465 	spdk_bdev_get_device_stat(bdev, stat, get_device_stat_cb, &done);
466 	while (!done) { poll_threads(); }
467 
468 
469 }
470 
471 static void
472 open_write_test(void)
473 {
474 	struct spdk_bdev *bdev[9];
475 	struct spdk_bdev_desc *desc[9] = {};
476 	int rc;
477 
478 	/*
479 	 * Create a tree of bdevs to test various open w/ write cases.
480 	 *
481 	 * bdev0 through bdev3 are physical block devices, such as NVMe
482 	 * namespaces or Ceph block devices.
483 	 *
484 	 * bdev4 is a virtual bdev with multiple base bdevs.  This models
485 	 * caching or RAID use cases.
486 	 *
487 	 * bdev5 through bdev7 are all virtual bdevs with the same base
488 	 * bdev (except bdev7). This models partitioning or logical volume
489 	 * use cases.
490 	 *
491 	 * bdev7 is a virtual bdev with multiple base bdevs. One of base bdevs
492 	 * (bdev2) is shared with other virtual bdevs: bdev5 and bdev6. This
493 	 * models caching, RAID, partitioning or logical volumes use cases.
494 	 *
495 	 * bdev8 is a virtual bdev with multiple base bdevs, but these
496 	 * base bdevs are themselves virtual bdevs.
497 	 *
498 	 *                bdev8
499 	 *                  |
500 	 *            +----------+
501 	 *            |          |
502 	 *          bdev4      bdev5   bdev6   bdev7
503 	 *            |          |       |       |
504 	 *        +---+---+      +---+   +   +---+---+
505 	 *        |       |           \  |  /         \
506 	 *      bdev0   bdev1          bdev2         bdev3
507 	 */
508 
509 	bdev[0] = allocate_bdev("bdev0");
510 	rc = spdk_bdev_module_claim_bdev(bdev[0], NULL, &bdev_ut_if);
511 	CU_ASSERT(rc == 0);
512 
513 	bdev[1] = allocate_bdev("bdev1");
514 	rc = spdk_bdev_module_claim_bdev(bdev[1], NULL, &bdev_ut_if);
515 	CU_ASSERT(rc == 0);
516 
517 	bdev[2] = allocate_bdev("bdev2");
518 	rc = spdk_bdev_module_claim_bdev(bdev[2], NULL, &bdev_ut_if);
519 	CU_ASSERT(rc == 0);
520 
521 	bdev[3] = allocate_bdev("bdev3");
522 	rc = spdk_bdev_module_claim_bdev(bdev[3], NULL, &bdev_ut_if);
523 	CU_ASSERT(rc == 0);
524 
525 	bdev[4] = allocate_vbdev("bdev4");
526 	rc = spdk_bdev_module_claim_bdev(bdev[4], NULL, &bdev_ut_if);
527 	CU_ASSERT(rc == 0);
528 
529 	bdev[5] = allocate_vbdev("bdev5");
530 	rc = spdk_bdev_module_claim_bdev(bdev[5], NULL, &bdev_ut_if);
531 	CU_ASSERT(rc == 0);
532 
533 	bdev[6] = allocate_vbdev("bdev6");
534 
535 	bdev[7] = allocate_vbdev("bdev7");
536 
537 	bdev[8] = allocate_vbdev("bdev8");
538 
539 	/* Open bdev0 read-only.  This should succeed. */
540 	rc = spdk_bdev_open(bdev[0], false, NULL, NULL, &desc[0]);
541 	CU_ASSERT(rc == 0);
542 	SPDK_CU_ASSERT_FATAL(desc[0] != NULL);
543 	spdk_bdev_close(desc[0]);
544 
545 	/*
546 	 * Open bdev1 read/write.  This should fail since bdev1 has been claimed
547 	 * by a vbdev module.
548 	 */
549 	rc = spdk_bdev_open(bdev[1], true, NULL, NULL, &desc[1]);
550 	CU_ASSERT(rc == -EPERM);
551 
552 	/*
553 	 * Open bdev4 read/write.  This should fail since bdev3 has been claimed
554 	 * by a vbdev module.
555 	 */
556 	rc = spdk_bdev_open(bdev[4], true, NULL, NULL, &desc[4]);
557 	CU_ASSERT(rc == -EPERM);
558 
559 	/* Open bdev4 read-only.  This should succeed. */
560 	rc = spdk_bdev_open(bdev[4], false, NULL, NULL, &desc[4]);
561 	CU_ASSERT(rc == 0);
562 	SPDK_CU_ASSERT_FATAL(desc[4] != NULL);
563 	spdk_bdev_close(desc[4]);
564 
565 	/*
566 	 * Open bdev8 read/write.  This should succeed since it is a leaf
567 	 * bdev.
568 	 */
569 	rc = spdk_bdev_open(bdev[8], true, NULL, NULL, &desc[8]);
570 	CU_ASSERT(rc == 0);
571 	SPDK_CU_ASSERT_FATAL(desc[8] != NULL);
572 	spdk_bdev_close(desc[8]);
573 
574 	/*
575 	 * Open bdev5 read/write.  This should fail since bdev4 has been claimed
576 	 * by a vbdev module.
577 	 */
578 	rc = spdk_bdev_open(bdev[5], true, NULL, NULL, &desc[5]);
579 	CU_ASSERT(rc == -EPERM);
580 
581 	/* Open bdev4 read-only.  This should succeed. */
582 	rc = spdk_bdev_open(bdev[5], false, NULL, NULL, &desc[5]);
583 	CU_ASSERT(rc == 0);
584 	SPDK_CU_ASSERT_FATAL(desc[5] != NULL);
585 	spdk_bdev_close(desc[5]);
586 
587 	free_vbdev(bdev[8]);
588 
589 	free_vbdev(bdev[5]);
590 	free_vbdev(bdev[6]);
591 	free_vbdev(bdev[7]);
592 
593 	free_vbdev(bdev[4]);
594 
595 	free_bdev(bdev[0]);
596 	free_bdev(bdev[1]);
597 	free_bdev(bdev[2]);
598 	free_bdev(bdev[3]);
599 }
600 
601 static void
602 bytes_to_blocks_test(void)
603 {
604 	struct spdk_bdev bdev;
605 	uint64_t offset_blocks, num_blocks;
606 
607 	memset(&bdev, 0, sizeof(bdev));
608 
609 	bdev.blocklen = 512;
610 
611 	/* All parameters valid */
612 	offset_blocks = 0;
613 	num_blocks = 0;
614 	CU_ASSERT(spdk_bdev_bytes_to_blocks(&bdev, 512, &offset_blocks, 1024, &num_blocks) == 0);
615 	CU_ASSERT(offset_blocks == 1);
616 	CU_ASSERT(num_blocks == 2);
617 
618 	/* Offset not a block multiple */
619 	CU_ASSERT(spdk_bdev_bytes_to_blocks(&bdev, 3, &offset_blocks, 512, &num_blocks) != 0);
620 
621 	/* Length not a block multiple */
622 	CU_ASSERT(spdk_bdev_bytes_to_blocks(&bdev, 512, &offset_blocks, 3, &num_blocks) != 0);
623 
624 	/* In case blocklen not the power of two */
625 	bdev.blocklen = 100;
626 	CU_ASSERT(spdk_bdev_bytes_to_blocks(&bdev, 100, &offset_blocks, 200, &num_blocks) == 0);
627 	CU_ASSERT(offset_blocks == 1);
628 	CU_ASSERT(num_blocks == 2);
629 
630 	/* Offset not a block multiple */
631 	CU_ASSERT(spdk_bdev_bytes_to_blocks(&bdev, 3, &offset_blocks, 100, &num_blocks) != 0);
632 
633 	/* Length not a block multiple */
634 	CU_ASSERT(spdk_bdev_bytes_to_blocks(&bdev, 100, &offset_blocks, 3, &num_blocks) != 0);
635 }
636 
637 static void
638 num_blocks_test(void)
639 {
640 	struct spdk_bdev bdev;
641 	struct spdk_bdev_desc *desc = NULL;
642 	struct spdk_bdev_desc *desc_ext = NULL;
643 	int rc;
644 
645 	memset(&bdev, 0, sizeof(bdev));
646 	bdev.name = "num_blocks";
647 	bdev.fn_table = &fn_table;
648 	bdev.module = &bdev_ut_if;
649 	spdk_bdev_register(&bdev);
650 	spdk_bdev_notify_blockcnt_change(&bdev, 50);
651 
652 	/* Growing block number */
653 	CU_ASSERT(spdk_bdev_notify_blockcnt_change(&bdev, 70) == 0);
654 	/* Shrinking block number */
655 	CU_ASSERT(spdk_bdev_notify_blockcnt_change(&bdev, 30) == 0);
656 
657 	/* In case bdev opened */
658 	rc = spdk_bdev_open(&bdev, false, NULL, NULL, &desc);
659 	CU_ASSERT(rc == 0);
660 	SPDK_CU_ASSERT_FATAL(desc != NULL);
661 
662 	/* Growing block number */
663 	CU_ASSERT(spdk_bdev_notify_blockcnt_change(&bdev, 80) == 0);
664 	/* Shrinking block number */
665 	CU_ASSERT(spdk_bdev_notify_blockcnt_change(&bdev, 20) != 0);
666 
667 	/* In case bdev opened with ext API */
668 	rc = spdk_bdev_open_ext("num_blocks", false, bdev_open_cb1, &desc_ext, &desc_ext);
669 	CU_ASSERT(rc == 0);
670 	SPDK_CU_ASSERT_FATAL(desc_ext != NULL);
671 
672 	g_event_type1 = 0xFF;
673 	/* Growing block number */
674 	CU_ASSERT(spdk_bdev_notify_blockcnt_change(&bdev, 90) == 0);
675 
676 	poll_threads();
677 	CU_ASSERT_EQUAL(g_event_type1, SPDK_BDEV_EVENT_RESIZE);
678 
679 	g_event_type1 = 0xFF;
680 	/* Growing block number and closing */
681 	CU_ASSERT(spdk_bdev_notify_blockcnt_change(&bdev, 100) == 0);
682 
683 	spdk_bdev_close(desc);
684 	spdk_bdev_close(desc_ext);
685 	spdk_bdev_unregister(&bdev, NULL, NULL);
686 
687 	poll_threads();
688 
689 	/* Callback is not called for closed device */
690 	CU_ASSERT_EQUAL(g_event_type1, 0xFF);
691 }
692 
693 static void
694 io_valid_test(void)
695 {
696 	struct spdk_bdev bdev;
697 
698 	memset(&bdev, 0, sizeof(bdev));
699 
700 	bdev.blocklen = 512;
701 	spdk_bdev_notify_blockcnt_change(&bdev, 100);
702 
703 	/* All parameters valid */
704 	CU_ASSERT(spdk_bdev_io_valid_blocks(&bdev, 1, 2) == true);
705 
706 	/* Last valid block */
707 	CU_ASSERT(spdk_bdev_io_valid_blocks(&bdev, 99, 1) == true);
708 
709 	/* Offset past end of bdev */
710 	CU_ASSERT(spdk_bdev_io_valid_blocks(&bdev, 100, 1) == false);
711 
712 	/* Offset + length past end of bdev */
713 	CU_ASSERT(spdk_bdev_io_valid_blocks(&bdev, 99, 2) == false);
714 
715 	/* Offset near end of uint64_t range (2^64 - 1) */
716 	CU_ASSERT(spdk_bdev_io_valid_blocks(&bdev, 18446744073709551615ULL, 1) == false);
717 }
718 
719 static void
720 alias_add_del_test(void)
721 {
722 	struct spdk_bdev *bdev[3];
723 	int rc;
724 
725 	/* Creating and registering bdevs */
726 	bdev[0] = allocate_bdev("bdev0");
727 	SPDK_CU_ASSERT_FATAL(bdev[0] != 0);
728 
729 	bdev[1] = allocate_bdev("bdev1");
730 	SPDK_CU_ASSERT_FATAL(bdev[1] != 0);
731 
732 	bdev[2] = allocate_bdev("bdev2");
733 	SPDK_CU_ASSERT_FATAL(bdev[2] != 0);
734 
735 	poll_threads();
736 
737 	/*
738 	 * Trying adding an alias identical to name.
739 	 * Alias is identical to name, so it can not be added to aliases list
740 	 */
741 	rc = spdk_bdev_alias_add(bdev[0], bdev[0]->name);
742 	CU_ASSERT(rc == -EEXIST);
743 
744 	/*
745 	 * Trying to add empty alias,
746 	 * this one should fail
747 	 */
748 	rc = spdk_bdev_alias_add(bdev[0], NULL);
749 	CU_ASSERT(rc == -EINVAL);
750 
751 	/* Trying adding same alias to two different registered bdevs */
752 
753 	/* Alias is used first time, so this one should pass */
754 	rc = spdk_bdev_alias_add(bdev[0], "proper alias 0");
755 	CU_ASSERT(rc == 0);
756 
757 	/* Alias was added to another bdev, so this one should fail */
758 	rc = spdk_bdev_alias_add(bdev[1], "proper alias 0");
759 	CU_ASSERT(rc == -EEXIST);
760 
761 	/* Alias is used first time, so this one should pass */
762 	rc = spdk_bdev_alias_add(bdev[1], "proper alias 1");
763 	CU_ASSERT(rc == 0);
764 
765 	/* Trying removing an alias from registered bdevs */
766 
767 	/* Alias is not on a bdev aliases list, so this one should fail */
768 	rc = spdk_bdev_alias_del(bdev[0], "not existing");
769 	CU_ASSERT(rc == -ENOENT);
770 
771 	/* Alias is present on a bdev aliases list, so this one should pass */
772 	rc = spdk_bdev_alias_del(bdev[0], "proper alias 0");
773 	CU_ASSERT(rc == 0);
774 
775 	/* Alias is present on a bdev aliases list, so this one should pass */
776 	rc = spdk_bdev_alias_del(bdev[1], "proper alias 1");
777 	CU_ASSERT(rc == 0);
778 
779 	/* Trying to remove name instead of alias, so this one should fail, name cannot be changed or removed */
780 	rc = spdk_bdev_alias_del(bdev[0], bdev[0]->name);
781 	CU_ASSERT(rc != 0);
782 
783 	/* Trying to del all alias from empty alias list */
784 	spdk_bdev_alias_del_all(bdev[2]);
785 	SPDK_CU_ASSERT_FATAL(TAILQ_EMPTY(&bdev[2]->aliases));
786 
787 	/* Trying to del all alias from non-empty alias list */
788 	rc = spdk_bdev_alias_add(bdev[2], "alias0");
789 	CU_ASSERT(rc == 0);
790 	rc = spdk_bdev_alias_add(bdev[2], "alias1");
791 	CU_ASSERT(rc == 0);
792 	spdk_bdev_alias_del_all(bdev[2]);
793 	CU_ASSERT(TAILQ_EMPTY(&bdev[2]->aliases));
794 
795 	/* Unregister and free bdevs */
796 	spdk_bdev_unregister(bdev[0], NULL, NULL);
797 	spdk_bdev_unregister(bdev[1], NULL, NULL);
798 	spdk_bdev_unregister(bdev[2], NULL, NULL);
799 
800 	poll_threads();
801 
802 	free(bdev[0]);
803 	free(bdev[1]);
804 	free(bdev[2]);
805 }
806 
807 static void
808 io_done(struct spdk_bdev_io *bdev_io, bool success, void *cb_arg)
809 {
810 	g_io_done = true;
811 	g_io_status = bdev_io->internal.status;
812 	spdk_bdev_free_io(bdev_io);
813 }
814 
815 static void
816 bdev_init_cb(void *arg, int rc)
817 {
818 	CU_ASSERT(rc == 0);
819 }
820 
821 static void
822 bdev_fini_cb(void *arg)
823 {
824 }
825 
826 struct bdev_ut_io_wait_entry {
827 	struct spdk_bdev_io_wait_entry	entry;
828 	struct spdk_io_channel		*io_ch;
829 	struct spdk_bdev_desc		*desc;
830 	bool				submitted;
831 };
832 
833 static void
834 io_wait_cb(void *arg)
835 {
836 	struct bdev_ut_io_wait_entry *entry = arg;
837 	int rc;
838 
839 	rc = spdk_bdev_read_blocks(entry->desc, entry->io_ch, NULL, 0, 1, io_done, NULL);
840 	CU_ASSERT(rc == 0);
841 	entry->submitted = true;
842 }
843 
844 static void
845 bdev_io_types_test(void)
846 {
847 	struct spdk_bdev *bdev;
848 	struct spdk_bdev_desc *desc = NULL;
849 	struct spdk_io_channel *io_ch;
850 	struct spdk_bdev_opts bdev_opts = {
851 		.bdev_io_pool_size = 4,
852 		.bdev_io_cache_size = 2,
853 	};
854 	int rc;
855 
856 	rc = spdk_bdev_set_opts(&bdev_opts);
857 	CU_ASSERT(rc == 0);
858 	spdk_bdev_initialize(bdev_init_cb, NULL);
859 	poll_threads();
860 
861 	bdev = allocate_bdev("bdev0");
862 
863 	rc = spdk_bdev_open(bdev, true, NULL, NULL, &desc);
864 	CU_ASSERT(rc == 0);
865 	poll_threads();
866 	SPDK_CU_ASSERT_FATAL(desc != NULL);
867 	io_ch = spdk_bdev_get_io_channel(desc);
868 	CU_ASSERT(io_ch != NULL);
869 
870 	/* WRITE and WRITE ZEROES are not supported */
871 	ut_enable_io_type(SPDK_BDEV_IO_TYPE_WRITE_ZEROES, false);
872 	ut_enable_io_type(SPDK_BDEV_IO_TYPE_WRITE, false);
873 	rc = spdk_bdev_write_zeroes_blocks(desc, io_ch, 0, 128, io_done, NULL);
874 	CU_ASSERT(rc == -ENOTSUP);
875 	ut_enable_io_type(SPDK_BDEV_IO_TYPE_WRITE_ZEROES, true);
876 	ut_enable_io_type(SPDK_BDEV_IO_TYPE_WRITE, true);
877 
878 	spdk_put_io_channel(io_ch);
879 	spdk_bdev_close(desc);
880 	free_bdev(bdev);
881 	spdk_bdev_finish(bdev_fini_cb, NULL);
882 	poll_threads();
883 }
884 
885 static void
886 bdev_io_wait_test(void)
887 {
888 	struct spdk_bdev *bdev;
889 	struct spdk_bdev_desc *desc = NULL;
890 	struct spdk_io_channel *io_ch;
891 	struct spdk_bdev_opts bdev_opts = {
892 		.bdev_io_pool_size = 4,
893 		.bdev_io_cache_size = 2,
894 	};
895 	struct bdev_ut_io_wait_entry io_wait_entry;
896 	struct bdev_ut_io_wait_entry io_wait_entry2;
897 	int rc;
898 
899 	rc = spdk_bdev_set_opts(&bdev_opts);
900 	CU_ASSERT(rc == 0);
901 	spdk_bdev_initialize(bdev_init_cb, NULL);
902 	poll_threads();
903 
904 	bdev = allocate_bdev("bdev0");
905 
906 	rc = spdk_bdev_open(bdev, true, NULL, NULL, &desc);
907 	CU_ASSERT(rc == 0);
908 	poll_threads();
909 	SPDK_CU_ASSERT_FATAL(desc != NULL);
910 	io_ch = spdk_bdev_get_io_channel(desc);
911 	CU_ASSERT(io_ch != NULL);
912 
913 	rc = spdk_bdev_read_blocks(desc, io_ch, NULL, 0, 1, io_done, NULL);
914 	CU_ASSERT(rc == 0);
915 	rc = spdk_bdev_read_blocks(desc, io_ch, NULL, 0, 1, io_done, NULL);
916 	CU_ASSERT(rc == 0);
917 	rc = spdk_bdev_read_blocks(desc, io_ch, NULL, 0, 1, io_done, NULL);
918 	CU_ASSERT(rc == 0);
919 	rc = spdk_bdev_read_blocks(desc, io_ch, NULL, 0, 1, io_done, NULL);
920 	CU_ASSERT(rc == 0);
921 	CU_ASSERT(g_bdev_ut_channel->outstanding_io_count == 4);
922 
923 	rc = spdk_bdev_read_blocks(desc, io_ch, NULL, 0, 1, io_done, NULL);
924 	CU_ASSERT(rc == -ENOMEM);
925 
926 	io_wait_entry.entry.bdev = bdev;
927 	io_wait_entry.entry.cb_fn = io_wait_cb;
928 	io_wait_entry.entry.cb_arg = &io_wait_entry;
929 	io_wait_entry.io_ch = io_ch;
930 	io_wait_entry.desc = desc;
931 	io_wait_entry.submitted = false;
932 	/* Cannot use the same io_wait_entry for two different calls. */
933 	memcpy(&io_wait_entry2, &io_wait_entry, sizeof(io_wait_entry));
934 	io_wait_entry2.entry.cb_arg = &io_wait_entry2;
935 
936 	/* Queue two I/O waits. */
937 	rc = spdk_bdev_queue_io_wait(bdev, io_ch, &io_wait_entry.entry);
938 	CU_ASSERT(rc == 0);
939 	CU_ASSERT(io_wait_entry.submitted == false);
940 	rc = spdk_bdev_queue_io_wait(bdev, io_ch, &io_wait_entry2.entry);
941 	CU_ASSERT(rc == 0);
942 	CU_ASSERT(io_wait_entry2.submitted == false);
943 
944 	stub_complete_io(1);
945 	CU_ASSERT(g_bdev_ut_channel->outstanding_io_count == 4);
946 	CU_ASSERT(io_wait_entry.submitted == true);
947 	CU_ASSERT(io_wait_entry2.submitted == false);
948 
949 	stub_complete_io(1);
950 	CU_ASSERT(g_bdev_ut_channel->outstanding_io_count == 4);
951 	CU_ASSERT(io_wait_entry2.submitted == true);
952 
953 	stub_complete_io(4);
954 	CU_ASSERT(g_bdev_ut_channel->outstanding_io_count == 0);
955 
956 	spdk_put_io_channel(io_ch);
957 	spdk_bdev_close(desc);
958 	free_bdev(bdev);
959 	spdk_bdev_finish(bdev_fini_cb, NULL);
960 	poll_threads();
961 }
962 
963 static void
964 bdev_io_spans_boundary_test(void)
965 {
966 	struct spdk_bdev bdev;
967 	struct spdk_bdev_io bdev_io;
968 
969 	memset(&bdev, 0, sizeof(bdev));
970 
971 	bdev.optimal_io_boundary = 0;
972 	bdev_io.bdev = &bdev;
973 
974 	/* bdev has no optimal_io_boundary set - so this should return false. */
975 	CU_ASSERT(_spdk_bdev_io_should_split(&bdev_io) == false);
976 
977 	bdev.optimal_io_boundary = 32;
978 	bdev_io.type = SPDK_BDEV_IO_TYPE_RESET;
979 
980 	/* RESETs are not based on LBAs - so this should return false. */
981 	CU_ASSERT(_spdk_bdev_io_should_split(&bdev_io) == false);
982 
983 	bdev_io.type = SPDK_BDEV_IO_TYPE_READ;
984 	bdev_io.u.bdev.offset_blocks = 0;
985 	bdev_io.u.bdev.num_blocks = 32;
986 
987 	/* This I/O run right up to, but does not cross, the boundary - so this should return false. */
988 	CU_ASSERT(_spdk_bdev_io_should_split(&bdev_io) == false);
989 
990 	bdev_io.u.bdev.num_blocks = 33;
991 
992 	/* This I/O spans a boundary. */
993 	CU_ASSERT(_spdk_bdev_io_should_split(&bdev_io) == true);
994 }
995 
996 static void
997 bdev_io_split(void)
998 {
999 	struct spdk_bdev *bdev;
1000 	struct spdk_bdev_desc *desc = NULL;
1001 	struct spdk_io_channel *io_ch;
1002 	struct spdk_bdev_opts bdev_opts = {
1003 		.bdev_io_pool_size = 512,
1004 		.bdev_io_cache_size = 64,
1005 	};
1006 	struct iovec iov[BDEV_IO_NUM_CHILD_IOV * 2];
1007 	struct ut_expected_io *expected_io;
1008 	uint64_t i;
1009 	int rc;
1010 
1011 	rc = spdk_bdev_set_opts(&bdev_opts);
1012 	CU_ASSERT(rc == 0);
1013 	spdk_bdev_initialize(bdev_init_cb, NULL);
1014 
1015 	bdev = allocate_bdev("bdev0");
1016 
1017 	rc = spdk_bdev_open(bdev, true, NULL, NULL, &desc);
1018 	CU_ASSERT(rc == 0);
1019 	SPDK_CU_ASSERT_FATAL(desc != NULL);
1020 	io_ch = spdk_bdev_get_io_channel(desc);
1021 	CU_ASSERT(io_ch != NULL);
1022 
1023 	bdev->optimal_io_boundary = 16;
1024 	bdev->split_on_optimal_io_boundary = false;
1025 
1026 	g_io_done = false;
1027 
1028 	/* First test that the I/O does not get split if split_on_optimal_io_boundary == false. */
1029 	expected_io = ut_alloc_expected_io(SPDK_BDEV_IO_TYPE_READ, 14, 8, 1);
1030 	ut_expected_io_set_iov(expected_io, 0, (void *)0xF000, 8 * 512);
1031 	TAILQ_INSERT_TAIL(&g_bdev_ut_channel->expected_io, expected_io, link);
1032 
1033 	rc = spdk_bdev_read_blocks(desc, io_ch, (void *)0xF000, 14, 8, io_done, NULL);
1034 	CU_ASSERT(rc == 0);
1035 	CU_ASSERT(g_io_done == false);
1036 
1037 	CU_ASSERT(g_bdev_ut_channel->outstanding_io_count == 1);
1038 	stub_complete_io(1);
1039 	CU_ASSERT(g_io_done == true);
1040 	CU_ASSERT(g_bdev_ut_channel->outstanding_io_count == 0);
1041 
1042 	bdev->split_on_optimal_io_boundary = true;
1043 
1044 	/* Now test that a single-vector command is split correctly.
1045 	 * Offset 14, length 8, payload 0xF000
1046 	 *  Child - Offset 14, length 2, payload 0xF000
1047 	 *  Child - Offset 16, length 6, payload 0xF000 + 2 * 512
1048 	 *
1049 	 * Set up the expected values before calling spdk_bdev_read_blocks
1050 	 */
1051 	g_io_done = false;
1052 	expected_io = ut_alloc_expected_io(SPDK_BDEV_IO_TYPE_READ, 14, 2, 1);
1053 	ut_expected_io_set_iov(expected_io, 0, (void *)0xF000, 2 * 512);
1054 	TAILQ_INSERT_TAIL(&g_bdev_ut_channel->expected_io, expected_io, link);
1055 
1056 	expected_io = ut_alloc_expected_io(SPDK_BDEV_IO_TYPE_READ, 16, 6, 1);
1057 	ut_expected_io_set_iov(expected_io, 0, (void *)(0xF000 + 2 * 512), 6 * 512);
1058 	TAILQ_INSERT_TAIL(&g_bdev_ut_channel->expected_io, expected_io, link);
1059 
1060 	/* spdk_bdev_read_blocks will submit the first child immediately. */
1061 	rc = spdk_bdev_read_blocks(desc, io_ch, (void *)0xF000, 14, 8, io_done, NULL);
1062 	CU_ASSERT(rc == 0);
1063 	CU_ASSERT(g_io_done == false);
1064 
1065 	CU_ASSERT(g_bdev_ut_channel->outstanding_io_count == 2);
1066 	stub_complete_io(2);
1067 	CU_ASSERT(g_io_done == true);
1068 	CU_ASSERT(g_bdev_ut_channel->outstanding_io_count == 0);
1069 
1070 	/* Now set up a more complex, multi-vector command that needs to be split,
1071 	 *  including splitting iovecs.
1072 	 */
1073 	iov[0].iov_base = (void *)0x10000;
1074 	iov[0].iov_len = 512;
1075 	iov[1].iov_base = (void *)0x20000;
1076 	iov[1].iov_len = 20 * 512;
1077 	iov[2].iov_base = (void *)0x30000;
1078 	iov[2].iov_len = 11 * 512;
1079 
1080 	g_io_done = false;
1081 	expected_io = ut_alloc_expected_io(SPDK_BDEV_IO_TYPE_WRITE, 14, 2, 2);
1082 	ut_expected_io_set_iov(expected_io, 0, (void *)0x10000, 512);
1083 	ut_expected_io_set_iov(expected_io, 1, (void *)0x20000, 512);
1084 	TAILQ_INSERT_TAIL(&g_bdev_ut_channel->expected_io, expected_io, link);
1085 
1086 	expected_io = ut_alloc_expected_io(SPDK_BDEV_IO_TYPE_WRITE, 16, 16, 1);
1087 	ut_expected_io_set_iov(expected_io, 0, (void *)(0x20000 + 512), 16 * 512);
1088 	TAILQ_INSERT_TAIL(&g_bdev_ut_channel->expected_io, expected_io, link);
1089 
1090 	expected_io = ut_alloc_expected_io(SPDK_BDEV_IO_TYPE_WRITE, 32, 14, 2);
1091 	ut_expected_io_set_iov(expected_io, 0, (void *)(0x20000 + 17 * 512), 3 * 512);
1092 	ut_expected_io_set_iov(expected_io, 1, (void *)0x30000, 11 * 512);
1093 	TAILQ_INSERT_TAIL(&g_bdev_ut_channel->expected_io, expected_io, link);
1094 
1095 	rc = spdk_bdev_writev_blocks(desc, io_ch, iov, 3, 14, 32, io_done, NULL);
1096 	CU_ASSERT(rc == 0);
1097 	CU_ASSERT(g_io_done == false);
1098 
1099 	CU_ASSERT(g_bdev_ut_channel->outstanding_io_count == 3);
1100 	stub_complete_io(3);
1101 	CU_ASSERT(g_io_done == true);
1102 
1103 	/* Test multi vector command that needs to be split by strip and then needs to be
1104 	 * split further due to the capacity of child iovs.
1105 	 */
1106 	for (i = 0; i < BDEV_IO_NUM_CHILD_IOV * 2; i++) {
1107 		iov[i].iov_base = (void *)((i + 1) * 0x10000);
1108 		iov[i].iov_len = 512;
1109 	}
1110 
1111 	bdev->optimal_io_boundary = BDEV_IO_NUM_CHILD_IOV;
1112 	g_io_done = false;
1113 	expected_io = ut_alloc_expected_io(SPDK_BDEV_IO_TYPE_READ, 0, BDEV_IO_NUM_CHILD_IOV,
1114 					   BDEV_IO_NUM_CHILD_IOV);
1115 	for (i = 0; i < BDEV_IO_NUM_CHILD_IOV; i++) {
1116 		ut_expected_io_set_iov(expected_io, i, (void *)((i + 1) * 0x10000), 512);
1117 	}
1118 	TAILQ_INSERT_TAIL(&g_bdev_ut_channel->expected_io, expected_io, link);
1119 
1120 	expected_io = ut_alloc_expected_io(SPDK_BDEV_IO_TYPE_READ, BDEV_IO_NUM_CHILD_IOV,
1121 					   BDEV_IO_NUM_CHILD_IOV, BDEV_IO_NUM_CHILD_IOV);
1122 	for (i = 0; i < BDEV_IO_NUM_CHILD_IOV; i++) {
1123 		ut_expected_io_set_iov(expected_io, i,
1124 				       (void *)((i + 1 + BDEV_IO_NUM_CHILD_IOV) * 0x10000), 512);
1125 	}
1126 	TAILQ_INSERT_TAIL(&g_bdev_ut_channel->expected_io, expected_io, link);
1127 
1128 	rc = spdk_bdev_readv_blocks(desc, io_ch, iov, BDEV_IO_NUM_CHILD_IOV * 2, 0,
1129 				    BDEV_IO_NUM_CHILD_IOV * 2, io_done, NULL);
1130 	CU_ASSERT(rc == 0);
1131 	CU_ASSERT(g_io_done == false);
1132 
1133 	CU_ASSERT(g_bdev_ut_channel->outstanding_io_count == 1);
1134 	stub_complete_io(1);
1135 	CU_ASSERT(g_io_done == false);
1136 
1137 	CU_ASSERT(g_bdev_ut_channel->outstanding_io_count == 1);
1138 	stub_complete_io(1);
1139 	CU_ASSERT(g_io_done == true);
1140 	CU_ASSERT(g_bdev_ut_channel->outstanding_io_count == 0);
1141 
1142 	/* Test multi vector command that needs to be split by strip and then needs to be
1143 	 * split further due to the capacity of child iovs. In this case, the length of
1144 	 * the rest of iovec array with an I/O boundary is the multiple of block size.
1145 	 */
1146 
1147 	/* Fill iovec array for exactly one boundary. The iovec cnt for this boundary
1148 	 * is BDEV_IO_NUM_CHILD_IOV + 1, which exceeds the capacity of child iovs.
1149 	 */
1150 	for (i = 0; i < BDEV_IO_NUM_CHILD_IOV - 2; i++) {
1151 		iov[i].iov_base = (void *)((i + 1) * 0x10000);
1152 		iov[i].iov_len = 512;
1153 	}
1154 	for (i = BDEV_IO_NUM_CHILD_IOV - 2; i < BDEV_IO_NUM_CHILD_IOV; i++) {
1155 		iov[i].iov_base = (void *)((i + 1) * 0x10000);
1156 		iov[i].iov_len = 256;
1157 	}
1158 	iov[BDEV_IO_NUM_CHILD_IOV].iov_base = (void *)((BDEV_IO_NUM_CHILD_IOV + 1) * 0x10000);
1159 	iov[BDEV_IO_NUM_CHILD_IOV].iov_len = 512;
1160 
1161 	/* Add an extra iovec to trigger split */
1162 	iov[BDEV_IO_NUM_CHILD_IOV + 1].iov_base = (void *)((BDEV_IO_NUM_CHILD_IOV + 2) * 0x10000);
1163 	iov[BDEV_IO_NUM_CHILD_IOV + 1].iov_len = 512;
1164 
1165 	bdev->optimal_io_boundary = BDEV_IO_NUM_CHILD_IOV;
1166 	g_io_done = false;
1167 	expected_io = ut_alloc_expected_io(SPDK_BDEV_IO_TYPE_READ, 0,
1168 					   BDEV_IO_NUM_CHILD_IOV - 1, BDEV_IO_NUM_CHILD_IOV);
1169 	for (i = 0; i < BDEV_IO_NUM_CHILD_IOV - 2; i++) {
1170 		ut_expected_io_set_iov(expected_io, i,
1171 				       (void *)((i + 1) * 0x10000), 512);
1172 	}
1173 	for (i = BDEV_IO_NUM_CHILD_IOV - 2; i < BDEV_IO_NUM_CHILD_IOV; i++) {
1174 		ut_expected_io_set_iov(expected_io, i,
1175 				       (void *)((i + 1) * 0x10000), 256);
1176 	}
1177 	TAILQ_INSERT_TAIL(&g_bdev_ut_channel->expected_io, expected_io, link);
1178 
1179 	expected_io = ut_alloc_expected_io(SPDK_BDEV_IO_TYPE_READ, BDEV_IO_NUM_CHILD_IOV - 1,
1180 					   1, 1);
1181 	ut_expected_io_set_iov(expected_io, 0,
1182 			       (void *)((BDEV_IO_NUM_CHILD_IOV + 1) * 0x10000), 512);
1183 	TAILQ_INSERT_TAIL(&g_bdev_ut_channel->expected_io, expected_io, link);
1184 
1185 	expected_io = ut_alloc_expected_io(SPDK_BDEV_IO_TYPE_READ, BDEV_IO_NUM_CHILD_IOV,
1186 					   1, 1);
1187 	ut_expected_io_set_iov(expected_io, 0,
1188 			       (void *)((BDEV_IO_NUM_CHILD_IOV + 2) * 0x10000), 512);
1189 	TAILQ_INSERT_TAIL(&g_bdev_ut_channel->expected_io, expected_io, link);
1190 
1191 	rc = spdk_bdev_readv_blocks(desc, io_ch, iov, BDEV_IO_NUM_CHILD_IOV + 2, 0,
1192 				    BDEV_IO_NUM_CHILD_IOV + 1, io_done, NULL);
1193 	CU_ASSERT(rc == 0);
1194 	CU_ASSERT(g_io_done == false);
1195 
1196 	CU_ASSERT(g_bdev_ut_channel->outstanding_io_count == 1);
1197 	stub_complete_io(1);
1198 	CU_ASSERT(g_io_done == false);
1199 
1200 	CU_ASSERT(g_bdev_ut_channel->outstanding_io_count == 2);
1201 	stub_complete_io(2);
1202 	CU_ASSERT(g_io_done == true);
1203 	CU_ASSERT(g_bdev_ut_channel->outstanding_io_count == 0);
1204 
1205 	/* Test multi vector command that needs to be split by strip and then needs to be
1206 	 * split further due to the capacity of child iovs, the child request offset should
1207 	 * be rewind to last aligned offset and go success without error.
1208 	 */
1209 	for (i = 0; i < BDEV_IO_NUM_CHILD_IOV - 1; i++) {
1210 		iov[i].iov_base = (void *)((i + 1) * 0x10000);
1211 		iov[i].iov_len = 512;
1212 	}
1213 	iov[BDEV_IO_NUM_CHILD_IOV - 1].iov_base = (void *)(BDEV_IO_NUM_CHILD_IOV * 0x10000);
1214 	iov[BDEV_IO_NUM_CHILD_IOV - 1].iov_len = 256;
1215 
1216 	iov[BDEV_IO_NUM_CHILD_IOV].iov_base = (void *)((BDEV_IO_NUM_CHILD_IOV + 1) * 0x10000);
1217 	iov[BDEV_IO_NUM_CHILD_IOV].iov_len = 256;
1218 
1219 	iov[BDEV_IO_NUM_CHILD_IOV + 1].iov_base = (void *)((BDEV_IO_NUM_CHILD_IOV + 2) * 0x10000);
1220 	iov[BDEV_IO_NUM_CHILD_IOV + 1].iov_len = 512;
1221 
1222 	bdev->optimal_io_boundary = BDEV_IO_NUM_CHILD_IOV;
1223 	g_io_done = false;
1224 	g_io_status = 0;
1225 	/* The first expected io should be start from offset 0 to BDEV_IO_NUM_CHILD_IOV - 1 */
1226 	expected_io = ut_alloc_expected_io(SPDK_BDEV_IO_TYPE_READ, 0,
1227 					   BDEV_IO_NUM_CHILD_IOV - 1, BDEV_IO_NUM_CHILD_IOV - 1);
1228 	for (i = 0; i < BDEV_IO_NUM_CHILD_IOV - 1; i++) {
1229 		ut_expected_io_set_iov(expected_io, i,
1230 				       (void *)((i + 1) * 0x10000), 512);
1231 	}
1232 	TAILQ_INSERT_TAIL(&g_bdev_ut_channel->expected_io, expected_io, link);
1233 	/* The second expected io should be start from offset BDEV_IO_NUM_CHILD_IOV - 1 to BDEV_IO_NUM_CHILD_IOV */
1234 	expected_io = ut_alloc_expected_io(SPDK_BDEV_IO_TYPE_READ, BDEV_IO_NUM_CHILD_IOV - 1,
1235 					   1, 2);
1236 	ut_expected_io_set_iov(expected_io, 0,
1237 			       (void *)(BDEV_IO_NUM_CHILD_IOV * 0x10000), 256);
1238 	ut_expected_io_set_iov(expected_io, 1,
1239 			       (void *)((BDEV_IO_NUM_CHILD_IOV + 1) * 0x10000), 256);
1240 	TAILQ_INSERT_TAIL(&g_bdev_ut_channel->expected_io, expected_io, link);
1241 	/* The third expected io should be start from offset BDEV_IO_NUM_CHILD_IOV to BDEV_IO_NUM_CHILD_IOV + 1 */
1242 	expected_io = ut_alloc_expected_io(SPDK_BDEV_IO_TYPE_READ, BDEV_IO_NUM_CHILD_IOV,
1243 					   1, 1);
1244 	ut_expected_io_set_iov(expected_io, 0,
1245 			       (void *)((BDEV_IO_NUM_CHILD_IOV + 2) * 0x10000), 512);
1246 	TAILQ_INSERT_TAIL(&g_bdev_ut_channel->expected_io, expected_io, link);
1247 
1248 	rc = spdk_bdev_readv_blocks(desc, io_ch, iov, BDEV_IO_NUM_CHILD_IOV * 2, 0,
1249 				    BDEV_IO_NUM_CHILD_IOV + 1, io_done, NULL);
1250 	CU_ASSERT(rc == 0);
1251 	CU_ASSERT(g_io_done == false);
1252 
1253 	CU_ASSERT(g_bdev_ut_channel->outstanding_io_count == 1);
1254 	stub_complete_io(1);
1255 	CU_ASSERT(g_io_done == false);
1256 
1257 	CU_ASSERT(g_bdev_ut_channel->outstanding_io_count == 2);
1258 	stub_complete_io(2);
1259 	CU_ASSERT(g_io_done == true);
1260 	CU_ASSERT(g_bdev_ut_channel->outstanding_io_count == 0);
1261 
1262 	/* Test a WRITE_ZEROES that would span an I/O boundary.  WRITE_ZEROES should not be
1263 	 * split, so test that.
1264 	 */
1265 	bdev->optimal_io_boundary = 15;
1266 	g_io_done = false;
1267 	expected_io = ut_alloc_expected_io(SPDK_BDEV_IO_TYPE_WRITE_ZEROES, 9, 36, 0);
1268 	TAILQ_INSERT_TAIL(&g_bdev_ut_channel->expected_io, expected_io, link);
1269 
1270 	rc = spdk_bdev_write_zeroes_blocks(desc, io_ch, 9, 36, io_done, NULL);
1271 	CU_ASSERT(rc == 0);
1272 	CU_ASSERT(g_io_done == false);
1273 	CU_ASSERT(g_bdev_ut_channel->outstanding_io_count == 1);
1274 	stub_complete_io(1);
1275 	CU_ASSERT(g_io_done == true);
1276 
1277 	/* Test an UNMAP.  This should also not be split. */
1278 	bdev->optimal_io_boundary = 16;
1279 	g_io_done = false;
1280 	expected_io = ut_alloc_expected_io(SPDK_BDEV_IO_TYPE_UNMAP, 15, 2, 0);
1281 	TAILQ_INSERT_TAIL(&g_bdev_ut_channel->expected_io, expected_io, link);
1282 
1283 	rc = spdk_bdev_unmap_blocks(desc, io_ch, 15, 2, io_done, NULL);
1284 	CU_ASSERT(rc == 0);
1285 	CU_ASSERT(g_io_done == false);
1286 	CU_ASSERT(g_bdev_ut_channel->outstanding_io_count == 1);
1287 	stub_complete_io(1);
1288 	CU_ASSERT(g_io_done == true);
1289 
1290 	/* Test a FLUSH.  This should also not be split. */
1291 	bdev->optimal_io_boundary = 16;
1292 	g_io_done = false;
1293 	expected_io = ut_alloc_expected_io(SPDK_BDEV_IO_TYPE_FLUSH, 15, 2, 0);
1294 	TAILQ_INSERT_TAIL(&g_bdev_ut_channel->expected_io, expected_io, link);
1295 
1296 	rc = spdk_bdev_flush_blocks(desc, io_ch, 15, 2, io_done, NULL);
1297 	CU_ASSERT(rc == 0);
1298 	CU_ASSERT(g_io_done == false);
1299 	CU_ASSERT(g_bdev_ut_channel->outstanding_io_count == 1);
1300 	stub_complete_io(1);
1301 	CU_ASSERT(g_io_done == true);
1302 
1303 	CU_ASSERT(TAILQ_EMPTY(&g_bdev_ut_channel->expected_io));
1304 
1305 	/* Children requests return an error status */
1306 	bdev->optimal_io_boundary = 16;
1307 	iov[0].iov_base = (void *)0x10000;
1308 	iov[0].iov_len = 512 * 64;
1309 	g_io_exp_status = SPDK_BDEV_IO_STATUS_FAILED;
1310 	g_io_done = false;
1311 	g_io_status = SPDK_BDEV_IO_STATUS_SUCCESS;
1312 
1313 	rc = spdk_bdev_readv_blocks(desc, io_ch, iov, 1, 1, 64, io_done, NULL);
1314 	CU_ASSERT(rc == 0);
1315 	CU_ASSERT(g_bdev_ut_channel->outstanding_io_count == 5);
1316 	stub_complete_io(4);
1317 	CU_ASSERT(g_io_done == false);
1318 	CU_ASSERT(g_io_status == SPDK_BDEV_IO_STATUS_SUCCESS);
1319 	stub_complete_io(1);
1320 	CU_ASSERT(g_io_done == true);
1321 	CU_ASSERT(g_io_status == SPDK_BDEV_IO_STATUS_FAILED);
1322 
1323 	spdk_put_io_channel(io_ch);
1324 	spdk_bdev_close(desc);
1325 	free_bdev(bdev);
1326 	spdk_bdev_finish(bdev_fini_cb, NULL);
1327 	poll_threads();
1328 }
1329 
1330 static void
1331 bdev_io_split_with_io_wait(void)
1332 {
1333 	struct spdk_bdev *bdev;
1334 	struct spdk_bdev_desc *desc = NULL;
1335 	struct spdk_io_channel *io_ch;
1336 	struct spdk_bdev_channel *channel;
1337 	struct spdk_bdev_mgmt_channel *mgmt_ch;
1338 	struct spdk_bdev_opts bdev_opts = {
1339 		.bdev_io_pool_size = 2,
1340 		.bdev_io_cache_size = 1,
1341 	};
1342 	struct iovec iov[3];
1343 	struct ut_expected_io *expected_io;
1344 	int rc;
1345 
1346 	rc = spdk_bdev_set_opts(&bdev_opts);
1347 	CU_ASSERT(rc == 0);
1348 	spdk_bdev_initialize(bdev_init_cb, NULL);
1349 
1350 	bdev = allocate_bdev("bdev0");
1351 
1352 	rc = spdk_bdev_open(bdev, true, NULL, NULL, &desc);
1353 	CU_ASSERT(rc == 0);
1354 	CU_ASSERT(desc != NULL);
1355 	io_ch = spdk_bdev_get_io_channel(desc);
1356 	CU_ASSERT(io_ch != NULL);
1357 	channel = spdk_io_channel_get_ctx(io_ch);
1358 	mgmt_ch = channel->shared_resource->mgmt_ch;
1359 
1360 	bdev->optimal_io_boundary = 16;
1361 	bdev->split_on_optimal_io_boundary = true;
1362 
1363 	rc = spdk_bdev_read_blocks(desc, io_ch, NULL, 0, 1, io_done, NULL);
1364 	CU_ASSERT(rc == 0);
1365 
1366 	/* Now test that a single-vector command is split correctly.
1367 	 * Offset 14, length 8, payload 0xF000
1368 	 *  Child - Offset 14, length 2, payload 0xF000
1369 	 *  Child - Offset 16, length 6, payload 0xF000 + 2 * 512
1370 	 *
1371 	 * Set up the expected values before calling spdk_bdev_read_blocks
1372 	 */
1373 	expected_io = ut_alloc_expected_io(SPDK_BDEV_IO_TYPE_READ, 14, 2, 1);
1374 	ut_expected_io_set_iov(expected_io, 0, (void *)0xF000, 2 * 512);
1375 	TAILQ_INSERT_TAIL(&g_bdev_ut_channel->expected_io, expected_io, link);
1376 
1377 	expected_io = ut_alloc_expected_io(SPDK_BDEV_IO_TYPE_READ, 16, 6, 1);
1378 	ut_expected_io_set_iov(expected_io, 0, (void *)(0xF000 + 2 * 512), 6 * 512);
1379 	TAILQ_INSERT_TAIL(&g_bdev_ut_channel->expected_io, expected_io, link);
1380 
1381 	/* The following children will be submitted sequentially due to the capacity of
1382 	 * spdk_bdev_io.
1383 	 */
1384 
1385 	/* The first child I/O will be queued to wait until an spdk_bdev_io becomes available */
1386 	rc = spdk_bdev_read_blocks(desc, io_ch, (void *)0xF000, 14, 8, io_done, NULL);
1387 	CU_ASSERT(rc == 0);
1388 	CU_ASSERT(!TAILQ_EMPTY(&mgmt_ch->io_wait_queue));
1389 	CU_ASSERT(g_bdev_ut_channel->outstanding_io_count == 1);
1390 
1391 	/* Completing the first read I/O will submit the first child */
1392 	stub_complete_io(1);
1393 	CU_ASSERT(TAILQ_EMPTY(&mgmt_ch->io_wait_queue));
1394 	CU_ASSERT(g_bdev_ut_channel->outstanding_io_count == 1);
1395 
1396 	/* Completing the first child will submit the second child */
1397 	stub_complete_io(1);
1398 	CU_ASSERT(g_bdev_ut_channel->outstanding_io_count == 1);
1399 
1400 	/* Complete the second child I/O.  This should result in our callback getting
1401 	 * invoked since the parent I/O is now complete.
1402 	 */
1403 	stub_complete_io(1);
1404 	CU_ASSERT(g_bdev_ut_channel->outstanding_io_count == 0);
1405 
1406 	/* Now set up a more complex, multi-vector command that needs to be split,
1407 	 *  including splitting iovecs.
1408 	 */
1409 	iov[0].iov_base = (void *)0x10000;
1410 	iov[0].iov_len = 512;
1411 	iov[1].iov_base = (void *)0x20000;
1412 	iov[1].iov_len = 20 * 512;
1413 	iov[2].iov_base = (void *)0x30000;
1414 	iov[2].iov_len = 11 * 512;
1415 
1416 	g_io_done = false;
1417 	expected_io = ut_alloc_expected_io(SPDK_BDEV_IO_TYPE_WRITE, 14, 2, 2);
1418 	ut_expected_io_set_iov(expected_io, 0, (void *)0x10000, 512);
1419 	ut_expected_io_set_iov(expected_io, 1, (void *)0x20000, 512);
1420 	TAILQ_INSERT_TAIL(&g_bdev_ut_channel->expected_io, expected_io, link);
1421 
1422 	expected_io = ut_alloc_expected_io(SPDK_BDEV_IO_TYPE_WRITE, 16, 16, 1);
1423 	ut_expected_io_set_iov(expected_io, 0, (void *)(0x20000 + 512), 16 * 512);
1424 	TAILQ_INSERT_TAIL(&g_bdev_ut_channel->expected_io, expected_io, link);
1425 
1426 	expected_io = ut_alloc_expected_io(SPDK_BDEV_IO_TYPE_WRITE, 32, 14, 2);
1427 	ut_expected_io_set_iov(expected_io, 0, (void *)(0x20000 + 17 * 512), 3 * 512);
1428 	ut_expected_io_set_iov(expected_io, 1, (void *)0x30000, 11 * 512);
1429 	TAILQ_INSERT_TAIL(&g_bdev_ut_channel->expected_io, expected_io, link);
1430 
1431 	rc = spdk_bdev_writev_blocks(desc, io_ch, iov, 3, 14, 32, io_done, NULL);
1432 	CU_ASSERT(rc == 0);
1433 	CU_ASSERT(g_io_done == false);
1434 
1435 	/* The following children will be submitted sequentially due to the capacity of
1436 	 * spdk_bdev_io.
1437 	 */
1438 
1439 	/* Completing the first child will submit the second child */
1440 	CU_ASSERT(g_bdev_ut_channel->outstanding_io_count == 1);
1441 	stub_complete_io(1);
1442 	CU_ASSERT(g_io_done == false);
1443 
1444 	/* Completing the second child will submit the third child */
1445 	CU_ASSERT(g_bdev_ut_channel->outstanding_io_count == 1);
1446 	stub_complete_io(1);
1447 	CU_ASSERT(g_io_done == false);
1448 
1449 	/* Completing the third child will result in our callback getting invoked
1450 	 * since the parent I/O is now complete.
1451 	 */
1452 	CU_ASSERT(g_bdev_ut_channel->outstanding_io_count == 1);
1453 	stub_complete_io(1);
1454 	CU_ASSERT(g_io_done == true);
1455 
1456 	CU_ASSERT(TAILQ_EMPTY(&g_bdev_ut_channel->expected_io));
1457 
1458 	spdk_put_io_channel(io_ch);
1459 	spdk_bdev_close(desc);
1460 	free_bdev(bdev);
1461 	spdk_bdev_finish(bdev_fini_cb, NULL);
1462 	poll_threads();
1463 }
1464 
1465 static void
1466 bdev_io_alignment(void)
1467 {
1468 	struct spdk_bdev *bdev;
1469 	struct spdk_bdev_desc *desc = NULL;
1470 	struct spdk_io_channel *io_ch;
1471 	struct spdk_bdev_opts bdev_opts = {
1472 		.bdev_io_pool_size = 20,
1473 		.bdev_io_cache_size = 2,
1474 	};
1475 	int rc;
1476 	void *buf;
1477 	struct iovec iovs[2];
1478 	int iovcnt;
1479 	uint64_t alignment;
1480 
1481 	rc = spdk_bdev_set_opts(&bdev_opts);
1482 	CU_ASSERT(rc == 0);
1483 	spdk_bdev_initialize(bdev_init_cb, NULL);
1484 
1485 	fn_table.submit_request = stub_submit_request_aligned_buffer;
1486 	bdev = allocate_bdev("bdev0");
1487 
1488 	rc = spdk_bdev_open(bdev, true, NULL, NULL, &desc);
1489 	CU_ASSERT(rc == 0);
1490 	CU_ASSERT(desc != NULL);
1491 	io_ch = spdk_bdev_get_io_channel(desc);
1492 	CU_ASSERT(io_ch != NULL);
1493 
1494 	/* Create aligned buffer */
1495 	rc = posix_memalign(&buf, 4096, 8192);
1496 	SPDK_CU_ASSERT_FATAL(rc == 0);
1497 
1498 	/* Pass aligned single buffer with no alignment required */
1499 	alignment = 1;
1500 	bdev->required_alignment = spdk_u32log2(alignment);
1501 
1502 	rc = spdk_bdev_write_blocks(desc, io_ch, buf, 0, 1, io_done, NULL);
1503 	CU_ASSERT(rc == 0);
1504 	stub_complete_io(1);
1505 	CU_ASSERT(_are_iovs_aligned(g_bdev_io->u.bdev.iovs, g_bdev_io->u.bdev.iovcnt,
1506 				    alignment));
1507 
1508 	rc = spdk_bdev_read_blocks(desc, io_ch, buf, 0, 1, io_done, NULL);
1509 	CU_ASSERT(rc == 0);
1510 	stub_complete_io(1);
1511 	CU_ASSERT(_are_iovs_aligned(g_bdev_io->u.bdev.iovs, g_bdev_io->u.bdev.iovcnt,
1512 				    alignment));
1513 
1514 	/* Pass unaligned single buffer with no alignment required */
1515 	alignment = 1;
1516 	bdev->required_alignment = spdk_u32log2(alignment);
1517 
1518 	rc = spdk_bdev_write_blocks(desc, io_ch, buf + 4, 0, 1, io_done, NULL);
1519 	CU_ASSERT(rc == 0);
1520 	CU_ASSERT(g_bdev_io->internal.orig_iovcnt == 0);
1521 	CU_ASSERT(g_bdev_io->u.bdev.iovs[0].iov_base == buf + 4);
1522 	stub_complete_io(1);
1523 
1524 	rc = spdk_bdev_read_blocks(desc, io_ch, buf + 4, 0, 1, io_done, NULL);
1525 	CU_ASSERT(rc == 0);
1526 	CU_ASSERT(g_bdev_io->internal.orig_iovcnt == 0);
1527 	CU_ASSERT(g_bdev_io->u.bdev.iovs[0].iov_base == buf + 4);
1528 	stub_complete_io(1);
1529 
1530 	/* Pass unaligned single buffer with 512 alignment required */
1531 	alignment = 512;
1532 	bdev->required_alignment = spdk_u32log2(alignment);
1533 
1534 	rc = spdk_bdev_write_blocks(desc, io_ch, buf + 4, 0, 1, io_done, NULL);
1535 	CU_ASSERT(rc == 0);
1536 	CU_ASSERT(g_bdev_io->internal.orig_iovcnt == 1);
1537 	CU_ASSERT(g_bdev_io->u.bdev.iovs == &g_bdev_io->internal.bounce_iov);
1538 	CU_ASSERT(_are_iovs_aligned(g_bdev_io->u.bdev.iovs, g_bdev_io->u.bdev.iovcnt,
1539 				    alignment));
1540 	stub_complete_io(1);
1541 	CU_ASSERT(g_bdev_io->internal.orig_iovcnt == 0);
1542 
1543 	rc = spdk_bdev_read_blocks(desc, io_ch, buf + 4, 0, 1, io_done, NULL);
1544 	CU_ASSERT(rc == 0);
1545 	CU_ASSERT(g_bdev_io->internal.orig_iovcnt == 1);
1546 	CU_ASSERT(g_bdev_io->u.bdev.iovs == &g_bdev_io->internal.bounce_iov);
1547 	CU_ASSERT(_are_iovs_aligned(g_bdev_io->u.bdev.iovs, g_bdev_io->u.bdev.iovcnt,
1548 				    alignment));
1549 	stub_complete_io(1);
1550 	CU_ASSERT(g_bdev_io->internal.orig_iovcnt == 0);
1551 
1552 	/* Pass unaligned single buffer with 4096 alignment required */
1553 	alignment = 4096;
1554 	bdev->required_alignment = spdk_u32log2(alignment);
1555 
1556 	rc = spdk_bdev_write_blocks(desc, io_ch, buf + 8, 0, 1, io_done, NULL);
1557 	CU_ASSERT(rc == 0);
1558 	CU_ASSERT(g_bdev_io->internal.orig_iovcnt == 1);
1559 	CU_ASSERT(g_bdev_io->u.bdev.iovs == &g_bdev_io->internal.bounce_iov);
1560 	CU_ASSERT(_are_iovs_aligned(g_bdev_io->u.bdev.iovs, g_bdev_io->u.bdev.iovcnt,
1561 				    alignment));
1562 	stub_complete_io(1);
1563 	CU_ASSERT(g_bdev_io->internal.orig_iovcnt == 0);
1564 
1565 	rc = spdk_bdev_read_blocks(desc, io_ch, buf + 8, 0, 1, io_done, NULL);
1566 	CU_ASSERT(rc == 0);
1567 	CU_ASSERT(g_bdev_io->internal.orig_iovcnt == 1);
1568 	CU_ASSERT(g_bdev_io->u.bdev.iovs == &g_bdev_io->internal.bounce_iov);
1569 	CU_ASSERT(_are_iovs_aligned(g_bdev_io->u.bdev.iovs, g_bdev_io->u.bdev.iovcnt,
1570 				    alignment));
1571 	stub_complete_io(1);
1572 	CU_ASSERT(g_bdev_io->internal.orig_iovcnt == 0);
1573 
1574 	/* Pass aligned iovs with no alignment required */
1575 	alignment = 1;
1576 	bdev->required_alignment = spdk_u32log2(alignment);
1577 
1578 	iovcnt = 1;
1579 	iovs[0].iov_base = buf;
1580 	iovs[0].iov_len = 512;
1581 
1582 	rc = spdk_bdev_writev(desc, io_ch, iovs, iovcnt, 0, 512, io_done, NULL);
1583 	CU_ASSERT(rc == 0);
1584 	CU_ASSERT(g_bdev_io->internal.orig_iovcnt == 0);
1585 	stub_complete_io(1);
1586 	CU_ASSERT(g_bdev_io->u.bdev.iovs[0].iov_base == iovs[0].iov_base);
1587 
1588 	rc = spdk_bdev_readv(desc, io_ch, iovs, iovcnt, 0, 512, io_done, NULL);
1589 	CU_ASSERT(rc == 0);
1590 	CU_ASSERT(g_bdev_io->internal.orig_iovcnt == 0);
1591 	stub_complete_io(1);
1592 	CU_ASSERT(g_bdev_io->u.bdev.iovs[0].iov_base == iovs[0].iov_base);
1593 
1594 	/* Pass unaligned iovs with no alignment required */
1595 	alignment = 1;
1596 	bdev->required_alignment = spdk_u32log2(alignment);
1597 
1598 	iovcnt = 2;
1599 	iovs[0].iov_base = buf + 16;
1600 	iovs[0].iov_len = 256;
1601 	iovs[1].iov_base = buf + 16 + 256 + 32;
1602 	iovs[1].iov_len = 256;
1603 
1604 	rc = spdk_bdev_writev(desc, io_ch, iovs, iovcnt, 0, 512, io_done, NULL);
1605 	CU_ASSERT(rc == 0);
1606 	CU_ASSERT(g_bdev_io->internal.orig_iovcnt == 0);
1607 	stub_complete_io(1);
1608 	CU_ASSERT(g_bdev_io->u.bdev.iovs[0].iov_base == iovs[0].iov_base);
1609 
1610 	rc = spdk_bdev_readv(desc, io_ch, iovs, iovcnt, 0, 512, io_done, NULL);
1611 	CU_ASSERT(rc == 0);
1612 	CU_ASSERT(g_bdev_io->internal.orig_iovcnt == 0);
1613 	stub_complete_io(1);
1614 	CU_ASSERT(g_bdev_io->u.bdev.iovs[0].iov_base == iovs[0].iov_base);
1615 
1616 	/* Pass unaligned iov with 2048 alignment required */
1617 	alignment = 2048;
1618 	bdev->required_alignment = spdk_u32log2(alignment);
1619 
1620 	iovcnt = 2;
1621 	iovs[0].iov_base = buf + 16;
1622 	iovs[0].iov_len = 256;
1623 	iovs[1].iov_base = buf + 16 + 256 + 32;
1624 	iovs[1].iov_len = 256;
1625 
1626 	rc = spdk_bdev_writev(desc, io_ch, iovs, iovcnt, 0, 512, io_done, NULL);
1627 	CU_ASSERT(rc == 0);
1628 	CU_ASSERT(g_bdev_io->internal.orig_iovcnt == iovcnt);
1629 	CU_ASSERT(g_bdev_io->u.bdev.iovs == &g_bdev_io->internal.bounce_iov);
1630 	CU_ASSERT(_are_iovs_aligned(g_bdev_io->u.bdev.iovs, g_bdev_io->u.bdev.iovcnt,
1631 				    alignment));
1632 	stub_complete_io(1);
1633 	CU_ASSERT(g_bdev_io->internal.orig_iovcnt == 0);
1634 
1635 	rc = spdk_bdev_readv(desc, io_ch, iovs, iovcnt, 0, 512, io_done, NULL);
1636 	CU_ASSERT(rc == 0);
1637 	CU_ASSERT(g_bdev_io->internal.orig_iovcnt == iovcnt);
1638 	CU_ASSERT(g_bdev_io->u.bdev.iovs == &g_bdev_io->internal.bounce_iov);
1639 	CU_ASSERT(_are_iovs_aligned(g_bdev_io->u.bdev.iovs, g_bdev_io->u.bdev.iovcnt,
1640 				    alignment));
1641 	stub_complete_io(1);
1642 	CU_ASSERT(g_bdev_io->internal.orig_iovcnt == 0);
1643 
1644 	/* Pass iov without allocated buffer without alignment required */
1645 	alignment = 1;
1646 	bdev->required_alignment = spdk_u32log2(alignment);
1647 
1648 	iovcnt = 1;
1649 	iovs[0].iov_base = NULL;
1650 	iovs[0].iov_len = 0;
1651 
1652 	rc = spdk_bdev_readv(desc, io_ch, iovs, iovcnt, 0, 512, io_done, NULL);
1653 	CU_ASSERT(rc == 0);
1654 	CU_ASSERT(g_bdev_io->internal.orig_iovcnt == 0);
1655 	CU_ASSERT(_are_iovs_aligned(g_bdev_io->u.bdev.iovs, g_bdev_io->u.bdev.iovcnt,
1656 				    alignment));
1657 	stub_complete_io(1);
1658 
1659 	/* Pass iov without allocated buffer with 1024 alignment required */
1660 	alignment = 1024;
1661 	bdev->required_alignment = spdk_u32log2(alignment);
1662 
1663 	iovcnt = 1;
1664 	iovs[0].iov_base = NULL;
1665 	iovs[0].iov_len = 0;
1666 
1667 	rc = spdk_bdev_readv(desc, io_ch, iovs, iovcnt, 0, 512, io_done, NULL);
1668 	CU_ASSERT(rc == 0);
1669 	CU_ASSERT(g_bdev_io->internal.orig_iovcnt == 0);
1670 	CU_ASSERT(_are_iovs_aligned(g_bdev_io->u.bdev.iovs, g_bdev_io->u.bdev.iovcnt,
1671 				    alignment));
1672 	stub_complete_io(1);
1673 
1674 	spdk_put_io_channel(io_ch);
1675 	spdk_bdev_close(desc);
1676 	free_bdev(bdev);
1677 	spdk_bdev_finish(bdev_fini_cb, NULL);
1678 	poll_threads();
1679 
1680 	free(buf);
1681 }
1682 
1683 static void
1684 bdev_io_alignment_with_boundary(void)
1685 {
1686 	struct spdk_bdev *bdev;
1687 	struct spdk_bdev_desc *desc = NULL;
1688 	struct spdk_io_channel *io_ch;
1689 	struct spdk_bdev_opts bdev_opts = {
1690 		.bdev_io_pool_size = 20,
1691 		.bdev_io_cache_size = 2,
1692 	};
1693 	int rc;
1694 	void *buf;
1695 	struct iovec iovs[2];
1696 	int iovcnt;
1697 	uint64_t alignment;
1698 
1699 	rc = spdk_bdev_set_opts(&bdev_opts);
1700 	CU_ASSERT(rc == 0);
1701 	spdk_bdev_initialize(bdev_init_cb, NULL);
1702 
1703 	fn_table.submit_request = stub_submit_request_aligned_buffer;
1704 	bdev = allocate_bdev("bdev0");
1705 
1706 	rc = spdk_bdev_open(bdev, true, NULL, NULL, &desc);
1707 	CU_ASSERT(rc == 0);
1708 	CU_ASSERT(desc != NULL);
1709 	io_ch = spdk_bdev_get_io_channel(desc);
1710 	CU_ASSERT(io_ch != NULL);
1711 
1712 	/* Create aligned buffer */
1713 	rc = posix_memalign(&buf, 4096, 131072);
1714 	SPDK_CU_ASSERT_FATAL(rc == 0);
1715 	g_io_exp_status = SPDK_BDEV_IO_STATUS_SUCCESS;
1716 
1717 	/* 512 * 3 with 2 IO boundary, allocate small data buffer from bdev layer */
1718 	alignment = 512;
1719 	bdev->required_alignment = spdk_u32log2(alignment);
1720 	bdev->optimal_io_boundary = 2;
1721 	bdev->split_on_optimal_io_boundary = true;
1722 
1723 	iovcnt = 1;
1724 	iovs[0].iov_base = NULL;
1725 	iovs[0].iov_len = 512 * 3;
1726 
1727 	rc = spdk_bdev_readv_blocks(desc, io_ch, iovs, iovcnt, 1, 3, io_done, NULL);
1728 	CU_ASSERT(rc == 0);
1729 	CU_ASSERT(g_bdev_ut_channel->outstanding_io_count == 2);
1730 	stub_complete_io(2);
1731 
1732 	/* 8KiB with 16 IO boundary, allocate large data buffer from bdev layer */
1733 	alignment = 512;
1734 	bdev->required_alignment = spdk_u32log2(alignment);
1735 	bdev->optimal_io_boundary = 16;
1736 	bdev->split_on_optimal_io_boundary = true;
1737 
1738 	iovcnt = 1;
1739 	iovs[0].iov_base = NULL;
1740 	iovs[0].iov_len = 512 * 16;
1741 
1742 	rc = spdk_bdev_readv_blocks(desc, io_ch, iovs, iovcnt, 1, 16, io_done, NULL);
1743 	CU_ASSERT(rc == 0);
1744 	CU_ASSERT(g_bdev_ut_channel->outstanding_io_count == 2);
1745 	stub_complete_io(2);
1746 
1747 	/* 512 * 160 with 128 IO boundary, 63.5KiB + 16.5KiB for the two children requests */
1748 	alignment = 512;
1749 	bdev->required_alignment = spdk_u32log2(alignment);
1750 	bdev->optimal_io_boundary = 128;
1751 	bdev->split_on_optimal_io_boundary = true;
1752 
1753 	iovcnt = 1;
1754 	iovs[0].iov_base = buf + 16;
1755 	iovs[0].iov_len = 512 * 160;
1756 	rc = spdk_bdev_readv_blocks(desc, io_ch, iovs, iovcnt, 1, 160, io_done, NULL);
1757 	CU_ASSERT(rc == 0);
1758 	CU_ASSERT(g_bdev_ut_channel->outstanding_io_count == 2);
1759 	stub_complete_io(2);
1760 
1761 	/* 512 * 3 with 2 IO boundary */
1762 	alignment = 512;
1763 	bdev->required_alignment = spdk_u32log2(alignment);
1764 	bdev->optimal_io_boundary = 2;
1765 	bdev->split_on_optimal_io_boundary = true;
1766 
1767 	iovcnt = 2;
1768 	iovs[0].iov_base = buf + 16;
1769 	iovs[0].iov_len = 512;
1770 	iovs[1].iov_base = buf + 16 + 512 + 32;
1771 	iovs[1].iov_len = 1024;
1772 
1773 	rc = spdk_bdev_writev_blocks(desc, io_ch, iovs, iovcnt, 1, 3, io_done, NULL);
1774 	CU_ASSERT(rc == 0);
1775 	CU_ASSERT(g_bdev_ut_channel->outstanding_io_count == 2);
1776 	stub_complete_io(2);
1777 
1778 	rc = spdk_bdev_readv_blocks(desc, io_ch, iovs, iovcnt, 1, 3, io_done, NULL);
1779 	CU_ASSERT(rc == 0);
1780 	CU_ASSERT(g_bdev_ut_channel->outstanding_io_count == 2);
1781 	stub_complete_io(2);
1782 
1783 	/* 512 * 64 with 32 IO boundary */
1784 	bdev->optimal_io_boundary = 32;
1785 	iovcnt = 2;
1786 	iovs[0].iov_base = buf + 16;
1787 	iovs[0].iov_len = 16384;
1788 	iovs[1].iov_base = buf + 16 + 16384 + 32;
1789 	iovs[1].iov_len = 16384;
1790 
1791 	rc = spdk_bdev_writev_blocks(desc, io_ch, iovs, iovcnt, 1, 64, io_done, NULL);
1792 	CU_ASSERT(rc == 0);
1793 	CU_ASSERT(g_bdev_ut_channel->outstanding_io_count == 3);
1794 	stub_complete_io(3);
1795 
1796 	rc = spdk_bdev_readv_blocks(desc, io_ch, iovs, iovcnt, 1, 64, io_done, NULL);
1797 	CU_ASSERT(rc == 0);
1798 	CU_ASSERT(g_bdev_ut_channel->outstanding_io_count == 3);
1799 	stub_complete_io(3);
1800 
1801 	/* 512 * 160 with 32 IO boundary */
1802 	iovcnt = 1;
1803 	iovs[0].iov_base = buf + 16;
1804 	iovs[0].iov_len = 16384 + 65536;
1805 
1806 	rc = spdk_bdev_writev_blocks(desc, io_ch, iovs, iovcnt, 1, 160, io_done, NULL);
1807 	CU_ASSERT(rc == 0);
1808 	CU_ASSERT(g_bdev_ut_channel->outstanding_io_count == 6);
1809 	stub_complete_io(6);
1810 
1811 	spdk_put_io_channel(io_ch);
1812 	spdk_bdev_close(desc);
1813 	free_bdev(bdev);
1814 	spdk_bdev_finish(bdev_fini_cb, NULL);
1815 	poll_threads();
1816 
1817 	free(buf);
1818 }
1819 
1820 static void
1821 histogram_status_cb(void *cb_arg, int status)
1822 {
1823 	g_status = status;
1824 }
1825 
1826 static void
1827 histogram_data_cb(void *cb_arg, int status, struct spdk_histogram_data *histogram)
1828 {
1829 	g_status = status;
1830 	g_histogram = histogram;
1831 }
1832 
1833 static void
1834 histogram_io_count(void *ctx, uint64_t start, uint64_t end, uint64_t count,
1835 		   uint64_t total, uint64_t so_far)
1836 {
1837 	g_count += count;
1838 }
1839 
1840 static void
1841 bdev_histograms(void)
1842 {
1843 	struct spdk_bdev *bdev;
1844 	struct spdk_bdev_desc *desc = NULL;
1845 	struct spdk_io_channel *ch;
1846 	struct spdk_histogram_data *histogram;
1847 	uint8_t buf[4096];
1848 	int rc;
1849 
1850 	spdk_bdev_initialize(bdev_init_cb, NULL);
1851 
1852 	bdev = allocate_bdev("bdev");
1853 
1854 	rc = spdk_bdev_open(bdev, true, NULL, NULL, &desc);
1855 	CU_ASSERT(rc == 0);
1856 	CU_ASSERT(desc != NULL);
1857 
1858 	ch = spdk_bdev_get_io_channel(desc);
1859 	CU_ASSERT(ch != NULL);
1860 
1861 	/* Enable histogram */
1862 	g_status = -1;
1863 	spdk_bdev_histogram_enable(bdev, histogram_status_cb, NULL, true);
1864 	poll_threads();
1865 	CU_ASSERT(g_status == 0);
1866 	CU_ASSERT(bdev->internal.histogram_enabled == true);
1867 
1868 	/* Allocate histogram */
1869 	histogram = spdk_histogram_data_alloc();
1870 	SPDK_CU_ASSERT_FATAL(histogram != NULL);
1871 
1872 	/* Check if histogram is zeroed */
1873 	spdk_bdev_histogram_get(bdev, histogram, histogram_data_cb, NULL);
1874 	poll_threads();
1875 	CU_ASSERT(g_status == 0);
1876 	SPDK_CU_ASSERT_FATAL(g_histogram != NULL);
1877 
1878 	g_count = 0;
1879 	spdk_histogram_data_iterate(g_histogram, histogram_io_count, NULL);
1880 
1881 	CU_ASSERT(g_count == 0);
1882 
1883 	rc = spdk_bdev_write_blocks(desc, ch, &buf, 0, 1, io_done, NULL);
1884 	CU_ASSERT(rc == 0);
1885 
1886 	spdk_delay_us(10);
1887 	stub_complete_io(1);
1888 	poll_threads();
1889 
1890 	rc = spdk_bdev_read_blocks(desc, ch, &buf, 0, 1, io_done, NULL);
1891 	CU_ASSERT(rc == 0);
1892 
1893 	spdk_delay_us(10);
1894 	stub_complete_io(1);
1895 	poll_threads();
1896 
1897 	/* Check if histogram gathered data from all I/O channels */
1898 	g_histogram = NULL;
1899 	spdk_bdev_histogram_get(bdev, histogram, histogram_data_cb, NULL);
1900 	poll_threads();
1901 	CU_ASSERT(g_status == 0);
1902 	CU_ASSERT(bdev->internal.histogram_enabled == true);
1903 	SPDK_CU_ASSERT_FATAL(g_histogram != NULL);
1904 
1905 	g_count = 0;
1906 	spdk_histogram_data_iterate(g_histogram, histogram_io_count, NULL);
1907 	CU_ASSERT(g_count == 2);
1908 
1909 	/* Disable histogram */
1910 	spdk_bdev_histogram_enable(bdev, histogram_status_cb, NULL, false);
1911 	poll_threads();
1912 	CU_ASSERT(g_status == 0);
1913 	CU_ASSERT(bdev->internal.histogram_enabled == false);
1914 
1915 	/* Try to run histogram commands on disabled bdev */
1916 	spdk_bdev_histogram_get(bdev, histogram, histogram_data_cb, NULL);
1917 	poll_threads();
1918 	CU_ASSERT(g_status == -EFAULT);
1919 
1920 	spdk_histogram_data_free(histogram);
1921 	spdk_put_io_channel(ch);
1922 	spdk_bdev_close(desc);
1923 	free_bdev(bdev);
1924 	spdk_bdev_finish(bdev_fini_cb, NULL);
1925 	poll_threads();
1926 }
1927 
1928 static void
1929 bdev_write_zeroes(void)
1930 {
1931 	struct spdk_bdev *bdev;
1932 	struct spdk_bdev_desc *desc = NULL;
1933 	struct spdk_io_channel *ioch;
1934 	struct ut_expected_io *expected_io;
1935 	uint64_t offset, num_io_blocks, num_blocks;
1936 	uint32_t num_completed, num_requests;
1937 	int rc;
1938 
1939 	spdk_bdev_initialize(bdev_init_cb, NULL);
1940 	bdev = allocate_bdev("bdev");
1941 
1942 	rc = spdk_bdev_open(bdev, true, NULL, NULL, &desc);
1943 	CU_ASSERT_EQUAL(rc, 0);
1944 	SPDK_CU_ASSERT_FATAL(desc != NULL);
1945 	ioch = spdk_bdev_get_io_channel(desc);
1946 	SPDK_CU_ASSERT_FATAL(ioch != NULL);
1947 
1948 	fn_table.submit_request = stub_submit_request;
1949 	g_io_exp_status = SPDK_BDEV_IO_STATUS_SUCCESS;
1950 
1951 	/* First test that if the bdev supports write_zeroes, the request won't be split */
1952 	bdev->md_len = 0;
1953 	bdev->blocklen = 4096;
1954 	num_blocks = (ZERO_BUFFER_SIZE / bdev->blocklen) * 2;
1955 
1956 	expected_io = ut_alloc_expected_io(SPDK_BDEV_IO_TYPE_WRITE_ZEROES, 0, num_blocks, 0);
1957 	TAILQ_INSERT_TAIL(&g_bdev_ut_channel->expected_io, expected_io, link);
1958 	rc = spdk_bdev_write_zeroes_blocks(desc, ioch, 0, num_blocks, io_done, NULL);
1959 	CU_ASSERT_EQUAL(rc, 0);
1960 	num_completed = stub_complete_io(1);
1961 	CU_ASSERT_EQUAL(num_completed, 1);
1962 
1963 	/* Check that if write zeroes is not supported it'll be replaced by regular writes */
1964 	ut_enable_io_type(SPDK_BDEV_IO_TYPE_WRITE_ZEROES, false);
1965 	num_io_blocks = ZERO_BUFFER_SIZE / bdev->blocklen;
1966 	num_requests = 2;
1967 	num_blocks = (ZERO_BUFFER_SIZE / bdev->blocklen) * num_requests;
1968 
1969 	for (offset = 0; offset < num_requests; ++offset) {
1970 		expected_io = ut_alloc_expected_io(SPDK_BDEV_IO_TYPE_WRITE,
1971 						   offset * num_io_blocks, num_io_blocks, 0);
1972 		TAILQ_INSERT_TAIL(&g_bdev_ut_channel->expected_io, expected_io, link);
1973 	}
1974 
1975 	rc = spdk_bdev_write_zeroes_blocks(desc, ioch, 0, num_blocks, io_done, NULL);
1976 	CU_ASSERT_EQUAL(rc, 0);
1977 	num_completed = stub_complete_io(num_requests);
1978 	CU_ASSERT_EQUAL(num_completed, num_requests);
1979 
1980 	/* Check that the splitting is correct if bdev has interleaved metadata */
1981 	bdev->md_interleave = true;
1982 	bdev->md_len = 64;
1983 	bdev->blocklen = 4096 + 64;
1984 	num_blocks = (ZERO_BUFFER_SIZE / bdev->blocklen) * 2;
1985 
1986 	num_requests = offset = 0;
1987 	while (offset < num_blocks) {
1988 		num_io_blocks = spdk_min(ZERO_BUFFER_SIZE / bdev->blocklen, num_blocks - offset);
1989 		expected_io = ut_alloc_expected_io(SPDK_BDEV_IO_TYPE_WRITE,
1990 						   offset, num_io_blocks, 0);
1991 		TAILQ_INSERT_TAIL(&g_bdev_ut_channel->expected_io, expected_io, link);
1992 		offset += num_io_blocks;
1993 		num_requests++;
1994 	}
1995 
1996 	rc = spdk_bdev_write_zeroes_blocks(desc, ioch, 0, num_blocks, io_done, NULL);
1997 	CU_ASSERT_EQUAL(rc, 0);
1998 	num_completed = stub_complete_io(num_requests);
1999 	CU_ASSERT_EQUAL(num_completed, num_requests);
2000 	num_completed = stub_complete_io(num_requests);
2001 	assert(num_completed == 0);
2002 
2003 	/* Check the the same for separate metadata buffer */
2004 	bdev->md_interleave = false;
2005 	bdev->md_len = 64;
2006 	bdev->blocklen = 4096;
2007 
2008 	num_requests = offset = 0;
2009 	while (offset < num_blocks) {
2010 		num_io_blocks = spdk_min(ZERO_BUFFER_SIZE / (bdev->blocklen + bdev->md_len), num_blocks);
2011 		expected_io = ut_alloc_expected_io(SPDK_BDEV_IO_TYPE_WRITE,
2012 						   offset, num_io_blocks, 0);
2013 		expected_io->md_buf = (char *)g_bdev_mgr.zero_buffer + num_io_blocks * bdev->blocklen;
2014 		TAILQ_INSERT_TAIL(&g_bdev_ut_channel->expected_io, expected_io, link);
2015 		offset += num_io_blocks;
2016 		num_requests++;
2017 	}
2018 
2019 	rc = spdk_bdev_write_zeroes_blocks(desc, ioch, 0, num_blocks, io_done, NULL);
2020 	CU_ASSERT_EQUAL(rc, 0);
2021 	num_completed = stub_complete_io(num_requests);
2022 	CU_ASSERT_EQUAL(num_completed, num_requests);
2023 
2024 	ut_enable_io_type(SPDK_BDEV_IO_TYPE_WRITE_ZEROES, true);
2025 	spdk_put_io_channel(ioch);
2026 	spdk_bdev_close(desc);
2027 	free_bdev(bdev);
2028 	spdk_bdev_finish(bdev_fini_cb, NULL);
2029 	poll_threads();
2030 }
2031 
2032 static void
2033 bdev_open_while_hotremove(void)
2034 {
2035 	struct spdk_bdev *bdev;
2036 	struct spdk_bdev_desc *desc[2] = {};
2037 	int rc;
2038 
2039 	bdev = allocate_bdev("bdev");
2040 
2041 	rc = spdk_bdev_open(bdev, false, NULL, NULL, &desc[0]);
2042 	CU_ASSERT(rc == 0);
2043 	SPDK_CU_ASSERT_FATAL(desc[0] != NULL);
2044 
2045 	spdk_bdev_unregister(bdev, NULL, NULL);
2046 
2047 	rc = spdk_bdev_open(bdev, false, NULL, NULL, &desc[1]);
2048 	CU_ASSERT(rc == -ENODEV);
2049 	SPDK_CU_ASSERT_FATAL(desc[1] == NULL);
2050 
2051 	spdk_bdev_close(desc[0]);
2052 	free_bdev(bdev);
2053 }
2054 
2055 static void
2056 bdev_close_while_hotremove(void)
2057 {
2058 	struct spdk_bdev *bdev;
2059 	struct spdk_bdev_desc *desc = NULL;
2060 	int rc = 0;
2061 
2062 	bdev = allocate_bdev("bdev");
2063 
2064 	rc = spdk_bdev_open_ext("bdev", true, bdev_open_cb1, &desc, &desc);
2065 	CU_ASSERT_EQUAL(rc, 0);
2066 
2067 	/* Simulate hot-unplug by unregistering bdev */
2068 	g_event_type1 = 0xFF;
2069 	g_unregister_arg = NULL;
2070 	g_unregister_rc = -1;
2071 	spdk_bdev_unregister(bdev, bdev_unregister_cb, (void *)0x12345678);
2072 	/* Close device while remove event is in flight */
2073 	spdk_bdev_close(desc);
2074 
2075 	/* Ensure that unregister callback is delayed */
2076 	CU_ASSERT_EQUAL(g_unregister_arg, NULL);
2077 	CU_ASSERT_EQUAL(g_unregister_rc, -1);
2078 
2079 	poll_threads();
2080 
2081 	/* Event callback shall not be issued because device was closed */
2082 	CU_ASSERT_EQUAL(g_event_type1, 0xFF);
2083 	/* Unregister callback is issued */
2084 	CU_ASSERT_EQUAL(g_unregister_arg, (void *)0x12345678);
2085 	CU_ASSERT_EQUAL(g_unregister_rc, 0);
2086 
2087 	free_bdev(bdev);
2088 }
2089 
2090 static void
2091 bdev_open_ext(void)
2092 {
2093 	struct spdk_bdev *bdev;
2094 	struct spdk_bdev_desc *desc1 = NULL;
2095 	struct spdk_bdev_desc *desc2 = NULL;
2096 	int rc = 0;
2097 
2098 	bdev = allocate_bdev("bdev");
2099 
2100 	rc = spdk_bdev_open_ext("bdev", true, NULL, NULL, &desc1);
2101 	CU_ASSERT_EQUAL(rc, -EINVAL);
2102 
2103 	rc = spdk_bdev_open_ext("bdev", true, bdev_open_cb1, &desc1, &desc1);
2104 	CU_ASSERT_EQUAL(rc, 0);
2105 
2106 	rc = spdk_bdev_open_ext("bdev", true, bdev_open_cb2, &desc2, &desc2);
2107 	CU_ASSERT_EQUAL(rc, 0);
2108 
2109 	g_event_type1 = 0xFF;
2110 	g_event_type2 = 0xFF;
2111 
2112 	/* Simulate hot-unplug by unregistering bdev */
2113 	spdk_bdev_unregister(bdev, NULL, NULL);
2114 	poll_threads();
2115 
2116 	/* Check if correct events have been triggered in event callback fn */
2117 	CU_ASSERT_EQUAL(g_event_type1, SPDK_BDEV_EVENT_REMOVE);
2118 	CU_ASSERT_EQUAL(g_event_type2, SPDK_BDEV_EVENT_REMOVE);
2119 
2120 	free_bdev(bdev);
2121 	poll_threads();
2122 }
2123 
2124 int
2125 main(int argc, char **argv)
2126 {
2127 	CU_pSuite		suite = NULL;
2128 	unsigned int		num_failures;
2129 
2130 	if (CU_initialize_registry() != CUE_SUCCESS) {
2131 		return CU_get_error();
2132 	}
2133 
2134 	suite = CU_add_suite("bdev", null_init, null_clean);
2135 	if (suite == NULL) {
2136 		CU_cleanup_registry();
2137 		return CU_get_error();
2138 	}
2139 
2140 	if (
2141 		CU_add_test(suite, "bytes_to_blocks_test", bytes_to_blocks_test) == NULL ||
2142 		CU_add_test(suite, "num_blocks_test", num_blocks_test) == NULL ||
2143 		CU_add_test(suite, "io_valid", io_valid_test) == NULL ||
2144 		CU_add_test(suite, "open_write", open_write_test) == NULL ||
2145 		CU_add_test(suite, "alias_add_del", alias_add_del_test) == NULL ||
2146 		CU_add_test(suite, "get_device_stat", get_device_stat_test) == NULL ||
2147 		CU_add_test(suite, "bdev_io_types", bdev_io_types_test) == NULL ||
2148 		CU_add_test(suite, "bdev_io_wait", bdev_io_wait_test) == NULL ||
2149 		CU_add_test(suite, "bdev_io_spans_boundary", bdev_io_spans_boundary_test) == NULL ||
2150 		CU_add_test(suite, "bdev_io_split", bdev_io_split) == NULL ||
2151 		CU_add_test(suite, "bdev_io_split_with_io_wait", bdev_io_split_with_io_wait) == NULL ||
2152 		CU_add_test(suite, "bdev_io_alignment_with_boundary", bdev_io_alignment_with_boundary) == NULL ||
2153 		CU_add_test(suite, "bdev_io_alignment", bdev_io_alignment) == NULL ||
2154 		CU_add_test(suite, "bdev_histograms", bdev_histograms) == NULL ||
2155 		CU_add_test(suite, "bdev_write_zeroes", bdev_write_zeroes) == NULL ||
2156 		CU_add_test(suite, "bdev_open_while_hotremove", bdev_open_while_hotremove) == NULL ||
2157 		CU_add_test(suite, "bdev_close_while_hotremove", bdev_close_while_hotremove) == NULL ||
2158 		CU_add_test(suite, "bdev_open_ext", bdev_open_ext) == NULL
2159 	) {
2160 		CU_cleanup_registry();
2161 		return CU_get_error();
2162 	}
2163 
2164 	allocate_threads(1);
2165 	set_thread(0);
2166 
2167 	CU_basic_set_mode(CU_BRM_VERBOSE);
2168 	CU_basic_run_tests();
2169 	num_failures = CU_get_number_of_failures();
2170 	CU_cleanup_registry();
2171 
2172 	free_threads();
2173 
2174 	return num_failures;
2175 }
2176