xref: /spdk/test/unit/lib/bdev/raid/common.c (revision a8d21b9b550dde7d3e7ffc0cd1171528a136165f)
1 /*   SPDX-License-Identifier: BSD-3-Clause
2  *   Copyright (C) 2022 Intel Corporation.
3  *   All rights reserved.
4  */
5 
6 #include "spdk_cunit.h"
7 #include "spdk/stdinc.h"
8 #include "bdev/raid/bdev_raid.h"
9 
10 struct spdk_bdev_desc {
11 	struct spdk_bdev *bdev;
12 };
13 
14 struct raid_params {
15 	uint8_t num_base_bdevs;
16 	uint64_t base_bdev_blockcnt;
17 	uint32_t base_bdev_blocklen;
18 	uint32_t strip_size;
19 	uint32_t md_len;
20 };
21 
22 struct raid_params *g_params;
23 size_t g_params_count;
24 size_t g_params_size;
25 
26 #define ARRAY_FOR_EACH(a, e) \
27 	for (e = a; e < a + SPDK_COUNTOF(a); e++)
28 
29 #define RAID_PARAMS_FOR_EACH(p) \
30 	for (p = g_params; p < g_params + g_params_count; p++)
31 
32 static int
33 raid_test_params_alloc(size_t count)
34 {
35 	assert(g_params == NULL);
36 
37 	g_params_size = count;
38 	g_params_count = 0;
39 	g_params = calloc(count, sizeof(*g_params));
40 
41 	return g_params ? 0 : -ENOMEM;
42 }
43 
44 static void
45 raid_test_params_free(void)
46 {
47 	g_params_count = 0;
48 	g_params_size = 0;
49 	free(g_params);
50 }
51 
52 static void
53 raid_test_params_add(struct raid_params *params)
54 {
55 	assert(g_params_count < g_params_size);
56 
57 	memcpy(g_params + g_params_count, params, sizeof(*params));
58 	g_params_count++;
59 }
60 
61 static struct raid_bdev *
62 raid_test_create_raid_bdev(struct raid_params *params, struct raid_bdev_module *module)
63 {
64 	struct raid_bdev *raid_bdev;
65 	struct raid_base_bdev_info *base_info;
66 
67 	raid_bdev = calloc(1, sizeof(*raid_bdev));
68 	SPDK_CU_ASSERT_FATAL(raid_bdev != NULL);
69 
70 	raid_bdev->module = module;
71 	raid_bdev->level = module->level;
72 	raid_bdev->num_base_bdevs = params->num_base_bdevs;
73 
74 	switch (raid_bdev->module->base_bdevs_constraint.type) {
75 	case CONSTRAINT_MAX_BASE_BDEVS_REMOVED:
76 		raid_bdev->min_base_bdevs_operational = raid_bdev->num_base_bdevs -
77 							raid_bdev->module->base_bdevs_constraint.value;
78 		break;
79 	case CONSTRAINT_MIN_BASE_BDEVS_OPERATIONAL:
80 		raid_bdev->min_base_bdevs_operational = raid_bdev->module->base_bdevs_constraint.value;
81 		break;
82 	case CONSTRAINT_UNSET:
83 		raid_bdev->min_base_bdevs_operational = raid_bdev->num_base_bdevs;
84 		break;
85 	default:
86 		CU_FAIL_FATAL("unsupported raid constraint type");
87 	};
88 
89 	raid_bdev->base_bdev_info = calloc(raid_bdev->num_base_bdevs,
90 					   sizeof(struct raid_base_bdev_info));
91 	SPDK_CU_ASSERT_FATAL(raid_bdev->base_bdev_info != NULL);
92 
93 	RAID_FOR_EACH_BASE_BDEV(raid_bdev, base_info) {
94 		struct spdk_bdev *bdev;
95 		struct spdk_bdev_desc *desc;
96 
97 		bdev = calloc(1, sizeof(*bdev));
98 		SPDK_CU_ASSERT_FATAL(bdev != NULL);
99 		bdev->blockcnt = params->base_bdev_blockcnt;
100 		bdev->blocklen = params->base_bdev_blocklen;
101 
102 		desc = calloc(1, sizeof(*desc));
103 		SPDK_CU_ASSERT_FATAL(desc != NULL);
104 		desc->bdev = bdev;
105 
106 		base_info->bdev = bdev;
107 		base_info->desc = desc;
108 	}
109 
110 	raid_bdev->strip_size = params->strip_size;
111 	raid_bdev->strip_size_kb = params->strip_size * params->base_bdev_blocklen / 1024;
112 	raid_bdev->strip_size_shift = spdk_u32log2(raid_bdev->strip_size);
113 	raid_bdev->blocklen_shift = spdk_u32log2(params->base_bdev_blocklen);
114 	raid_bdev->bdev.blocklen = params->base_bdev_blocklen;
115 	raid_bdev->bdev.md_len = params->md_len;
116 
117 	return raid_bdev;
118 }
119 
120 static void
121 raid_test_delete_raid_bdev(struct raid_bdev *raid_bdev)
122 {
123 	struct raid_base_bdev_info *base_info;
124 
125 	RAID_FOR_EACH_BASE_BDEV(raid_bdev, base_info) {
126 		free(base_info->bdev);
127 		free(base_info->desc);
128 	}
129 	free(raid_bdev->base_bdev_info);
130 	free(raid_bdev);
131 }
132