From 5dc737c42c1e01cb33720a52e70480763ed7cbeb Mon Sep 17 00:00:00 2001 From: Qu Wenruo Date: Sat, 8 Jun 2024 13:37:17 +0930 Subject: [PATCH] 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 Signed-off-by: David Sterba --- kernel-shared/print-tree.c | 36 +++++++++++++++++++----------------- 1 file changed, 19 insertions(+), 17 deletions(-) diff --git a/kernel-shared/print-tree.c b/kernel-shared/print-tree.c index a7018cb7..568a84cb 100644 --- a/kernel-shared/print-tree.c +++ b/kernel-shared/print-tree.c @@ -1950,18 +1950,13 @@ static struct readable_flag_entry super_flags_array[] = { DEF_SUPER_FLAG_ENTRY(CHANGING_FSID_V2), DEF_SUPER_FLAG_ENTRY(SEEDING), 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); -#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, 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) { - /* - * We know about the FREE_SPACE_TREE{,_VALID} bits, but we don't - * actually support them yet. - */ + u64 print_flags = 0; + + 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, compat_ro_flags_num, - BTRFS_FEATURE_COMPAT_RO_SUPP); + print_flags); } 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, - incompat_flags_num, - BTRFS_FEATURE_INCOMPAT_SUPP); + incompat_flags_num, print_flags); } 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, - super_flags_num, BTRFS_SUPER_FLAG_SUPP); + super_flags_num, print_flags); } static void print_sys_chunk_array(struct btrfs_super_block *sb)