diff mbox series

[05/11] btrfs: add a sanity checker for the header flags

Message ID 97c4484a58168c521d1f3c8d66feb0ea76deef51.1646692474.git.josef@toxicpanda.com (mailing list archive)
State New, archived
Headers show
Series btrfs: add snapshot_id to btrfs_header and root_item | expand

Commit Message

Josef Bacik March 7, 2022, 10:36 p.m. UTC
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(+)
diff mbox series

Patch

diff --git a/fs/btrfs/tree-checker.c b/fs/btrfs/tree-checker.c
index f0aabda9fd94..41b7fbf67e97 100644
--- a/fs/btrfs/tree-checker.c
+++ b/fs/btrfs/tree-checker.c
@@ -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]",