@@ -1578,6 +1578,27 @@ static int check_inode_ref(struct extent_buffer *leaf,
return 0;
}
+static int check_header_flags(struct extent_buffer *buf)
+{
+ struct btrfs_fs_info *fs_info = buf->fs_info;
+
+ if (btrfs_fs_incompat(fs_info, EXTENT_TREE_V2)) {
+ if (unlikely(!btrfs_header_flag(buf, BTRFS_HEADER_FLAG_V2))) {
+ generic_err(buf, 0,
+ "no HEADER_FLAG_V2 set on a V2 file system");
+ return -EUCLEAN;
+ }
+ } else {
+ if (unlikely(btrfs_header_flag(buf, BTRFS_HEADER_FLAG_V2))) {
+ generic_err(buf, 0,
+ "have HEADER_FLAG_V2 set on a !V2 file system");
+ return -EUCLEAN;
+ }
+ }
+
+ return 0;
+}
+
/*
* Common point to switch the item-specific validation.
*/
@@ -1644,6 +1665,9 @@ static int check_leaf(struct extent_buffer *leaf, bool check_item_data)
u32 nritems = btrfs_header_nritems(leaf);
int slot;
+ if (unlikely(check_header_flags(leaf)))
+ return -EUCLEAN;
+
if (unlikely(btrfs_header_level(leaf) != 0)) {
generic_err(leaf, 0,
"invalid level for leaf, have %d expect 0",
@@ -1807,6 +1831,9 @@ int btrfs_check_node(struct extent_buffer *node)
u64 bytenr;
int ret = 0;
+ if (unlikely(check_header_flags(node)))
+ return -EUCLEAN;
+
if (unlikely(level <= 0 || level >= BTRFS_MAX_LEVEL)) {
generic_err(node, 0,
"invalid level for node, have %d expect [1, %d]",
Make sure that we don't have HEADER_FLAG_V2 set on !V2 file systems, but we do have it set on V2 file systems. Signed-off-by: Josef Bacik <josef@toxicpanda.com> --- fs/btrfs/tree-checker.c | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+)