diff options
Diffstat (limited to 'fs/btrfs/ctree.c')
| -rw-r--r-- | fs/btrfs/ctree.c | 16 | 
1 files changed, 10 insertions, 6 deletions
diff --git a/fs/btrfs/ctree.c b/fs/btrfs/ctree.c index 0f11ebc92f02..54114b4887dd 100644 --- a/fs/btrfs/ctree.c +++ b/fs/btrfs/ctree.c @@ -1439,8 +1439,9 @@ get_old_root(struct btrfs_root *root, u64 time_seq)  		btrfs_tree_read_unlock(eb_root);  		free_extent_buffer(eb_root);  		old = read_tree_block(root, logical, 0); -		if (WARN_ON(!old || !extent_buffer_uptodate(old))) { -			free_extent_buffer(old); +		if (WARN_ON(IS_ERR(old) || !extent_buffer_uptodate(old))) { +			if (!IS_ERR(old)) +				free_extent_buffer(old);  			btrfs_warn(root->fs_info,  				"failed to read tree block %llu from get_old_root", logical);  		} else { @@ -1685,7 +1686,9 @@ int btrfs_realloc_node(struct btrfs_trans_handle *trans,  		if (!cur || !uptodate) {  			if (!cur) {  				cur = read_tree_block(root, blocknr, gen); -				if (!cur || !extent_buffer_uptodate(cur)) { +				if (IS_ERR(cur)) { +					return PTR_ERR(cur); +				} else if (!extent_buffer_uptodate(cur)) {  					free_extent_buffer(cur);  					return -EIO;  				} @@ -1864,8 +1867,9 @@ static noinline struct extent_buffer *read_node_slot(struct btrfs_root *root,  	eb = read_tree_block(root, btrfs_node_blockptr(parent, slot),  			     btrfs_node_ptr_generation(parent, slot)); -	if (eb && !extent_buffer_uptodate(eb)) { -		free_extent_buffer(eb); +	if (IS_ERR(eb) || !extent_buffer_uptodate(eb)) { +		if (!IS_ERR(eb)) +			free_extent_buffer(eb);  		eb = NULL;  	} @@ -2494,7 +2498,7 @@ read_block_for_search(struct btrfs_trans_handle *trans,  	ret = -EAGAIN;  	tmp = read_tree_block(root, blocknr, 0); -	if (tmp) { +	if (!IS_ERR(tmp)) {  		/*  		 * If the read above didn't mark this buffer up to date,  		 * it will never end up being up to date.  Set ret to EIO now  |