diff options
| author | Maxime Ripard <[email protected]> | 2024-07-04 15:19:33 +0200 | 
|---|---|---|
| committer | Maxime Ripard <[email protected]> | 2024-07-04 15:19:33 +0200 | 
| commit | afeea2758b4f1210361ce2a91d8fa3e7df606ad2 (patch) | |
| tree | 969164f4e52fac6d4ec7d275540e702375e80950 /fs/btrfs/tree-checker.c | |
| parent | 539d33b5783804f22a62bd62ff463dfd1cef4265 (diff) | |
| parent | 896868eded124059023be0af92d68cdaf9b4de70 (diff) | |
Merge drm-misc-next-2024-07-04 into drm-misc-next-fixes
Let's start the drm-misc-next-fixes cycle.
Signed-off-by: Maxime Ripard <[email protected]>
Diffstat (limited to 'fs/btrfs/tree-checker.c')
| -rw-r--r-- | fs/btrfs/tree-checker.c | 32 | 
1 files changed, 16 insertions, 16 deletions
diff --git a/fs/btrfs/tree-checker.c b/fs/btrfs/tree-checker.c index c8fbcae4e88e..a2c3651a3d8f 100644 --- a/fs/btrfs/tree-checker.c +++ b/fs/btrfs/tree-checker.c @@ -1797,6 +1797,11 @@ enum btrfs_tree_block_status __btrfs_check_leaf(struct extent_buffer *leaf)  		return BTRFS_TREE_BLOCK_INVALID_LEVEL;  	} +	if (unlikely(!btrfs_header_flag(leaf, BTRFS_HEADER_FLAG_WRITTEN))) { +		generic_err(leaf, 0, "invalid flag for leaf, WRITTEN not set"); +		return BTRFS_TREE_BLOCK_WRITTEN_NOT_SET; +	} +  	/*  	 * Extent buffers from a relocation tree have a owner field that  	 * corresponds to the subvolume tree they are based on. So just from an @@ -1858,6 +1863,7 @@ enum btrfs_tree_block_status __btrfs_check_leaf(struct extent_buffer *leaf)  	for (slot = 0; slot < nritems; slot++) {  		u32 item_end_expected;  		u64 item_data_end; +		enum btrfs_tree_block_status ret;  		btrfs_item_key_to_cpu(leaf, &key, slot); @@ -1913,21 +1919,10 @@ enum btrfs_tree_block_status __btrfs_check_leaf(struct extent_buffer *leaf)  			return BTRFS_TREE_BLOCK_INVALID_OFFSETS;  		} -		/* -		 * We only want to do this if WRITTEN is set, otherwise the leaf -		 * may be in some intermediate state and won't appear valid. -		 */ -		if (btrfs_header_flag(leaf, BTRFS_HEADER_FLAG_WRITTEN)) { -			enum btrfs_tree_block_status ret; - -			/* -			 * Check if the item size and content meet other -			 * criteria -			 */ -			ret = check_leaf_item(leaf, &key, slot, &prev_key); -			if (unlikely(ret != BTRFS_TREE_BLOCK_CLEAN)) -				return ret; -		} +		/* Check if the item size and content meet other criteria. */ +		ret = check_leaf_item(leaf, &key, slot, &prev_key); +		if (unlikely(ret != BTRFS_TREE_BLOCK_CLEAN)) +			return ret;  		prev_key.objectid = key.objectid;  		prev_key.type = key.type; @@ -1957,6 +1952,11 @@ enum btrfs_tree_block_status __btrfs_check_node(struct extent_buffer *node)  	int level = btrfs_header_level(node);  	u64 bytenr; +	if (unlikely(!btrfs_header_flag(node, BTRFS_HEADER_FLAG_WRITTEN))) { +		generic_err(node, 0, "invalid flag for node, WRITTEN not set"); +		return BTRFS_TREE_BLOCK_WRITTEN_NOT_SET; +	} +  	if (unlikely(level <= 0 || level >= BTRFS_MAX_LEVEL)) {  		generic_err(node, 0,  			"invalid level for node, have %d expect [1, %d]", @@ -2021,7 +2021,7 @@ int btrfs_check_eb_owner(const struct extent_buffer *eb, u64 root_owner)  	 * Skip dummy fs, as selftests don't create unique ebs for each dummy  	 * root.  	 */ -	if (test_bit(BTRFS_FS_STATE_DUMMY_FS_INFO, &eb->fs_info->fs_state)) +	if (btrfs_is_testing(eb->fs_info))  		return 0;  	/*  	 * There are several call sites (backref walking, qgroup, and data  |