1 /* SPDX-License-Identifier: BSD-3-Clause 2 * Copyright (c) Intel Corporation. 3 * All rights reserved. 4 */ 5 6 #include "bdev_raid.h" 7 8 #include "spdk/env.h" 9 #include "spdk/thread.h" 10 #include "spdk/string.h" 11 #include "spdk/util.h" 12 13 #include "spdk/log.h" 14 15 struct raid5f_info { 16 /* The parent raid bdev */ 17 struct raid_bdev *raid_bdev; 18 19 /* Number of data blocks in a stripe (without parity) */ 20 uint64_t stripe_blocks; 21 22 /* Number of stripes on this array */ 23 uint64_t total_stripes; 24 }; 25 26 static inline uint8_t 27 raid5f_stripe_data_chunks_num(const struct raid_bdev *raid_bdev) 28 { 29 return raid_bdev->num_base_bdevs - raid_bdev->module->base_bdevs_max_degraded; 30 } 31 32 static void 33 raid5f_submit_rw_request(struct raid_bdev_io *raid_io) 34 { 35 raid_bdev_io_complete(raid_io, SPDK_BDEV_IO_STATUS_FAILED); 36 } 37 38 static int 39 raid5f_start(struct raid_bdev *raid_bdev) 40 { 41 uint64_t min_blockcnt = UINT64_MAX; 42 struct raid_base_bdev_info *base_info; 43 struct raid5f_info *r5f_info; 44 45 r5f_info = calloc(1, sizeof(*r5f_info)); 46 if (!r5f_info) { 47 SPDK_ERRLOG("Failed to allocate r5f_info\n"); 48 return -ENOMEM; 49 } 50 r5f_info->raid_bdev = raid_bdev; 51 52 RAID_FOR_EACH_BASE_BDEV(raid_bdev, base_info) { 53 min_blockcnt = spdk_min(min_blockcnt, base_info->bdev->blockcnt); 54 } 55 56 r5f_info->total_stripes = min_blockcnt / raid_bdev->strip_size; 57 r5f_info->stripe_blocks = raid_bdev->strip_size * raid5f_stripe_data_chunks_num(raid_bdev); 58 59 raid_bdev->bdev.blockcnt = r5f_info->stripe_blocks * r5f_info->total_stripes; 60 raid_bdev->bdev.optimal_io_boundary = r5f_info->stripe_blocks; 61 raid_bdev->bdev.split_on_optimal_io_boundary = true; 62 63 raid_bdev->module_private = r5f_info; 64 65 return 0; 66 } 67 68 static void 69 raid5f_stop(struct raid_bdev *raid_bdev) 70 { 71 struct raid5f_info *r5f_info = raid_bdev->module_private; 72 73 free(r5f_info); 74 } 75 76 static struct raid_bdev_module g_raid5f_module = { 77 .level = RAID5F, 78 .base_bdevs_min = 3, 79 .base_bdevs_max_degraded = 1, 80 .start = raid5f_start, 81 .stop = raid5f_stop, 82 .submit_rw_request = raid5f_submit_rw_request, 83 }; 84 RAID_MODULE_REGISTER(&g_raid5f_module) 85 86 SPDK_LOG_REGISTER_COMPONENT(bdev_raid5f) 87