diff options
Diffstat (limited to 'fs/btrfs/tree-checker.c')
| -rw-r--r-- | fs/btrfs/tree-checker.c | 17 | 
1 files changed, 12 insertions, 5 deletions
| diff --git a/fs/btrfs/tree-checker.c b/fs/btrfs/tree-checker.c index 7b1fee630f97..f0ffd5ee77bd 100644 --- a/fs/btrfs/tree-checker.c +++ b/fs/btrfs/tree-checker.c @@ -1035,7 +1035,7 @@ static int check_root_item(struct extent_buffer *leaf, struct btrfs_key *key,  			   int slot)  {  	struct btrfs_fs_info *fs_info = leaf->fs_info; -	struct btrfs_root_item ri; +	struct btrfs_root_item ri = { 0 };  	const u64 valid_root_flags = BTRFS_ROOT_SUBVOL_RDONLY |  				     BTRFS_ROOT_SUBVOL_DEAD;  	int ret; @@ -1044,14 +1044,21 @@ static int check_root_item(struct extent_buffer *leaf, struct btrfs_key *key,  	if (ret < 0)  		return ret; -	if (btrfs_item_size_nr(leaf, slot) != sizeof(ri)) { +	if (btrfs_item_size_nr(leaf, slot) != sizeof(ri) && +	    btrfs_item_size_nr(leaf, slot) != btrfs_legacy_root_item_size()) {  		generic_err(leaf, slot, -			    "invalid root item size, have %u expect %zu", -			    btrfs_item_size_nr(leaf, slot), sizeof(ri)); +			    "invalid root item size, have %u expect %zu or %u", +			    btrfs_item_size_nr(leaf, slot), sizeof(ri), +			    btrfs_legacy_root_item_size());  	} +	/* +	 * For legacy root item, the members starting at generation_v2 will be +	 * all filled with 0. +	 * And since we allow geneartion_v2 as 0, it will still pass the check. +	 */  	read_extent_buffer(leaf, &ri, btrfs_item_ptr_offset(leaf, slot), -			   sizeof(ri)); +			   btrfs_item_size_nr(leaf, slot));  	/* Generation related */  	if (btrfs_root_generation(&ri) > | 
