btrfs-progs: print-tree: handle all supported flags

Although we already have a pretty good array defined for all
super/compat_ro/incompat flags, we still rely on a manually defined mask
to do the printing.

This can lead to easy de-sync between the definition and the flags.

Change it to automatically iterate through the array to calculate the
flags, and add the remaining super flags.

Pull-request: #810
Signed-off-by: Qu Wenruo <wqu@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
This commit is contained in:
Qu Wenruo 2024-06-08 13:37:17 +09:30 committed by David Sterba
parent 2f8a6ee294
commit 5dc737c42c
1 changed files with 19 additions and 17 deletions

View File

@ -1950,18 +1950,13 @@ static struct readable_flag_entry super_flags_array[] = {
DEF_SUPER_FLAG_ENTRY(CHANGING_FSID_V2), DEF_SUPER_FLAG_ENTRY(CHANGING_FSID_V2),
DEF_SUPER_FLAG_ENTRY(SEEDING), DEF_SUPER_FLAG_ENTRY(SEEDING),
DEF_SUPER_FLAG_ENTRY(METADUMP), DEF_SUPER_FLAG_ENTRY(METADUMP),
DEF_SUPER_FLAG_ENTRY(METADUMP_V2) DEF_SUPER_FLAG_ENTRY(METADUMP_V2),
DEF_SUPER_FLAG_ENTRY(CHANGING_BG_TREE),
DEF_SUPER_FLAG_ENTRY(CHANGING_DATA_CSUM),
DEF_SUPER_FLAG_ENTRY(CHANGING_META_CSUM),
}; };
static const int super_flags_num = ARRAY_SIZE(super_flags_array); static const int super_flags_num = ARRAY_SIZE(super_flags_array);
#define BTRFS_SUPER_FLAG_SUPP (BTRFS_HEADER_FLAG_WRITTEN |\
BTRFS_HEADER_FLAG_RELOC |\
BTRFS_SUPER_FLAG_CHANGING_FSID |\
BTRFS_SUPER_FLAG_CHANGING_FSID_V2 |\
BTRFS_SUPER_FLAG_SEEDING |\
BTRFS_SUPER_FLAG_METADUMP |\
BTRFS_SUPER_FLAG_METADUMP_V2)
static void __print_readable_flag(u64 flag, struct readable_flag_entry *array, static void __print_readable_flag(u64 flag, struct readable_flag_entry *array,
int array_size, u64 supported_flags) int array_size, u64 supported_flags)
{ {
@ -1995,26 +1990,33 @@ static void __print_readable_flag(u64 flag, struct readable_flag_entry *array,
static void print_readable_compat_ro_flag(u64 flag) static void print_readable_compat_ro_flag(u64 flag)
{ {
/* u64 print_flags = 0;
* We know about the FREE_SPACE_TREE{,_VALID} bits, but we don't
* actually support them yet. for (int i = 0; i < compat_ro_flags_num; i++)
*/ print_flags |= compat_ro_flags_array[i].bit;
return __print_readable_flag(flag, compat_ro_flags_array, return __print_readable_flag(flag, compat_ro_flags_array,
compat_ro_flags_num, compat_ro_flags_num,
BTRFS_FEATURE_COMPAT_RO_SUPP); print_flags);
} }
static void print_readable_incompat_flag(u64 flag) static void print_readable_incompat_flag(u64 flag)
{ {
u64 print_flags = 0;
for (int i = 0; i < incompat_flags_num; i++)
print_flags |= incompat_flags_array[i].bit;
return __print_readable_flag(flag, incompat_flags_array, return __print_readable_flag(flag, incompat_flags_array,
incompat_flags_num, incompat_flags_num, print_flags);
BTRFS_FEATURE_INCOMPAT_SUPP);
} }
static void print_readable_super_flag(u64 flag) static void print_readable_super_flag(u64 flag)
{ {
u64 print_flags = 0;
for (int i = 0; i < super_flags_num; i++)
print_flags |= super_flags_array[i].bit;
return __print_readable_flag(flag, super_flags_array, return __print_readable_flag(flag, super_flags_array,
super_flags_num, BTRFS_SUPER_FLAG_SUPP); super_flags_num, print_flags);
} }
static void print_sys_chunk_array(struct btrfs_super_block *sb) static void print_sys_chunk_array(struct btrfs_super_block *sb)