diff options
Diffstat (limited to 'fs/btrfs/disk-io.c')
| -rw-r--r-- | fs/btrfs/disk-io.c | 40 | 
1 files changed, 11 insertions, 29 deletions
diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c index 97beb351a10c..044981cf6df9 100644 --- a/fs/btrfs/disk-io.c +++ b/fs/btrfs/disk-io.c @@ -40,6 +40,7 @@  #include "compression.h"  #include "tree-checker.h"  #include "ref-verify.h" +#include "block-group.h"  #define BTRFS_SUPER_FLAG_SUPP	(BTRFS_HEADER_FLAG_WRITTEN |\  				 BTRFS_HEADER_FLAG_RELOC |\ @@ -416,6 +417,16 @@ int btrfs_verify_level_key(struct extent_buffer *eb, int level,  	 */  	if (btrfs_header_generation(eb) > fs_info->last_trans_committed)  		return 0; + +	/* We have @first_key, so this @eb must have at least one item */ +	if (btrfs_header_nritems(eb) == 0) { +		btrfs_err(fs_info, +		"invalid tree nritems, bytenr=%llu nritems=0 expect >0", +			  eb->start); +		WARN_ON(IS_ENABLED(CONFIG_BTRFS_DEBUG)); +		return -EUCLEAN; +	} +  	if (found_level)  		btrfs_node_key_to_cpu(eb, &found_key, 0);  	else @@ -1037,35 +1048,6 @@ void readahead_tree_block(struct btrfs_fs_info *fs_info, u64 bytenr)  		free_extent_buffer(buf);  } -int reada_tree_block_flagged(struct btrfs_fs_info *fs_info, u64 bytenr, -			 int mirror_num, struct extent_buffer **eb) -{ -	struct extent_buffer *buf = NULL; -	int ret; - -	buf = btrfs_find_create_tree_block(fs_info, bytenr); -	if (IS_ERR(buf)) -		return 0; - -	set_bit(EXTENT_BUFFER_READAHEAD, &buf->bflags); - -	ret = read_extent_buffer_pages(buf, WAIT_PAGE_LOCK, mirror_num); -	if (ret) { -		free_extent_buffer_stale(buf); -		return ret; -	} - -	if (test_bit(EXTENT_BUFFER_CORRUPT, &buf->bflags)) { -		free_extent_buffer_stale(buf); -		return -EIO; -	} else if (extent_buffer_uptodate(buf)) { -		*eb = buf; -	} else { -		free_extent_buffer(buf); -	} -	return 0; -} -  struct extent_buffer *btrfs_find_create_tree_block(  						struct btrfs_fs_info *fs_info,  						u64 bytenr)  |