diff options
Diffstat (limited to 'fs/btrfs/ctree.c')
| -rw-r--r-- | fs/btrfs/ctree.c | 18 | 
1 files changed, 12 insertions, 6 deletions
diff --git a/fs/btrfs/ctree.c b/fs/btrfs/ctree.c index 531e0a8645b0..1e74cf826532 100644 --- a/fs/btrfs/ctree.c +++ b/fs/btrfs/ctree.c @@ -1032,14 +1032,17 @@ static noinline int update_ref_for_cow(struct btrfs_trans_handle *trans,  		     root->root_key.objectid == BTRFS_TREE_RELOC_OBJECTID) &&  		    !(flags & BTRFS_BLOCK_FLAG_FULL_BACKREF)) {  			ret = btrfs_inc_ref(trans, root, buf, 1); -			BUG_ON(ret); /* -ENOMEM */ +			if (ret) +				return ret;  			if (root->root_key.objectid ==  			    BTRFS_TREE_RELOC_OBJECTID) {  				ret = btrfs_dec_ref(trans, root, buf, 0); -				BUG_ON(ret); /* -ENOMEM */ +				if (ret) +					return ret;  				ret = btrfs_inc_ref(trans, root, cow, 1); -				BUG_ON(ret); /* -ENOMEM */ +				if (ret) +					return ret;  			}  			new_flags |= BTRFS_BLOCK_FLAG_FULL_BACKREF;  		} else { @@ -1049,7 +1052,8 @@ static noinline int update_ref_for_cow(struct btrfs_trans_handle *trans,  				ret = btrfs_inc_ref(trans, root, cow, 1);  			else  				ret = btrfs_inc_ref(trans, root, cow, 0); -			BUG_ON(ret); /* -ENOMEM */ +			if (ret) +				return ret;  		}  		if (new_flags != 0) {  			int level = btrfs_header_level(buf); @@ -1068,9 +1072,11 @@ static noinline int update_ref_for_cow(struct btrfs_trans_handle *trans,  				ret = btrfs_inc_ref(trans, root, cow, 1);  			else  				ret = btrfs_inc_ref(trans, root, cow, 0); -			BUG_ON(ret); /* -ENOMEM */ +			if (ret) +				return ret;  			ret = btrfs_dec_ref(trans, root, buf, 1); -			BUG_ON(ret); /* -ENOMEM */ +			if (ret) +				return ret;  		}  		clean_tree_block(fs_info, buf);  		*last_ref = 1;  |