xref: /spdk/test/unit/lib/bdev/raid/common.c (revision 9820a9496540eb196e6693f1d414dc9262c03da3)
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