On 2018年02月02日 19:37, Nikolay Borisov wrote: > > > On 2.02.2018 10:19, Qu Wenruo wrote: >> As part of the effort to unify code and behavior between btrfs-progs and >> kernel, copy the btrfs_raid_array from kernel to btrfs-progs. >> >> So later we can use the btrfs_raid_array[] to get needed raid info other >> than manually do if-else branches. >> >> Signed-off-by: Qu Wenruo <w...@suse.com> >> --- >> ctree.h | 12 +++++++++++- >> volumes.c | 66 >> +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ >> volumes.h | 30 +++++++++++++++++++++++++++++ >> 3 files changed, 107 insertions(+), 1 deletion(-) >> >> diff --git a/ctree.h b/ctree.h >> index 17cdac76c58c..c76849d8deb7 100644 >> --- a/ctree.h >> +++ b/ctree.h >> @@ -958,7 +958,17 @@ struct btrfs_csum_item { >> #define BTRFS_BLOCK_GROUP_RAID5 (1ULL << 7) >> #define BTRFS_BLOCK_GROUP_RAID6 (1ULL << 8) >> #define BTRFS_BLOCK_GROUP_RESERVED BTRFS_AVAIL_ALLOC_BIT_SINGLE > <not related to this patch but i just saw it> > > BTRFS_BLOCK_GROUP_RESERVED differs in userspace than in kernel space. > The btrfs_Tree header has it defined as: > > #define BTRFS_BLOCK_GROUP_RESERVED (BTRFS_AVAIL_ALLOC_BIT_SINGLE | \ > > BTRFS_SPACE_INFO_GLOBAL_RSV)
Another good place to cleanup. :) Thanks, Qu > > > Otherwise LGTM: > > Reviewed-by: Nikolay Borisov <nbori...@suse.com> > >> -#define BTRFS_NR_RAID_TYPES 7 >> + >> +enum btrfs_raid_types { >> + BTRFS_RAID_RAID10, >> + BTRFS_RAID_RAID1, >> + BTRFS_RAID_DUP, >> + BTRFS_RAID_RAID0, >> + BTRFS_RAID_SINGLE, >> + BTRFS_RAID_RAID5, >> + BTRFS_RAID_RAID6, >> + BTRFS_NR_RAID_TYPES >> +}; >> >> #define BTRFS_BLOCK_GROUP_TYPE_MASK (BTRFS_BLOCK_GROUP_DATA | \ >> BTRFS_BLOCK_GROUP_SYSTEM | \ >> diff --git a/volumes.c b/volumes.c >> index a9dc8c939dc5..b47ff1f392b5 100644 >> --- a/volumes.c >> +++ b/volumes.c >> @@ -30,6 +30,72 @@ >> #include "utils.h" >> #include "kernel-lib/raid56.h" >> >> +const struct btrfs_raid_attr btrfs_raid_array[BTRFS_NR_RAID_TYPES] = { >> + [BTRFS_RAID_RAID10] = { >> + .sub_stripes = 2, >> + .dev_stripes = 1, >> + .devs_max = 0, /* 0 == as many as possible */ >> + .devs_min = 4, >> + .tolerated_failures = 1, >> + .devs_increment = 2, >> + .ncopies = 2, >> + }, >> + [BTRFS_RAID_RAID1] = { >> + .sub_stripes = 1, >> + .dev_stripes = 1, >> + .devs_max = 2, >> + .devs_min = 2, >> + .tolerated_failures = 1, >> + .devs_increment = 2, >> + .ncopies = 2, >> + }, >> + [BTRFS_RAID_DUP] = { >> + .sub_stripes = 1, >> + .dev_stripes = 2, >> + .devs_max = 1, >> + .devs_min = 1, >> + .tolerated_failures = 0, >> + .devs_increment = 1, >> + .ncopies = 2, >> + }, >> + [BTRFS_RAID_RAID0] = { >> + .sub_stripes = 1, >> + .dev_stripes = 1, >> + .devs_max = 0, >> + .devs_min = 2, >> + .tolerated_failures = 0, >> + .devs_increment = 1, >> + .ncopies = 1, >> + }, >> + [BTRFS_RAID_SINGLE] = { >> + .sub_stripes = 1, >> + .dev_stripes = 1, >> + .devs_max = 1, >> + .devs_min = 1, >> + .tolerated_failures = 0, >> + .devs_increment = 1, >> + .ncopies = 1, >> + }, >> + [BTRFS_RAID_RAID5] = { >> + .sub_stripes = 1, >> + .dev_stripes = 1, >> + .devs_max = 0, >> + .devs_min = 2, >> + .tolerated_failures = 1, >> + .devs_increment = 1, >> + .ncopies = 2, >> + }, >> + [BTRFS_RAID_RAID6] = { >> + .sub_stripes = 1, >> + .dev_stripes = 1, >> + .devs_max = 0, >> + .devs_min = 3, >> + .tolerated_failures = 2, >> + .devs_increment = 1, >> + .ncopies = 3, >> + }, >> +}; >> + >> struct stripe { >> struct btrfs_device *dev; >> u64 physical; >> diff --git a/volumes.h b/volumes.h >> index 7bbdf615d31a..612a0a7586f4 100644 >> --- a/volumes.h >> +++ b/volumes.h >> @@ -108,6 +108,36 @@ struct map_lookup { >> struct btrfs_bio_stripe stripes[]; >> }; >> >> +struct btrfs_raid_attr { >> + int sub_stripes; /* sub_stripes info for map */ >> + int dev_stripes; /* stripes per dev */ >> + int devs_max; /* max devs to use */ >> + int devs_min; /* min devs needed */ >> + int tolerated_failures; /* max tolerated fail devs */ >> + int devs_increment; /* ndevs has to be a multiple of this */ >> + int ncopies; /* how many copies to data has */ >> +}; >> + >> +extern const struct btrfs_raid_attr btrfs_raid_array[BTRFS_NR_RAID_TYPES]; >> + >> +static inline enum btrfs_raid_types btrfs_bg_flags_to_raid_index(u64 flags) >> +{ >> + if (flags & BTRFS_BLOCK_GROUP_RAID10) >> + return BTRFS_RAID_RAID10; >> + else if (flags & BTRFS_BLOCK_GROUP_RAID1) >> + return BTRFS_RAID_RAID1; >> + else if (flags & BTRFS_BLOCK_GROUP_DUP) >> + return BTRFS_RAID_DUP; >> + else if (flags & BTRFS_BLOCK_GROUP_RAID0) >> + return BTRFS_RAID_RAID0; >> + else if (flags & BTRFS_BLOCK_GROUP_RAID5) >> + return BTRFS_RAID_RAID5; >> + else if (flags & BTRFS_BLOCK_GROUP_RAID6) >> + return BTRFS_RAID_RAID6; >> + >> + return BTRFS_RAID_SINGLE; /* BTRFS_BLOCK_GROUP_SINGLE */ >> +} >> + >> #define btrfs_multi_bio_size(n) (sizeof(struct btrfs_multi_bio) + \ >> (sizeof(struct btrfs_bio_stripe) * (n))) >> #define btrfs_map_lookup_size(n) (sizeof(struct map_lookup) + \ >> > -- > To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in > the body of a message to majord...@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html >
signature.asc
Description: OpenPGP digital signature