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