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