diff options
Diffstat (limited to 'fs/btrfs/tree-checker.c')
| -rw-r--r-- | fs/btrfs/tree-checker.c | 14 | 
1 files changed, 14 insertions, 0 deletions
diff --git a/fs/btrfs/tree-checker.c b/fs/btrfs/tree-checker.c index 038dfa8f1788..ab08a0b01311 100644 --- a/fs/btrfs/tree-checker.c +++ b/fs/btrfs/tree-checker.c @@ -446,6 +446,20 @@ static int check_root_key(struct extent_buffer *leaf, struct btrfs_key *key,  	btrfs_item_key_to_cpu(leaf, &item_key, slot);  	is_root_item = (item_key.type == BTRFS_ROOT_ITEM_KEY); +	/* +	 * Bad rootid for reloc trees. +	 * +	 * Reloc trees are only for subvolume trees, other trees only need +	 * to be COWed to be relocated. +	 */ +	if (unlikely(is_root_item && key->objectid == BTRFS_TREE_RELOC_OBJECTID && +		     !is_fstree(key->offset))) { +		generic_err(leaf, slot, +		"invalid reloc tree for root %lld, root id is not a subvolume tree", +			    key->offset); +		return -EUCLEAN; +	} +  	/* No such tree id */  	if (unlikely(key->objectid == 0)) {  		if (is_root_item)  | 
