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