btrfs: use ilog2() to replace if () branches for btrfs_bg_flags_to_raid_index()
In function btrfs_bg_flags_to_raid_index(), we use quite some if () to convert the BTRFS_BLOCK_GROUP_* bits to a index number. But the truth is, there is really no such need for so many branches at all. Since all BTRFS_BLOCK_GROUP_* flags are just one single bit set inside BTRFS_BLOCK_GROUP_PROFILES_MASK, we can easily use ilog2() to calculate their values. This calculation has an anchor point, the lowest PROFILE bit, which is RAID0. Even it's fixed on-disk format and should never change, here I added extra compile time checks to make it super safe: 1. Make sure RAID0 is always the lowest bit in PROFILE_MASK This is done by finding the first (least significant) bit set of RAID0 and PROFILE_MASK & ~RAID0. 2. Make sure RAID0 bit set beyond the highest bit of TYPE_MASK Signed-off-by: Qu Wenruo <wqu@suse.com> Reviewed-by: David Sterba <dsterba@suse.com> Signed-off-by: David Sterba <dsterba@suse.com>
This commit is contained in:
parent
f04fbcc64e
commit
719fae8920
|
@ -164,24 +164,12 @@ const struct btrfs_raid_attr btrfs_raid_array[BTRFS_NR_RAID_TYPES] = {
|
|||
*/
|
||||
enum btrfs_raid_types __attribute_const__ 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_RAID1C3)
|
||||
return BTRFS_RAID_RAID1C3;
|
||||
else if (flags & BTRFS_BLOCK_GROUP_RAID1C4)
|
||||
return BTRFS_RAID_RAID1C4;
|
||||
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;
|
||||
const u64 profile = (flags & BTRFS_BLOCK_GROUP_PROFILE_MASK);
|
||||
|
||||
return BTRFS_RAID_SINGLE; /* BTRFS_BLOCK_GROUP_SINGLE */
|
||||
if (!profile)
|
||||
return BTRFS_RAID_SINGLE;
|
||||
|
||||
return BTRFS_BG_FLAG_TO_INDEX(profile);
|
||||
}
|
||||
|
||||
const char *btrfs_bg_type_to_raid_name(u64 flags)
|
||||
|
|
|
@ -17,16 +17,37 @@ extern struct mutex uuid_mutex;
|
|||
|
||||
#define BTRFS_STRIPE_LEN SZ_64K
|
||||
|
||||
/* Used by sanity check for btrfs_raid_types. */
|
||||
#define const_ffs(n) (__builtin_ctzll(n) + 1)
|
||||
|
||||
/*
|
||||
* The conversion from BTRFS_BLOCK_GROUP_* bits to btrfs_raid_type requires
|
||||
* RAID0 always to be the lowest profile bit.
|
||||
* Although it's part of on-disk format and should never change, do extra
|
||||
* compile-time sanity checks.
|
||||
*/
|
||||
static_assert(const_ffs(BTRFS_BLOCK_GROUP_RAID0) <
|
||||
const_ffs(BTRFS_BLOCK_GROUP_PROFILE_MASK & ~BTRFS_BLOCK_GROUP_RAID0));
|
||||
static_assert(const_ilog2(BTRFS_BLOCK_GROUP_RAID0) >
|
||||
ilog2(BTRFS_BLOCK_GROUP_TYPE_MASK));
|
||||
|
||||
/* ilog2() can handle both constants and variables */
|
||||
#define BTRFS_BG_FLAG_TO_INDEX(profile) \
|
||||
ilog2((profile) >> (ilog2(BTRFS_BLOCK_GROUP_RAID0) - 1))
|
||||
|
||||
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_RAID_RAID1C3,
|
||||
BTRFS_RAID_RAID1C4,
|
||||
/* SINGLE is the special one as it doesn't have on-disk bit. */
|
||||
BTRFS_RAID_SINGLE = 0,
|
||||
|
||||
BTRFS_RAID_RAID0 = BTRFS_BG_FLAG_TO_INDEX(BTRFS_BLOCK_GROUP_RAID0),
|
||||
BTRFS_RAID_RAID1 = BTRFS_BG_FLAG_TO_INDEX(BTRFS_BLOCK_GROUP_RAID1),
|
||||
BTRFS_RAID_DUP = BTRFS_BG_FLAG_TO_INDEX(BTRFS_BLOCK_GROUP_DUP),
|
||||
BTRFS_RAID_RAID10 = BTRFS_BG_FLAG_TO_INDEX(BTRFS_BLOCK_GROUP_RAID10),
|
||||
BTRFS_RAID_RAID5 = BTRFS_BG_FLAG_TO_INDEX(BTRFS_BLOCK_GROUP_RAID5),
|
||||
BTRFS_RAID_RAID6 = BTRFS_BG_FLAG_TO_INDEX(BTRFS_BLOCK_GROUP_RAID6),
|
||||
BTRFS_RAID_RAID1C3 = BTRFS_BG_FLAG_TO_INDEX(BTRFS_BLOCK_GROUP_RAID1C3),
|
||||
BTRFS_RAID_RAID1C4 = BTRFS_BG_FLAG_TO_INDEX(BTRFS_BLOCK_GROUP_RAID1C4),
|
||||
|
||||
BTRFS_NR_RAID_TYPES
|
||||
};
|
||||
|
||||
|
|
Loading…
Reference in New Issue