btrfs: use ilog2() to replace if () branches for btrfs_bg_flags_to_raid_index()
authorQu Wenruo <wqu@suse.com>
Wed, 20 Apr 2022 08:08:28 +0000 (16:08 +0800)
committerDavid Sterba <dsterba@suse.com>
Mon, 16 May 2022 15:03:16 +0000 (17:03 +0200)
commit719fae8920e4f42643ea306b95addb40bec87a25
treeed6dc04f9c54ee6f283be23dba4e5b9963ad9194
parentf04fbcc64e4be16185151f9fca44ea1b3d074bd0
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>
fs/btrfs/volumes.c
fs/btrfs/volumes.h