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