11ec4c2eeSKrzysztof Smolinski /* SPDX-License-Identifier: BSD-3-Clause
21ec4c2eeSKrzysztof Smolinski * Copyright (C) 2022 Intel Corporation.
31ec4c2eeSKrzysztof Smolinski * All rights reserved.
41ec4c2eeSKrzysztof Smolinski */
51ec4c2eeSKrzysztof Smolinski
6ae431e31SKonrad Sztyber #include "spdk_internal/cunit.h"
71ec4c2eeSKrzysztof Smolinski #include "spdk/stdinc.h"
81ec4c2eeSKrzysztof Smolinski #include "bdev/raid/bdev_raid.h"
91ec4c2eeSKrzysztof Smolinski
101ec4c2eeSKrzysztof Smolinski struct spdk_bdev_desc {
111ec4c2eeSKrzysztof Smolinski struct spdk_bdev *bdev;
121ec4c2eeSKrzysztof Smolinski };
131ec4c2eeSKrzysztof Smolinski
141b9c5629SArtur Paszkiewicz typedef enum spdk_dif_type spdk_dif_type_t;
151b9c5629SArtur Paszkiewicz
161b9c5629SArtur Paszkiewicz spdk_dif_type_t
spdk_bdev_get_dif_type(const struct spdk_bdev * bdev)171b9c5629SArtur Paszkiewicz spdk_bdev_get_dif_type(const struct spdk_bdev *bdev)
181b9c5629SArtur Paszkiewicz {
191b9c5629SArtur Paszkiewicz if (bdev->md_len != 0) {
201b9c5629SArtur Paszkiewicz return bdev->dif_type;
211b9c5629SArtur Paszkiewicz } else {
221b9c5629SArtur Paszkiewicz return SPDK_DIF_DISABLE;
231b9c5629SArtur Paszkiewicz }
241b9c5629SArtur Paszkiewicz }
251b9c5629SArtur Paszkiewicz
26577058d6SArtur Paszkiewicz enum raid_params_md_type {
27577058d6SArtur Paszkiewicz RAID_PARAMS_MD_NONE,
28577058d6SArtur Paszkiewicz RAID_PARAMS_MD_SEPARATE,
29577058d6SArtur Paszkiewicz RAID_PARAMS_MD_INTERLEAVED,
30577058d6SArtur Paszkiewicz };
31577058d6SArtur Paszkiewicz
321ec4c2eeSKrzysztof Smolinski struct raid_params {
331ec4c2eeSKrzysztof Smolinski uint8_t num_base_bdevs;
341ec4c2eeSKrzysztof Smolinski uint64_t base_bdev_blockcnt;
351ec4c2eeSKrzysztof Smolinski uint32_t base_bdev_blocklen;
361ec4c2eeSKrzysztof Smolinski uint32_t strip_size;
37577058d6SArtur Paszkiewicz enum raid_params_md_type md_type;
381ec4c2eeSKrzysztof Smolinski };
391ec4c2eeSKrzysztof Smolinski
40fc3c9b37SArtur Paszkiewicz int raid_test_params_alloc(size_t count);
41fc3c9b37SArtur Paszkiewicz void raid_test_params_free(void);
42fc3c9b37SArtur Paszkiewicz void raid_test_params_add(struct raid_params *params);
43fc3c9b37SArtur Paszkiewicz struct raid_bdev *raid_test_create_raid_bdev(struct raid_params *params,
44fc3c9b37SArtur Paszkiewicz struct raid_bdev_module *module);
45fc3c9b37SArtur Paszkiewicz void raid_test_delete_raid_bdev(struct raid_bdev *raid_bdev);
46fc3c9b37SArtur Paszkiewicz struct raid_bdev_io_channel *raid_test_create_io_channel(struct raid_bdev *raid_bdev);
47fc3c9b37SArtur Paszkiewicz void raid_test_destroy_io_channel(struct raid_bdev_io_channel *raid_ch);
48fc3c9b37SArtur Paszkiewicz void raid_test_bdev_io_init(struct raid_bdev_io *raid_io, struct raid_bdev *raid_bdev,
49fc3c9b37SArtur Paszkiewicz struct raid_bdev_io_channel *raid_ch,
50fc3c9b37SArtur Paszkiewicz enum spdk_bdev_io_type type, uint64_t offset_blocks,
51fc3c9b37SArtur Paszkiewicz uint64_t num_blocks, struct iovec *iovs, int iovcnt, void *md_buf);
52fc3c9b37SArtur Paszkiewicz
53fc3c9b37SArtur Paszkiewicz /* needs to be implemented in module unit test files */
54fc3c9b37SArtur Paszkiewicz void raid_test_bdev_io_complete(struct raid_bdev_io *raid_io, enum spdk_bdev_io_status status);
55fc3c9b37SArtur Paszkiewicz
561ec4c2eeSKrzysztof Smolinski struct raid_params *g_params;
571ec4c2eeSKrzysztof Smolinski size_t g_params_count;
581ec4c2eeSKrzysztof Smolinski size_t g_params_size;
591ec4c2eeSKrzysztof Smolinski
601ec4c2eeSKrzysztof Smolinski #define ARRAY_FOR_EACH(a, e) \
611ec4c2eeSKrzysztof Smolinski for (e = a; e < a + SPDK_COUNTOF(a); e++)
621ec4c2eeSKrzysztof Smolinski
631ec4c2eeSKrzysztof Smolinski #define RAID_PARAMS_FOR_EACH(p) \
641ec4c2eeSKrzysztof Smolinski for (p = g_params; p < g_params + g_params_count; p++)
651ec4c2eeSKrzysztof Smolinski
668d1993a5SArtur Paszkiewicz struct spdk_bdev *
spdk_bdev_desc_get_bdev(struct spdk_bdev_desc * desc)678d1993a5SArtur Paszkiewicz spdk_bdev_desc_get_bdev(struct spdk_bdev_desc *desc)
688d1993a5SArtur Paszkiewicz {
698d1993a5SArtur Paszkiewicz return desc->bdev;
708d1993a5SArtur Paszkiewicz }
718d1993a5SArtur Paszkiewicz
72fc3c9b37SArtur Paszkiewicz int
raid_test_params_alloc(size_t count)731ec4c2eeSKrzysztof Smolinski raid_test_params_alloc(size_t count)
741ec4c2eeSKrzysztof Smolinski {
751ec4c2eeSKrzysztof Smolinski assert(g_params == NULL);
761ec4c2eeSKrzysztof Smolinski
771ec4c2eeSKrzysztof Smolinski g_params_size = count;
781ec4c2eeSKrzysztof Smolinski g_params_count = 0;
791ec4c2eeSKrzysztof Smolinski g_params = calloc(count, sizeof(*g_params));
801ec4c2eeSKrzysztof Smolinski
811ec4c2eeSKrzysztof Smolinski return g_params ? 0 : -ENOMEM;
821ec4c2eeSKrzysztof Smolinski }
831ec4c2eeSKrzysztof Smolinski
84fc3c9b37SArtur Paszkiewicz void
raid_test_params_free(void)851ec4c2eeSKrzysztof Smolinski raid_test_params_free(void)
861ec4c2eeSKrzysztof Smolinski {
871ec4c2eeSKrzysztof Smolinski g_params_count = 0;
881ec4c2eeSKrzysztof Smolinski g_params_size = 0;
891ec4c2eeSKrzysztof Smolinski free(g_params);
901ec4c2eeSKrzysztof Smolinski }
911ec4c2eeSKrzysztof Smolinski
92fc3c9b37SArtur Paszkiewicz void
raid_test_params_add(struct raid_params * params)931ec4c2eeSKrzysztof Smolinski raid_test_params_add(struct raid_params *params)
941ec4c2eeSKrzysztof Smolinski {
951ec4c2eeSKrzysztof Smolinski assert(g_params_count < g_params_size);
961ec4c2eeSKrzysztof Smolinski
971ec4c2eeSKrzysztof Smolinski memcpy(g_params + g_params_count, params, sizeof(*params));
981ec4c2eeSKrzysztof Smolinski g_params_count++;
991ec4c2eeSKrzysztof Smolinski }
1001ec4c2eeSKrzysztof Smolinski
101fc3c9b37SArtur Paszkiewicz struct raid_bdev *
raid_test_create_raid_bdev(struct raid_params * params,struct raid_bdev_module * module)1021ec4c2eeSKrzysztof Smolinski raid_test_create_raid_bdev(struct raid_params *params, struct raid_bdev_module *module)
1031ec4c2eeSKrzysztof Smolinski {
1041ec4c2eeSKrzysztof Smolinski struct raid_bdev *raid_bdev;
1051ec4c2eeSKrzysztof Smolinski struct raid_base_bdev_info *base_info;
1061ec4c2eeSKrzysztof Smolinski
107577058d6SArtur Paszkiewicz SPDK_CU_ASSERT_FATAL(spdk_u32_is_pow2(params->base_bdev_blocklen));
108577058d6SArtur Paszkiewicz
1091ec4c2eeSKrzysztof Smolinski raid_bdev = calloc(1, sizeof(*raid_bdev));
1101ec4c2eeSKrzysztof Smolinski SPDK_CU_ASSERT_FATAL(raid_bdev != NULL);
1111ec4c2eeSKrzysztof Smolinski
1121ec4c2eeSKrzysztof Smolinski raid_bdev->module = module;
1131ec4c2eeSKrzysztof Smolinski raid_bdev->level = module->level;
1141ec4c2eeSKrzysztof Smolinski raid_bdev->num_base_bdevs = params->num_base_bdevs;
1151ec4c2eeSKrzysztof Smolinski
1161ec4c2eeSKrzysztof Smolinski switch (raid_bdev->module->base_bdevs_constraint.type) {
1171ec4c2eeSKrzysztof Smolinski case CONSTRAINT_MAX_BASE_BDEVS_REMOVED:
1181ec4c2eeSKrzysztof Smolinski raid_bdev->min_base_bdevs_operational = raid_bdev->num_base_bdevs -
1191ec4c2eeSKrzysztof Smolinski raid_bdev->module->base_bdevs_constraint.value;
1201ec4c2eeSKrzysztof Smolinski break;
1211ec4c2eeSKrzysztof Smolinski case CONSTRAINT_MIN_BASE_BDEVS_OPERATIONAL:
1221ec4c2eeSKrzysztof Smolinski raid_bdev->min_base_bdevs_operational = raid_bdev->module->base_bdevs_constraint.value;
1231ec4c2eeSKrzysztof Smolinski break;
1241ec4c2eeSKrzysztof Smolinski case CONSTRAINT_UNSET:
1251ec4c2eeSKrzysztof Smolinski raid_bdev->min_base_bdevs_operational = raid_bdev->num_base_bdevs;
1261ec4c2eeSKrzysztof Smolinski break;
1271ec4c2eeSKrzysztof Smolinski default:
1281ec4c2eeSKrzysztof Smolinski CU_FAIL_FATAL("unsupported raid constraint type");
1291ec4c2eeSKrzysztof Smolinski };
1301ec4c2eeSKrzysztof Smolinski
131577058d6SArtur Paszkiewicz raid_bdev->bdev.blocklen = params->base_bdev_blocklen;
132577058d6SArtur Paszkiewicz raid_bdev->bdev.md_len = (params->md_type == RAID_PARAMS_MD_NONE ? 0 : 16);
133577058d6SArtur Paszkiewicz raid_bdev->bdev.md_interleave = (params->md_type == RAID_PARAMS_MD_INTERLEAVED);
134577058d6SArtur Paszkiewicz if (raid_bdev->bdev.md_interleave) {
135577058d6SArtur Paszkiewicz raid_bdev->bdev.blocklen += raid_bdev->bdev.md_len;
136577058d6SArtur Paszkiewicz }
137577058d6SArtur Paszkiewicz
138577058d6SArtur Paszkiewicz raid_bdev->strip_size = params->strip_size;
139577058d6SArtur Paszkiewicz raid_bdev->strip_size_kb = params->strip_size * params->base_bdev_blocklen / 1024;
140577058d6SArtur Paszkiewicz raid_bdev->strip_size_shift = spdk_u32log2(raid_bdev->strip_size);
141577058d6SArtur Paszkiewicz
1421ec4c2eeSKrzysztof Smolinski raid_bdev->base_bdev_info = calloc(raid_bdev->num_base_bdevs,
1431ec4c2eeSKrzysztof Smolinski sizeof(struct raid_base_bdev_info));
1441ec4c2eeSKrzysztof Smolinski SPDK_CU_ASSERT_FATAL(raid_bdev->base_bdev_info != NULL);
1451ec4c2eeSKrzysztof Smolinski
1461ec4c2eeSKrzysztof Smolinski RAID_FOR_EACH_BASE_BDEV(raid_bdev, base_info) {
1471ec4c2eeSKrzysztof Smolinski struct spdk_bdev *bdev;
1481ec4c2eeSKrzysztof Smolinski struct spdk_bdev_desc *desc;
1491ec4c2eeSKrzysztof Smolinski
1501ec4c2eeSKrzysztof Smolinski bdev = calloc(1, sizeof(*bdev));
1511ec4c2eeSKrzysztof Smolinski SPDK_CU_ASSERT_FATAL(bdev != NULL);
15235a054dbSArtur Paszkiewicz bdev->ctxt = base_info;
1531ec4c2eeSKrzysztof Smolinski bdev->blockcnt = params->base_bdev_blockcnt;
154577058d6SArtur Paszkiewicz bdev->blocklen = raid_bdev->bdev.blocklen;
155577058d6SArtur Paszkiewicz bdev->md_len = raid_bdev->bdev.md_len;
156577058d6SArtur Paszkiewicz bdev->md_interleave = raid_bdev->bdev.md_interleave;
1571ec4c2eeSKrzysztof Smolinski
1581ec4c2eeSKrzysztof Smolinski desc = calloc(1, sizeof(*desc));
1591ec4c2eeSKrzysztof Smolinski SPDK_CU_ASSERT_FATAL(desc != NULL);
1601ec4c2eeSKrzysztof Smolinski desc->bdev = bdev;
1611ec4c2eeSKrzysztof Smolinski
162698da718SArtur Paszkiewicz base_info->raid_bdev = raid_bdev;
1631ec4c2eeSKrzysztof Smolinski base_info->desc = desc;
164deed7d2fSArtur Paszkiewicz base_info->data_offset = 0;
165deed7d2fSArtur Paszkiewicz base_info->data_size = bdev->blockcnt;
1661ec4c2eeSKrzysztof Smolinski }
1671ec4c2eeSKrzysztof Smolinski
1681ec4c2eeSKrzysztof Smolinski return raid_bdev;
1691ec4c2eeSKrzysztof Smolinski }
1701ec4c2eeSKrzysztof Smolinski
171fc3c9b37SArtur Paszkiewicz void
raid_test_delete_raid_bdev(struct raid_bdev * raid_bdev)1721ec4c2eeSKrzysztof Smolinski raid_test_delete_raid_bdev(struct raid_bdev *raid_bdev)
1731ec4c2eeSKrzysztof Smolinski {
1741ec4c2eeSKrzysztof Smolinski struct raid_base_bdev_info *base_info;
1751ec4c2eeSKrzysztof Smolinski
1761ec4c2eeSKrzysztof Smolinski RAID_FOR_EACH_BASE_BDEV(raid_bdev, base_info) {
1778d1993a5SArtur Paszkiewicz free(base_info->desc->bdev);
1781ec4c2eeSKrzysztof Smolinski free(base_info->desc);
1791ec4c2eeSKrzysztof Smolinski }
1801ec4c2eeSKrzysztof Smolinski free(raid_bdev->base_bdev_info);
1811ec4c2eeSKrzysztof Smolinski free(raid_bdev);
1821ec4c2eeSKrzysztof Smolinski }
18359d79ec5SArtur Paszkiewicz
1846e03e49bSArtur Paszkiewicz struct raid_bdev_io_channel {
1856e03e49bSArtur Paszkiewicz struct spdk_io_channel **_base_channels;
1866e03e49bSArtur Paszkiewicz struct spdk_io_channel *_module_channel;
1876e03e49bSArtur Paszkiewicz };
1886e03e49bSArtur Paszkiewicz
1896e03e49bSArtur Paszkiewicz struct spdk_io_channel *
raid_bdev_channel_get_base_channel(struct raid_bdev_io_channel * raid_ch,uint8_t idx)1906e03e49bSArtur Paszkiewicz raid_bdev_channel_get_base_channel(struct raid_bdev_io_channel *raid_ch, uint8_t idx)
1916e03e49bSArtur Paszkiewicz {
1926e03e49bSArtur Paszkiewicz return raid_ch->_base_channels[idx];
1936e03e49bSArtur Paszkiewicz }
1946e03e49bSArtur Paszkiewicz
1956e03e49bSArtur Paszkiewicz void *
raid_bdev_channel_get_module_ctx(struct raid_bdev_io_channel * raid_ch)1966e03e49bSArtur Paszkiewicz raid_bdev_channel_get_module_ctx(struct raid_bdev_io_channel *raid_ch)
1976e03e49bSArtur Paszkiewicz {
1986e03e49bSArtur Paszkiewicz return spdk_io_channel_get_ctx(raid_ch->_module_channel);
1996e03e49bSArtur Paszkiewicz }
2006e03e49bSArtur Paszkiewicz
201fc3c9b37SArtur Paszkiewicz struct raid_bdev_io_channel *
raid_test_create_io_channel(struct raid_bdev * raid_bdev)20259d79ec5SArtur Paszkiewicz raid_test_create_io_channel(struct raid_bdev *raid_bdev)
20359d79ec5SArtur Paszkiewicz {
20459d79ec5SArtur Paszkiewicz struct raid_bdev_io_channel *raid_ch;
20559d79ec5SArtur Paszkiewicz uint8_t i;
20659d79ec5SArtur Paszkiewicz
20759d79ec5SArtur Paszkiewicz raid_ch = calloc(1, sizeof(*raid_ch));
20859d79ec5SArtur Paszkiewicz SPDK_CU_ASSERT_FATAL(raid_ch != NULL);
20959d79ec5SArtur Paszkiewicz
2106e03e49bSArtur Paszkiewicz raid_ch->_base_channels = calloc(raid_bdev->num_base_bdevs, sizeof(struct spdk_io_channel *));
2116e03e49bSArtur Paszkiewicz SPDK_CU_ASSERT_FATAL(raid_ch->_base_channels != NULL);
21259d79ec5SArtur Paszkiewicz
21359d79ec5SArtur Paszkiewicz for (i = 0; i < raid_bdev->num_base_bdevs; i++) {
2146e03e49bSArtur Paszkiewicz raid_ch->_base_channels[i] = (void *)1;
21559d79ec5SArtur Paszkiewicz }
21659d79ec5SArtur Paszkiewicz
21759d79ec5SArtur Paszkiewicz if (raid_bdev->module->get_io_channel) {
2186e03e49bSArtur Paszkiewicz raid_ch->_module_channel = raid_bdev->module->get_io_channel(raid_bdev);
2196e03e49bSArtur Paszkiewicz SPDK_CU_ASSERT_FATAL(raid_ch->_module_channel != NULL);
22059d79ec5SArtur Paszkiewicz }
22159d79ec5SArtur Paszkiewicz
22259d79ec5SArtur Paszkiewicz return raid_ch;
22359d79ec5SArtur Paszkiewicz }
22459d79ec5SArtur Paszkiewicz
225fc3c9b37SArtur Paszkiewicz void
raid_test_destroy_io_channel(struct raid_bdev_io_channel * raid_ch)22659d79ec5SArtur Paszkiewicz raid_test_destroy_io_channel(struct raid_bdev_io_channel *raid_ch)
22759d79ec5SArtur Paszkiewicz {
2286e03e49bSArtur Paszkiewicz free(raid_ch->_base_channels);
22959d79ec5SArtur Paszkiewicz
2306e03e49bSArtur Paszkiewicz if (raid_ch->_module_channel) {
2316e03e49bSArtur Paszkiewicz spdk_put_io_channel(raid_ch->_module_channel);
23259d79ec5SArtur Paszkiewicz poll_threads();
23359d79ec5SArtur Paszkiewicz }
23459d79ec5SArtur Paszkiewicz
23559d79ec5SArtur Paszkiewicz free(raid_ch);
23659d79ec5SArtur Paszkiewicz }
237a4e1703eSArtur Paszkiewicz
238fc3c9b37SArtur Paszkiewicz void
raid_test_bdev_io_init(struct raid_bdev_io * raid_io,struct raid_bdev * raid_bdev,struct raid_bdev_io_channel * raid_ch,enum spdk_bdev_io_type type,uint64_t offset_blocks,uint64_t num_blocks,struct iovec * iovs,int iovcnt,void * md_buf)239a4e1703eSArtur Paszkiewicz raid_test_bdev_io_init(struct raid_bdev_io *raid_io, struct raid_bdev *raid_bdev,
240a4e1703eSArtur Paszkiewicz struct raid_bdev_io_channel *raid_ch,
241a4e1703eSArtur Paszkiewicz enum spdk_bdev_io_type type, uint64_t offset_blocks,
242a4e1703eSArtur Paszkiewicz uint64_t num_blocks, struct iovec *iovs, int iovcnt, void *md_buf)
243a4e1703eSArtur Paszkiewicz {
244a4e1703eSArtur Paszkiewicz memset(raid_io, 0, sizeof(*raid_io));
245a4e1703eSArtur Paszkiewicz
246a4e1703eSArtur Paszkiewicz raid_io->raid_bdev = raid_bdev;
247a4e1703eSArtur Paszkiewicz raid_io->raid_ch = raid_ch;
248a4e1703eSArtur Paszkiewicz
249a4e1703eSArtur Paszkiewicz raid_io->type = type;
250a4e1703eSArtur Paszkiewicz raid_io->offset_blocks = offset_blocks;
251a4e1703eSArtur Paszkiewicz raid_io->num_blocks = num_blocks;
252a4e1703eSArtur Paszkiewicz raid_io->iovs = iovs;
253a4e1703eSArtur Paszkiewicz raid_io->iovcnt = iovcnt;
254a4e1703eSArtur Paszkiewicz raid_io->md_buf = md_buf;
255a4e1703eSArtur Paszkiewicz
256*9820a949SArtur Paszkiewicz raid_bdev_io_set_default_status(raid_io, SPDK_BDEV_IO_STATUS_SUCCESS);
257a4e1703eSArtur Paszkiewicz }
258a4e1703eSArtur Paszkiewicz
259a4e1703eSArtur Paszkiewicz void
raid_bdev_io_complete(struct raid_bdev_io * raid_io,enum spdk_bdev_io_status status)260a4e1703eSArtur Paszkiewicz raid_bdev_io_complete(struct raid_bdev_io *raid_io, enum spdk_bdev_io_status status)
261a4e1703eSArtur Paszkiewicz {
2622b867a50SArtur Paszkiewicz if (raid_io->completion_cb != NULL) {
2632b867a50SArtur Paszkiewicz raid_io->completion_cb(raid_io, status);
2642b867a50SArtur Paszkiewicz } else {
265a4e1703eSArtur Paszkiewicz raid_test_bdev_io_complete(raid_io, status);
266a4e1703eSArtur Paszkiewicz }
2672b867a50SArtur Paszkiewicz }
268a4e1703eSArtur Paszkiewicz
269a4e1703eSArtur Paszkiewicz bool
raid_bdev_io_complete_part(struct raid_bdev_io * raid_io,uint64_t completed,enum spdk_bdev_io_status status)270a4e1703eSArtur Paszkiewicz raid_bdev_io_complete_part(struct raid_bdev_io *raid_io, uint64_t completed,
271a4e1703eSArtur Paszkiewicz enum spdk_bdev_io_status status)
272a4e1703eSArtur Paszkiewicz {
273a4e1703eSArtur Paszkiewicz SPDK_CU_ASSERT_FATAL(raid_io->base_bdev_io_remaining >= completed);
274a4e1703eSArtur Paszkiewicz raid_io->base_bdev_io_remaining -= completed;
275a4e1703eSArtur Paszkiewicz
276*9820a949SArtur Paszkiewicz if (status != raid_io->base_bdev_io_status_default) {
277a4e1703eSArtur Paszkiewicz raid_io->base_bdev_io_status = status;
278a4e1703eSArtur Paszkiewicz }
279a4e1703eSArtur Paszkiewicz
280a4e1703eSArtur Paszkiewicz if (raid_io->base_bdev_io_remaining == 0) {
281a4e1703eSArtur Paszkiewicz raid_bdev_io_complete(raid_io, raid_io->base_bdev_io_status);
282a4e1703eSArtur Paszkiewicz return true;
283a4e1703eSArtur Paszkiewicz } else {
284a4e1703eSArtur Paszkiewicz return false;
285a4e1703eSArtur Paszkiewicz }
286a4e1703eSArtur Paszkiewicz }
28735a054dbSArtur Paszkiewicz
28835a054dbSArtur Paszkiewicz struct raid_base_bdev_info *
raid_bdev_channel_get_base_info(struct raid_bdev_io_channel * raid_ch,struct spdk_bdev * base_bdev)28935a054dbSArtur Paszkiewicz raid_bdev_channel_get_base_info(struct raid_bdev_io_channel *raid_ch, struct spdk_bdev *base_bdev)
29035a054dbSArtur Paszkiewicz {
29135a054dbSArtur Paszkiewicz return base_bdev->ctxt;
29235a054dbSArtur Paszkiewicz }
293