xref: /spdk/test/unit/lib/bdev/raid/common.c (revision f8abbede89d30584d2a4f8427b13896f8591b873)
1 /*   SPDX-License-Identifier: BSD-3-Clause
2  *   Copyright (C) 2022 Intel Corporation.
3  *   All rights reserved.
4  */
5 
6 #include "spdk_internal/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 struct spdk_bdev *
33 spdk_bdev_desc_get_bdev(struct spdk_bdev_desc *desc)
34 {
35 	return desc->bdev;
36 }
37 
38 static int
39 raid_test_params_alloc(size_t count)
40 {
41 	assert(g_params == NULL);
42 
43 	g_params_size = count;
44 	g_params_count = 0;
45 	g_params = calloc(count, sizeof(*g_params));
46 
47 	return g_params ? 0 : -ENOMEM;
48 }
49 
50 static void
51 raid_test_params_free(void)
52 {
53 	g_params_count = 0;
54 	g_params_size = 0;
55 	free(g_params);
56 }
57 
58 static void
59 raid_test_params_add(struct raid_params *params)
60 {
61 	assert(g_params_count < g_params_size);
62 
63 	memcpy(g_params + g_params_count, params, sizeof(*params));
64 	g_params_count++;
65 }
66 
67 static struct raid_bdev *
68 raid_test_create_raid_bdev(struct raid_params *params, struct raid_bdev_module *module)
69 {
70 	struct raid_bdev *raid_bdev;
71 	struct raid_base_bdev_info *base_info;
72 
73 	raid_bdev = calloc(1, sizeof(*raid_bdev));
74 	SPDK_CU_ASSERT_FATAL(raid_bdev != NULL);
75 
76 	raid_bdev->module = module;
77 	raid_bdev->level = module->level;
78 	raid_bdev->num_base_bdevs = params->num_base_bdevs;
79 
80 	switch (raid_bdev->module->base_bdevs_constraint.type) {
81 	case CONSTRAINT_MAX_BASE_BDEVS_REMOVED:
82 		raid_bdev->min_base_bdevs_operational = raid_bdev->num_base_bdevs -
83 							raid_bdev->module->base_bdevs_constraint.value;
84 		break;
85 	case CONSTRAINT_MIN_BASE_BDEVS_OPERATIONAL:
86 		raid_bdev->min_base_bdevs_operational = raid_bdev->module->base_bdevs_constraint.value;
87 		break;
88 	case CONSTRAINT_UNSET:
89 		raid_bdev->min_base_bdevs_operational = raid_bdev->num_base_bdevs;
90 		break;
91 	default:
92 		CU_FAIL_FATAL("unsupported raid constraint type");
93 	};
94 
95 	raid_bdev->superblock_enabled = false;
96 	raid_bdev->base_bdev_info = calloc(raid_bdev->num_base_bdevs,
97 					   sizeof(struct raid_base_bdev_info));
98 	SPDK_CU_ASSERT_FATAL(raid_bdev->base_bdev_info != NULL);
99 
100 	RAID_FOR_EACH_BASE_BDEV(raid_bdev, base_info) {
101 		struct spdk_bdev *bdev;
102 		struct spdk_bdev_desc *desc;
103 
104 		bdev = calloc(1, sizeof(*bdev));
105 		SPDK_CU_ASSERT_FATAL(bdev != NULL);
106 		bdev->blockcnt = params->base_bdev_blockcnt;
107 		bdev->blocklen = params->base_bdev_blocklen;
108 
109 		desc = calloc(1, sizeof(*desc));
110 		SPDK_CU_ASSERT_FATAL(desc != NULL);
111 		desc->bdev = bdev;
112 
113 		base_info->desc = desc;
114 		base_info->data_offset = 0;
115 		base_info->data_size = bdev->blockcnt;
116 	}
117 
118 	raid_bdev->strip_size = params->strip_size;
119 	raid_bdev->strip_size_kb = params->strip_size * params->base_bdev_blocklen / 1024;
120 	raid_bdev->strip_size_shift = spdk_u32log2(raid_bdev->strip_size);
121 	raid_bdev->blocklen_shift = spdk_u32log2(params->base_bdev_blocklen);
122 	raid_bdev->bdev.blocklen = params->base_bdev_blocklen;
123 	raid_bdev->bdev.md_len = params->md_len;
124 
125 	return raid_bdev;
126 }
127 
128 static void
129 raid_test_delete_raid_bdev(struct raid_bdev *raid_bdev)
130 {
131 	struct raid_base_bdev_info *base_info;
132 
133 	RAID_FOR_EACH_BASE_BDEV(raid_bdev, base_info) {
134 		free(base_info->desc->bdev);
135 		free(base_info->desc);
136 	}
137 	free(raid_bdev->base_bdev_info);
138 	free(raid_bdev);
139 }
140