1488570ebSJim Harris /* SPDX-License-Identifier: BSD-3-Clause
2a6dbe372Spaul luse * Copyright (C) 2019 Intel Corporation.
3861010b2Sdongx.yi * All rights reserved.
4861010b2Sdongx.yi */
5861010b2Sdongx.yi
6861010b2Sdongx.yi #include "spdk/stdinc.h"
7ae431e31SKonrad Sztyber #include "spdk_internal/cunit.h"
8861010b2Sdongx.yi #include "spdk/env.h"
9861010b2Sdongx.yi #include "spdk_internal/mock.h"
10861010b2Sdongx.yi
11861010b2Sdongx.yi #include "bdev/bdev_zone.c"
12861010b2Sdongx.yi
13a1d68e9cSJim Harris DEFINE_STUB_V(bdev_io_init, (struct spdk_bdev_io *bdev_io,
14861010b2Sdongx.yi struct spdk_bdev *bdev, void *cb_arg,
15861010b2Sdongx.yi spdk_bdev_io_completion_cb cb));
16861010b2Sdongx.yi
176c07e9d1SJim Harris DEFINE_STUB_V(bdev_io_submit, (struct spdk_bdev_io *bdev_io));
18861010b2Sdongx.yi
19861010b2Sdongx.yi /* Construct zone_io_operation structure */
20861010b2Sdongx.yi struct zone_io_operation {
21861010b2Sdongx.yi struct spdk_bdev_desc *desc;
22861010b2Sdongx.yi struct spdk_io_channel *ch;
23861010b2Sdongx.yi struct iovec iov;
24861010b2Sdongx.yi union {
25861010b2Sdongx.yi struct {
26861010b2Sdongx.yi uint64_t zone_id;
27861010b2Sdongx.yi size_t num_zones;
28861010b2Sdongx.yi enum spdk_bdev_zone_action zone_action;
29861010b2Sdongx.yi void *buf;
30861010b2Sdongx.yi struct spdk_bdev_zone_info *info_;
31861010b2Sdongx.yi } zone_mgmt;
32861010b2Sdongx.yi struct {
33861010b2Sdongx.yi void *md_buf;
34861010b2Sdongx.yi struct iovec *iovs;
35861010b2Sdongx.yi int iovcnt;
36861010b2Sdongx.yi uint64_t num_blocks;
37861010b2Sdongx.yi uint64_t offset_blocks;
38861010b2Sdongx.yi uint64_t start_lba;
39861010b2Sdongx.yi } bdev;
40861010b2Sdongx.yi };
41861010b2Sdongx.yi spdk_bdev_io_completion_cb cb;
42861010b2Sdongx.yi void *cb_arg;
43861010b2Sdongx.yi enum spdk_bdev_io_type io_type;
44861010b2Sdongx.yi };
45861010b2Sdongx.yi
46861010b2Sdongx.yi /* Global variables */
47861010b2Sdongx.yi struct zone_io_operation *g_zone_op = NULL;
48861010b2Sdongx.yi static struct spdk_bdev *g_bdev = NULL;
49861010b2Sdongx.yi static struct spdk_bdev_io *g_bdev_io = NULL;
50861010b2Sdongx.yi static struct spdk_bdev_zone_info g_zone_info = {0};
51861010b2Sdongx.yi static enum spdk_bdev_zone_action g_zone_action = SPDK_BDEV_ZONE_OPEN;
52861010b2Sdongx.yi static enum spdk_bdev_zone_action g_unexpected_zone_action = SPDK_BDEV_ZONE_CLOSE;
53861010b2Sdongx.yi static enum spdk_bdev_io_type g_io_type = SPDK_BDEV_IO_TYPE_GET_ZONE_INFO;
54861010b2Sdongx.yi
55861010b2Sdongx.yi static uint64_t g_expected_zone_id;
56861010b2Sdongx.yi static uint64_t g_expected_num_zones;
57861010b2Sdongx.yi static uint64_t g_unexpected_zone_id;
58861010b2Sdongx.yi static uint64_t g_unexpected_num_zones;
59861010b2Sdongx.yi static uint64_t g_num_blocks;
60861010b2Sdongx.yi static uint64_t g_unexpected_num_blocks;
61861010b2Sdongx.yi static uint64_t g_start_lba;
62861010b2Sdongx.yi static uint64_t g_unexpected_start_lba;
63861010b2Sdongx.yi static uint64_t g_bdev_blocklen;
64861010b2Sdongx.yi static uint64_t g_unexpected_bdev_blocklen;
65861010b2Sdongx.yi static int g_unexpected_iovcnt;
66861010b2Sdongx.yi static void *g_md_buf;
67c9c7c281SJosh Soref static void *g_unexpected_md_buf;
68861010b2Sdongx.yi static void *g_buf;
69861010b2Sdongx.yi static void *g_unexpected_buf;
70861010b2Sdongx.yi
71861010b2Sdongx.yi static int
test_setup(void)72861010b2Sdongx.yi test_setup(void)
73861010b2Sdongx.yi {
74861010b2Sdongx.yi /* Initiate expected and unexpected value here */
75861010b2Sdongx.yi g_expected_zone_id = 0x1000;
76861010b2Sdongx.yi g_expected_num_zones = 1024;
77861010b2Sdongx.yi g_unexpected_zone_id = 0xFFFF;
78861010b2Sdongx.yi g_unexpected_num_zones = 0;
79861010b2Sdongx.yi g_num_blocks = 4096 * 1024;
80861010b2Sdongx.yi g_unexpected_num_blocks = 0;
81861010b2Sdongx.yi g_start_lba = 4096;
82861010b2Sdongx.yi g_unexpected_start_lba = 0;
83861010b2Sdongx.yi g_bdev_blocklen = 4096;
84861010b2Sdongx.yi g_unexpected_bdev_blocklen = 0;
85861010b2Sdongx.yi g_unexpected_iovcnt = 1000;
86861010b2Sdongx.yi g_md_buf = (void *)0xEFDCFEDE;
87c9c7c281SJosh Soref g_unexpected_md_buf = (void *)0xFECDEFDC;
88861010b2Sdongx.yi g_buf = (void *)0xFEEDBEEF;
89861010b2Sdongx.yi g_unexpected_buf = (void *)0xDEADBEEF;
90861010b2Sdongx.yi
91861010b2Sdongx.yi return 0;
92861010b2Sdongx.yi }
93861010b2Sdongx.yi
94861010b2Sdongx.yi static int
test_cleanup(void)95861010b2Sdongx.yi test_cleanup(void)
96861010b2Sdongx.yi {
97861010b2Sdongx.yi return 0;
98861010b2Sdongx.yi }
99861010b2Sdongx.yi
100861010b2Sdongx.yi static void
start_operation(void)101861010b2Sdongx.yi start_operation(void)
102861010b2Sdongx.yi {
103861010b2Sdongx.yi g_zone_op = calloc(1, sizeof(struct zone_io_operation));
104861010b2Sdongx.yi SPDK_CU_ASSERT_FATAL(g_zone_op != NULL);
105861010b2Sdongx.yi
106861010b2Sdongx.yi switch (g_io_type) {
107861010b2Sdongx.yi case SPDK_BDEV_IO_TYPE_ZONE_APPEND:
108861010b2Sdongx.yi g_zone_op->bdev.iovs = &g_zone_op->iov;
109861010b2Sdongx.yi g_zone_op->bdev.iovs[0].iov_base = g_unexpected_buf;
110861010b2Sdongx.yi g_zone_op->bdev.iovs[0].iov_len = g_unexpected_num_blocks * g_unexpected_bdev_blocklen;
111861010b2Sdongx.yi g_zone_op->bdev.iovcnt = g_unexpected_iovcnt;
112c9c7c281SJosh Soref g_zone_op->bdev.md_buf = g_unexpected_md_buf;
113861010b2Sdongx.yi g_zone_op->bdev.num_blocks = g_unexpected_num_blocks;
114861010b2Sdongx.yi g_zone_op->bdev.offset_blocks = g_unexpected_zone_id;
115861010b2Sdongx.yi g_zone_op->bdev.start_lba = g_unexpected_start_lba;
116861010b2Sdongx.yi break;
117861010b2Sdongx.yi default:
118861010b2Sdongx.yi g_zone_op->bdev.iovcnt = 0;
119861010b2Sdongx.yi g_zone_op->zone_mgmt.zone_id = g_unexpected_zone_id;
120861010b2Sdongx.yi g_zone_op->zone_mgmt.num_zones = g_unexpected_num_zones;
121861010b2Sdongx.yi g_zone_op->zone_mgmt.zone_action = g_unexpected_zone_action;
122861010b2Sdongx.yi g_zone_op->zone_mgmt.buf = g_unexpected_buf;
123861010b2Sdongx.yi break;
124861010b2Sdongx.yi }
125861010b2Sdongx.yi }
126861010b2Sdongx.yi
127861010b2Sdongx.yi static void
stop_operation(void)128861010b2Sdongx.yi stop_operation(void)
129861010b2Sdongx.yi {
130861010b2Sdongx.yi free(g_bdev_io);
131861010b2Sdongx.yi free(g_bdev);
132861010b2Sdongx.yi free(g_zone_op);
133861010b2Sdongx.yi g_bdev_io = NULL;
134861010b2Sdongx.yi g_bdev = NULL;
135861010b2Sdongx.yi g_zone_op = NULL;
136861010b2Sdongx.yi }
137861010b2Sdongx.yi
138861010b2Sdongx.yi struct spdk_bdev_io *
bdev_channel_get_io(struct spdk_bdev_channel * channel)139fdfb4e12SJim Harris bdev_channel_get_io(struct spdk_bdev_channel *channel)
140861010b2Sdongx.yi {
141861010b2Sdongx.yi struct spdk_bdev_io *bdev_io;
142861010b2Sdongx.yi
143861010b2Sdongx.yi bdev_io = calloc(1, sizeof(struct spdk_bdev_io));
144861010b2Sdongx.yi SPDK_CU_ASSERT_FATAL(bdev_io != NULL);
145861010b2Sdongx.yi
146861010b2Sdongx.yi bdev_io->internal.ch = channel;
147861010b2Sdongx.yi bdev_io->type = g_io_type;
148861010b2Sdongx.yi
149861010b2Sdongx.yi CU_ASSERT(g_zone_op != NULL);
150861010b2Sdongx.yi
151861010b2Sdongx.yi switch (g_io_type) {
152861010b2Sdongx.yi case SPDK_BDEV_IO_TYPE_GET_ZONE_INFO:
153861010b2Sdongx.yi case SPDK_BDEV_IO_TYPE_ZONE_MANAGEMENT:
154861010b2Sdongx.yi bdev_io->u.bdev.iovcnt = 0;
155861010b2Sdongx.yi bdev_io->u.zone_mgmt.zone_id = g_zone_op->zone_mgmt.zone_id;
156861010b2Sdongx.yi bdev_io->u.zone_mgmt.num_zones = g_zone_op->zone_mgmt.num_zones;
157861010b2Sdongx.yi bdev_io->u.zone_mgmt.zone_action = g_zone_op->zone_mgmt.zone_action;
158861010b2Sdongx.yi bdev_io->u.zone_mgmt.buf = g_zone_op->zone_mgmt.buf;
159861010b2Sdongx.yi break;
160861010b2Sdongx.yi case SPDK_BDEV_IO_TYPE_ZONE_APPEND:
161861010b2Sdongx.yi bdev_io->u.bdev.iovs = g_zone_op->bdev.iovs;
162861010b2Sdongx.yi bdev_io->u.bdev.iovs[0].iov_base = g_zone_op->bdev.iovs[0].iov_base;
163861010b2Sdongx.yi bdev_io->u.bdev.iovs[0].iov_len = g_zone_op->bdev.iovs[0].iov_len;
164861010b2Sdongx.yi bdev_io->u.bdev.iovcnt = g_zone_op->bdev.iovcnt;
165861010b2Sdongx.yi bdev_io->u.bdev.md_buf = g_zone_op->bdev.md_buf;
166861010b2Sdongx.yi bdev_io->u.bdev.num_blocks = g_zone_op->bdev.num_blocks;
167861010b2Sdongx.yi bdev_io->u.bdev.offset_blocks = g_zone_op->bdev.offset_blocks;
168861010b2Sdongx.yi break;
169861010b2Sdongx.yi default:
170861010b2Sdongx.yi CU_ASSERT(0);
171861010b2Sdongx.yi }
172861010b2Sdongx.yi
173861010b2Sdongx.yi g_bdev_io = bdev_io;
174861010b2Sdongx.yi
175861010b2Sdongx.yi return bdev_io;
176861010b2Sdongx.yi }
177861010b2Sdongx.yi
178861010b2Sdongx.yi int
spdk_bdev_open_ext(const char * bdev_name,bool write,spdk_bdev_event_cb_t event_cb,void * event_ctx,struct spdk_bdev_desc ** _desc)1797a85820dSShuhei Matsumoto spdk_bdev_open_ext(const char *bdev_name, bool write, spdk_bdev_event_cb_t event_cb,
1807a85820dSShuhei Matsumoto void *event_ctx, struct spdk_bdev_desc **_desc)
181861010b2Sdongx.yi {
182861010b2Sdongx.yi *_desc = (void *)0x1;
183861010b2Sdongx.yi return 0;
184861010b2Sdongx.yi }
185861010b2Sdongx.yi
186861010b2Sdongx.yi struct spdk_io_channel *
spdk_bdev_get_io_channel(struct spdk_bdev_desc * desc)187861010b2Sdongx.yi spdk_bdev_get_io_channel(struct spdk_bdev_desc *desc)
188861010b2Sdongx.yi {
189861010b2Sdongx.yi return (struct spdk_io_channel *)0x1;
190861010b2Sdongx.yi }
191861010b2Sdongx.yi
192861010b2Sdongx.yi void
spdk_put_io_channel(struct spdk_io_channel * ch)193861010b2Sdongx.yi spdk_put_io_channel(struct spdk_io_channel *ch)
194861010b2Sdongx.yi {
195861010b2Sdongx.yi CU_ASSERT(ch == (void *)1);
196861010b2Sdongx.yi }
197861010b2Sdongx.yi
198861010b2Sdongx.yi struct spdk_bdev *
spdk_bdev_desc_get_bdev(struct spdk_bdev_desc * desc)199861010b2Sdongx.yi spdk_bdev_desc_get_bdev(struct spdk_bdev_desc *desc)
200861010b2Sdongx.yi {
201861010b2Sdongx.yi struct spdk_bdev *bdev;
202861010b2Sdongx.yi
203861010b2Sdongx.yi bdev = calloc(1, sizeof(struct spdk_bdev));
204861010b2Sdongx.yi SPDK_CU_ASSERT_FATAL(bdev != NULL);
205861010b2Sdongx.yi
206861010b2Sdongx.yi if (g_io_type == SPDK_BDEV_IO_TYPE_ZONE_APPEND) {
207861010b2Sdongx.yi bdev->blocklen = g_bdev_blocklen;
208861010b2Sdongx.yi }
209861010b2Sdongx.yi
210861010b2Sdongx.yi g_bdev = bdev;
211861010b2Sdongx.yi
212861010b2Sdongx.yi return bdev;
213861010b2Sdongx.yi }
214861010b2Sdongx.yi
215861010b2Sdongx.yi static void
test_get_zone_size(void)216861010b2Sdongx.yi test_get_zone_size(void)
217861010b2Sdongx.yi {
218861010b2Sdongx.yi struct spdk_bdev bdev = {};
219861010b2Sdongx.yi uint64_t get_zone_size;
220861010b2Sdongx.yi
221861010b2Sdongx.yi bdev.zone_size = 1024 * 4096;
222861010b2Sdongx.yi
223861010b2Sdongx.yi get_zone_size = spdk_bdev_get_zone_size(&bdev);
224861010b2Sdongx.yi CU_ASSERT(get_zone_size == 1024 * 4096);
225861010b2Sdongx.yi }
226861010b2Sdongx.yi
227861010b2Sdongx.yi static void
test_get_num_zones(void)2280859db6bSNiklas Cassel test_get_num_zones(void)
2290859db6bSNiklas Cassel {
2300859db6bSNiklas Cassel struct spdk_bdev bdev = {};
2310859db6bSNiklas Cassel uint64_t get_num_zones;
2320859db6bSNiklas Cassel
2330859db6bSNiklas Cassel bdev.blockcnt = 1024 * 1024 * 1024;
2340859db6bSNiklas Cassel bdev.zone_size = 1024 * 4096;
2350859db6bSNiklas Cassel
2360859db6bSNiklas Cassel get_num_zones = spdk_bdev_get_num_zones(&bdev);
2370859db6bSNiklas Cassel CU_ASSERT(get_num_zones == 256);
2380859db6bSNiklas Cassel }
2390859db6bSNiklas Cassel
2400859db6bSNiklas Cassel static void
test_get_zone_id(void)241b7ad5b0bSNiklas Cassel test_get_zone_id(void)
242b7ad5b0bSNiklas Cassel {
243b7ad5b0bSNiklas Cassel struct spdk_bdev bdev = {};
244b7ad5b0bSNiklas Cassel uint64_t get_zone_id;
245b7ad5b0bSNiklas Cassel
246b7ad5b0bSNiklas Cassel bdev.blockcnt = 1024 * 1024 * 1024;
247b7ad5b0bSNiklas Cassel bdev.zone_size = 1024 * 4096;
248b7ad5b0bSNiklas Cassel
249b7ad5b0bSNiklas Cassel get_zone_id = spdk_bdev_get_zone_id(&bdev, 0x800032);
250b7ad5b0bSNiklas Cassel CU_ASSERT(get_zone_id == 0x800000);
251b7ad5b0bSNiklas Cassel }
252b7ad5b0bSNiklas Cassel
253b7ad5b0bSNiklas Cassel static void
test_get_max_zone_append_size(void)2549f5852d0SNiklas Cassel test_get_max_zone_append_size(void)
2559f5852d0SNiklas Cassel {
2569f5852d0SNiklas Cassel struct spdk_bdev bdev = {};
2579f5852d0SNiklas Cassel uint32_t get_max_zone_append_size;
2589f5852d0SNiklas Cassel
2599f5852d0SNiklas Cassel bdev.max_zone_append_size = 32;
2609f5852d0SNiklas Cassel
2619f5852d0SNiklas Cassel get_max_zone_append_size = spdk_bdev_get_max_zone_append_size(&bdev);
2629f5852d0SNiklas Cassel CU_ASSERT(get_max_zone_append_size == 32);
2639f5852d0SNiklas Cassel }
2649f5852d0SNiklas Cassel
2659f5852d0SNiklas Cassel static void
test_get_max_open_zones(void)266861010b2Sdongx.yi test_get_max_open_zones(void)
267861010b2Sdongx.yi {
268861010b2Sdongx.yi struct spdk_bdev bdev = {};
269861010b2Sdongx.yi uint32_t get_max_open_zones;
270861010b2Sdongx.yi
271861010b2Sdongx.yi bdev.max_open_zones = 8192;
272861010b2Sdongx.yi
273861010b2Sdongx.yi get_max_open_zones = spdk_bdev_get_max_open_zones(&bdev);
274861010b2Sdongx.yi CU_ASSERT(get_max_open_zones == 8192);
275861010b2Sdongx.yi }
276861010b2Sdongx.yi
277861010b2Sdongx.yi static void
test_get_max_active_zones(void)278ee4868deSNiklas Cassel test_get_max_active_zones(void)
279ee4868deSNiklas Cassel {
280ee4868deSNiklas Cassel struct spdk_bdev bdev = {};
281ee4868deSNiklas Cassel uint32_t get_max_active_zones;
282ee4868deSNiklas Cassel
283ee4868deSNiklas Cassel bdev.max_active_zones = 9216;
284ee4868deSNiklas Cassel
285ee4868deSNiklas Cassel get_max_active_zones = spdk_bdev_get_max_active_zones(&bdev);
286ee4868deSNiklas Cassel CU_ASSERT(get_max_active_zones == 9216);
287ee4868deSNiklas Cassel }
288ee4868deSNiklas Cassel
289ee4868deSNiklas Cassel static void
test_get_optimal_open_zones(void)290861010b2Sdongx.yi test_get_optimal_open_zones(void)
291861010b2Sdongx.yi {
292861010b2Sdongx.yi struct spdk_bdev bdev = {};
293861010b2Sdongx.yi uint32_t get_optimal_open_zones;
294861010b2Sdongx.yi
295861010b2Sdongx.yi bdev.optimal_open_zones = 4096;
296861010b2Sdongx.yi
297861010b2Sdongx.yi get_optimal_open_zones = spdk_bdev_get_optimal_open_zones(&bdev);
298861010b2Sdongx.yi CU_ASSERT(get_optimal_open_zones == 4096);
299861010b2Sdongx.yi }
300861010b2Sdongx.yi
301861010b2Sdongx.yi static void
test_bdev_io_get_append_location(void)302861010b2Sdongx.yi test_bdev_io_get_append_location(void)
303861010b2Sdongx.yi {
304861010b2Sdongx.yi struct spdk_bdev_io bdev_io = {};
305861010b2Sdongx.yi uint64_t get_offset_blocks;
306861010b2Sdongx.yi
307861010b2Sdongx.yi bdev_io.u.bdev.offset_blocks = 1024 * 10;
308861010b2Sdongx.yi
309861010b2Sdongx.yi get_offset_blocks = spdk_bdev_io_get_append_location(&bdev_io);
310861010b2Sdongx.yi CU_ASSERT(get_offset_blocks == 1024 * 10);
311861010b2Sdongx.yi }
312861010b2Sdongx.yi
313861010b2Sdongx.yi static void
test_zone_get_operation(void)314861010b2Sdongx.yi test_zone_get_operation(void)
315861010b2Sdongx.yi {
316861010b2Sdongx.yi test_get_zone_size();
3170859db6bSNiklas Cassel test_get_num_zones();
318b7ad5b0bSNiklas Cassel test_get_zone_id();
3199f5852d0SNiklas Cassel test_get_max_zone_append_size();
320861010b2Sdongx.yi test_get_max_open_zones();
321ee4868deSNiklas Cassel test_get_max_active_zones();
322861010b2Sdongx.yi test_get_optimal_open_zones();
323861010b2Sdongx.yi }
324861010b2Sdongx.yi
325861010b2Sdongx.yi #define DECLARE_VIRTUAL_BDEV_START() \
326861010b2Sdongx.yi struct spdk_bdev bdev; \
327861010b2Sdongx.yi struct spdk_io_channel *ch; \
328861010b2Sdongx.yi struct spdk_bdev_desc *desc = NULL; \
329861010b2Sdongx.yi int rc; \
330861010b2Sdongx.yi memset(&bdev, 0, sizeof(bdev)); \
331861010b2Sdongx.yi bdev.name = "bdev_zone_ut"; \
3327a85820dSShuhei Matsumoto rc = spdk_bdev_open_ext(bdev.name, true, NULL, NULL, &desc); \
333861010b2Sdongx.yi CU_ASSERT(rc == 0); \
334861010b2Sdongx.yi SPDK_CU_ASSERT_FATAL(desc != NULL); \
335861010b2Sdongx.yi ch = spdk_bdev_get_io_channel(desc); \
336861010b2Sdongx.yi CU_ASSERT(ch != NULL);\
337861010b2Sdongx.yi
338861010b2Sdongx.yi static void
test_bdev_zone_get_info(void)339861010b2Sdongx.yi test_bdev_zone_get_info(void)
340861010b2Sdongx.yi {
341861010b2Sdongx.yi DECLARE_VIRTUAL_BDEV_START();
342861010b2Sdongx.yi
343861010b2Sdongx.yi g_zone_info.zone_id = g_expected_zone_id;
344861010b2Sdongx.yi g_io_type = SPDK_BDEV_IO_TYPE_GET_ZONE_INFO;
345861010b2Sdongx.yi
346861010b2Sdongx.yi start_operation();
347861010b2Sdongx.yi
348861010b2Sdongx.yi rc = spdk_bdev_get_zone_info(desc, ch, g_expected_zone_id, g_expected_num_zones, &g_zone_info, NULL,
349861010b2Sdongx.yi NULL);
350861010b2Sdongx.yi CU_ASSERT(rc == 0);
351861010b2Sdongx.yi CU_ASSERT(g_bdev_io->type == SPDK_BDEV_IO_TYPE_GET_ZONE_INFO);
352861010b2Sdongx.yi CU_ASSERT(g_bdev_io->u.zone_mgmt.zone_id == g_expected_zone_id);
353861010b2Sdongx.yi CU_ASSERT(g_bdev_io->u.zone_mgmt.num_zones == g_expected_num_zones);
354861010b2Sdongx.yi CU_ASSERT(g_bdev_io->u.zone_mgmt.buf == &g_zone_info);
355861010b2Sdongx.yi
356861010b2Sdongx.yi stop_operation();
357861010b2Sdongx.yi }
358861010b2Sdongx.yi
359861010b2Sdongx.yi static void
test_bdev_zone_management(void)360861010b2Sdongx.yi test_bdev_zone_management(void)
361861010b2Sdongx.yi {
362861010b2Sdongx.yi DECLARE_VIRTUAL_BDEV_START();
363861010b2Sdongx.yi
364861010b2Sdongx.yi g_zone_info.zone_id = g_expected_zone_id;
365861010b2Sdongx.yi g_io_type = SPDK_BDEV_IO_TYPE_ZONE_MANAGEMENT;
366861010b2Sdongx.yi
367861010b2Sdongx.yi start_operation();
368861010b2Sdongx.yi
369861010b2Sdongx.yi rc = spdk_bdev_zone_management(desc, ch, g_expected_zone_id, g_zone_action, NULL,
370861010b2Sdongx.yi NULL);
371861010b2Sdongx.yi CU_ASSERT(rc == 0);
372861010b2Sdongx.yi CU_ASSERT(g_bdev_io->type == SPDK_BDEV_IO_TYPE_ZONE_MANAGEMENT);
373861010b2Sdongx.yi CU_ASSERT(g_bdev_io->u.zone_mgmt.zone_id == g_expected_zone_id);
374861010b2Sdongx.yi CU_ASSERT(g_bdev_io->u.zone_mgmt.zone_action == g_zone_action);
375861010b2Sdongx.yi CU_ASSERT(g_bdev_io->u.zone_mgmt.num_zones == 1);
376861010b2Sdongx.yi
377861010b2Sdongx.yi stop_operation();
378861010b2Sdongx.yi }
379861010b2Sdongx.yi
380861010b2Sdongx.yi static void
test_bdev_zone_append(void)381861010b2Sdongx.yi test_bdev_zone_append(void)
382861010b2Sdongx.yi {
383861010b2Sdongx.yi DECLARE_VIRTUAL_BDEV_START();
384861010b2Sdongx.yi
385861010b2Sdongx.yi g_io_type = SPDK_BDEV_IO_TYPE_ZONE_APPEND;
386861010b2Sdongx.yi
387861010b2Sdongx.yi start_operation();
388861010b2Sdongx.yi
389861010b2Sdongx.yi rc = spdk_bdev_zone_append(desc, ch, g_buf, g_start_lba, g_num_blocks, NULL, NULL);
390861010b2Sdongx.yi
391861010b2Sdongx.yi CU_ASSERT(rc == 0);
392861010b2Sdongx.yi CU_ASSERT(g_bdev_io->internal.desc == desc);
393861010b2Sdongx.yi CU_ASSERT(g_bdev_io->type == SPDK_BDEV_IO_TYPE_ZONE_APPEND);
394861010b2Sdongx.yi CU_ASSERT(g_bdev_io->u.bdev.iovs[0].iov_base == g_buf);
395861010b2Sdongx.yi CU_ASSERT(g_bdev_io->u.bdev.iovs[0].iov_len == g_num_blocks * g_bdev_blocklen);
396861010b2Sdongx.yi CU_ASSERT(g_bdev_io->u.bdev.iovcnt == 1);
397861010b2Sdongx.yi CU_ASSERT(g_bdev_io->u.bdev.md_buf == NULL);
398861010b2Sdongx.yi CU_ASSERT(g_bdev_io->u.bdev.num_blocks == g_num_blocks);
399861010b2Sdongx.yi CU_ASSERT(g_bdev_io->u.bdev.offset_blocks == g_expected_zone_id);
400861010b2Sdongx.yi
401861010b2Sdongx.yi stop_operation();
402861010b2Sdongx.yi }
403861010b2Sdongx.yi
404861010b2Sdongx.yi static void
test_bdev_zone_append_with_md(void)405861010b2Sdongx.yi test_bdev_zone_append_with_md(void)
406861010b2Sdongx.yi {
407861010b2Sdongx.yi DECLARE_VIRTUAL_BDEV_START();
408861010b2Sdongx.yi
409861010b2Sdongx.yi g_io_type = SPDK_BDEV_IO_TYPE_ZONE_APPEND;
410861010b2Sdongx.yi
411861010b2Sdongx.yi start_operation();
412861010b2Sdongx.yi
413861010b2Sdongx.yi rc = spdk_bdev_zone_append_with_md(desc, ch, g_buf, g_md_buf, g_start_lba, g_num_blocks, NULL,
414861010b2Sdongx.yi NULL);
415861010b2Sdongx.yi
416861010b2Sdongx.yi CU_ASSERT(rc == 0);
417861010b2Sdongx.yi CU_ASSERT(g_bdev_io->internal.desc == desc);
418861010b2Sdongx.yi CU_ASSERT(g_bdev_io->type == SPDK_BDEV_IO_TYPE_ZONE_APPEND);
419861010b2Sdongx.yi CU_ASSERT(g_bdev_io->u.bdev.iovs[0].iov_base == g_buf);
420861010b2Sdongx.yi CU_ASSERT(g_bdev_io->u.bdev.iovs[0].iov_len == g_num_blocks * g_bdev_blocklen);
421861010b2Sdongx.yi CU_ASSERT(g_bdev_io->u.bdev.iovcnt == 1);
422861010b2Sdongx.yi CU_ASSERT(g_bdev_io->u.bdev.md_buf == g_md_buf);
423861010b2Sdongx.yi CU_ASSERT(g_bdev_io->u.bdev.num_blocks == g_num_blocks);
424861010b2Sdongx.yi CU_ASSERT(g_bdev_io->u.bdev.offset_blocks == g_expected_zone_id);
425861010b2Sdongx.yi
426861010b2Sdongx.yi stop_operation();
427861010b2Sdongx.yi }
428861010b2Sdongx.yi
4297315b003SKanKuo static void
test_bdev_zone_appendv(void)4307315b003SKanKuo test_bdev_zone_appendv(void)
4317315b003SKanKuo {
4327315b003SKanKuo DECLARE_VIRTUAL_BDEV_START();
4337315b003SKanKuo
4347315b003SKanKuo g_io_type = SPDK_BDEV_IO_TYPE_ZONE_APPEND;
4357315b003SKanKuo
4367315b003SKanKuo start_operation();
4377315b003SKanKuo
4387315b003SKanKuo rc = spdk_bdev_zone_appendv(desc, ch, g_zone_op->bdev.iovs, g_unexpected_iovcnt, g_start_lba,
4397315b003SKanKuo g_num_blocks, NULL, NULL);
4407315b003SKanKuo
4417315b003SKanKuo CU_ASSERT(rc == 0);
4427315b003SKanKuo CU_ASSERT(g_bdev_io->internal.desc == desc);
4437315b003SKanKuo CU_ASSERT(g_bdev_io->type == SPDK_BDEV_IO_TYPE_ZONE_APPEND);
4447315b003SKanKuo CU_ASSERT(g_bdev_io->u.bdev.iovs == g_zone_op->bdev.iovs);
4457315b003SKanKuo CU_ASSERT(g_bdev_io->u.bdev.iovcnt == g_unexpected_iovcnt);
4467315b003SKanKuo CU_ASSERT(g_bdev_io->u.bdev.md_buf == NULL);
4477315b003SKanKuo CU_ASSERT(g_bdev_io->u.bdev.num_blocks == g_num_blocks);
4487315b003SKanKuo CU_ASSERT(g_bdev_io->u.bdev.offset_blocks == g_expected_zone_id);
4497315b003SKanKuo
4507315b003SKanKuo stop_operation();
4517315b003SKanKuo }
4527315b003SKanKuo
453df00a867SKanKuo static void
test_bdev_zone_appendv_with_md(void)454df00a867SKanKuo test_bdev_zone_appendv_with_md(void)
455df00a867SKanKuo {
456df00a867SKanKuo DECLARE_VIRTUAL_BDEV_START();
457df00a867SKanKuo
458df00a867SKanKuo g_io_type = SPDK_BDEV_IO_TYPE_ZONE_APPEND;
459df00a867SKanKuo
460df00a867SKanKuo start_operation();
461df00a867SKanKuo
462df00a867SKanKuo rc = spdk_bdev_zone_appendv_with_md(desc, ch, g_zone_op->bdev.iovs, g_unexpected_iovcnt, g_md_buf,
463df00a867SKanKuo g_start_lba, g_num_blocks, NULL, NULL);
464df00a867SKanKuo
465df00a867SKanKuo CU_ASSERT(rc == 0);
466df00a867SKanKuo CU_ASSERT(g_bdev_io->internal.desc == desc);
467df00a867SKanKuo CU_ASSERT(g_bdev_io->type == SPDK_BDEV_IO_TYPE_ZONE_APPEND);
468df00a867SKanKuo CU_ASSERT(g_bdev_io->u.bdev.iovs == g_zone_op->bdev.iovs);
469df00a867SKanKuo CU_ASSERT(g_bdev_io->u.bdev.iovcnt == g_unexpected_iovcnt);
470df00a867SKanKuo CU_ASSERT(g_bdev_io->u.bdev.md_buf == g_md_buf);
471df00a867SKanKuo CU_ASSERT(g_bdev_io->u.bdev.num_blocks == g_num_blocks);
472df00a867SKanKuo CU_ASSERT(g_bdev_io->u.bdev.offset_blocks == g_expected_zone_id);
473df00a867SKanKuo
474df00a867SKanKuo stop_operation();
475df00a867SKanKuo }
476df00a867SKanKuo
477861010b2Sdongx.yi int
main(int argc,char ** argv)478861010b2Sdongx.yi main(int argc, char **argv)
479861010b2Sdongx.yi {
480861010b2Sdongx.yi CU_pSuite suite = NULL;
481861010b2Sdongx.yi unsigned int num_failures;
482861010b2Sdongx.yi
48378b696bcSVitaliy Mysak CU_initialize_registry();
484861010b2Sdongx.yi
485861010b2Sdongx.yi suite = CU_add_suite("zone", test_setup, test_cleanup);
486dcf0ca15SVitaliy Mysak CU_ADD_TEST(suite, test_zone_get_operation);
487dcf0ca15SVitaliy Mysak CU_ADD_TEST(suite, test_bdev_zone_get_info);
488dcf0ca15SVitaliy Mysak CU_ADD_TEST(suite, test_bdev_zone_management);
489dcf0ca15SVitaliy Mysak CU_ADD_TEST(suite, test_bdev_zone_append);
490dcf0ca15SVitaliy Mysak CU_ADD_TEST(suite, test_bdev_zone_append_with_md);
4917315b003SKanKuo CU_ADD_TEST(suite, test_bdev_zone_appendv);
492df00a867SKanKuo CU_ADD_TEST(suite, test_bdev_zone_appendv_with_md);
493dcf0ca15SVitaliy Mysak CU_ADD_TEST(suite, test_bdev_io_get_append_location);
494861010b2Sdongx.yi
495*ea941caeSKonrad Sztyber num_failures = spdk_ut_run_tests(argc, argv, NULL);
496861010b2Sdongx.yi CU_cleanup_registry();
497861010b2Sdongx.yi return num_failures;
498861010b2Sdongx.yi }
499