diff options
Diffstat (limited to 'fs/btrfs/extent-tree.c')
-rw-r--r-- | fs/btrfs/extent-tree.c | 56 |
1 files changed, 35 insertions, 21 deletions
diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c index a3a902fdeb49..395e222e39ab 100644 --- a/fs/btrfs/extent-tree.c +++ b/fs/btrfs/extent-tree.c | |||
@@ -5123,8 +5123,10 @@ static int __btrfs_free_extent(struct btrfs_trans_handle *trans, | |||
5123 | ret = remove_extent_backref(trans, extent_root, path, | 5123 | ret = remove_extent_backref(trans, extent_root, path, |
5124 | NULL, refs_to_drop, | 5124 | NULL, refs_to_drop, |
5125 | is_data); | 5125 | is_data); |
5126 | if (ret) | 5126 | if (ret) { |
5127 | goto abort; | 5127 | btrfs_abort_transaction(trans, extent_root, ret); |
5128 | goto out; | ||
5129 | } | ||
5128 | btrfs_release_path(path); | 5130 | btrfs_release_path(path); |
5129 | path->leave_spinning = 1; | 5131 | path->leave_spinning = 1; |
5130 | 5132 | ||
@@ -5142,8 +5144,10 @@ static int __btrfs_free_extent(struct btrfs_trans_handle *trans, | |||
5142 | btrfs_print_leaf(extent_root, | 5144 | btrfs_print_leaf(extent_root, |
5143 | path->nodes[0]); | 5145 | path->nodes[0]); |
5144 | } | 5146 | } |
5145 | if (ret < 0) | 5147 | if (ret < 0) { |
5146 | goto abort; | 5148 | btrfs_abort_transaction(trans, extent_root, ret); |
5149 | goto out; | ||
5150 | } | ||
5147 | extent_slot = path->slots[0]; | 5151 | extent_slot = path->slots[0]; |
5148 | } | 5152 | } |
5149 | } else if (ret == -ENOENT) { | 5153 | } else if (ret == -ENOENT) { |
@@ -5157,7 +5161,8 @@ static int __btrfs_free_extent(struct btrfs_trans_handle *trans, | |||
5157 | (unsigned long long)owner_objectid, | 5161 | (unsigned long long)owner_objectid, |
5158 | (unsigned long long)owner_offset); | 5162 | (unsigned long long)owner_offset); |
5159 | } else { | 5163 | } else { |
5160 | goto abort; | 5164 | btrfs_abort_transaction(trans, extent_root, ret); |
5165 | goto out; | ||
5161 | } | 5166 | } |
5162 | 5167 | ||
5163 | leaf = path->nodes[0]; | 5168 | leaf = path->nodes[0]; |
@@ -5167,8 +5172,10 @@ static int __btrfs_free_extent(struct btrfs_trans_handle *trans, | |||
5167 | BUG_ON(found_extent || extent_slot != path->slots[0]); | 5172 | BUG_ON(found_extent || extent_slot != path->slots[0]); |
5168 | ret = convert_extent_item_v0(trans, extent_root, path, | 5173 | ret = convert_extent_item_v0(trans, extent_root, path, |
5169 | owner_objectid, 0); | 5174 | owner_objectid, 0); |
5170 | if (ret < 0) | 5175 | if (ret < 0) { |
5171 | goto abort; | 5176 | btrfs_abort_transaction(trans, extent_root, ret); |
5177 | goto out; | ||
5178 | } | ||
5172 | 5179 | ||
5173 | btrfs_release_path(path); | 5180 | btrfs_release_path(path); |
5174 | path->leave_spinning = 1; | 5181 | path->leave_spinning = 1; |
@@ -5185,8 +5192,11 @@ static int __btrfs_free_extent(struct btrfs_trans_handle *trans, | |||
5185 | (unsigned long long)bytenr); | 5192 | (unsigned long long)bytenr); |
5186 | btrfs_print_leaf(extent_root, path->nodes[0]); | 5193 | btrfs_print_leaf(extent_root, path->nodes[0]); |
5187 | } | 5194 | } |
5188 | if (ret < 0) | 5195 | if (ret < 0) { |
5189 | goto abort; | 5196 | btrfs_abort_transaction(trans, extent_root, ret); |
5197 | goto out; | ||
5198 | } | ||
5199 | |||
5190 | extent_slot = path->slots[0]; | 5200 | extent_slot = path->slots[0]; |
5191 | leaf = path->nodes[0]; | 5201 | leaf = path->nodes[0]; |
5192 | item_size = btrfs_item_size_nr(leaf, extent_slot); | 5202 | item_size = btrfs_item_size_nr(leaf, extent_slot); |
@@ -5223,8 +5233,10 @@ static int __btrfs_free_extent(struct btrfs_trans_handle *trans, | |||
5223 | ret = remove_extent_backref(trans, extent_root, path, | 5233 | ret = remove_extent_backref(trans, extent_root, path, |
5224 | iref, refs_to_drop, | 5234 | iref, refs_to_drop, |
5225 | is_data); | 5235 | is_data); |
5226 | if (ret) | 5236 | if (ret) { |
5227 | goto abort; | 5237 | btrfs_abort_transaction(trans, extent_root, ret); |
5238 | goto out; | ||
5239 | } | ||
5228 | } | 5240 | } |
5229 | } else { | 5241 | } else { |
5230 | if (found_extent) { | 5242 | if (found_extent) { |
@@ -5241,27 +5253,29 @@ static int __btrfs_free_extent(struct btrfs_trans_handle *trans, | |||
5241 | 5253 | ||
5242 | ret = btrfs_del_items(trans, extent_root, path, path->slots[0], | 5254 | ret = btrfs_del_items(trans, extent_root, path, path->slots[0], |
5243 | num_to_del); | 5255 | num_to_del); |
5244 | if (ret) | 5256 | if (ret) { |
5245 | goto abort; | 5257 | btrfs_abort_transaction(trans, extent_root, ret); |
5258 | goto out; | ||
5259 | } | ||
5246 | btrfs_release_path(path); | 5260 | btrfs_release_path(path); |
5247 | 5261 | ||
5248 | if (is_data) { | 5262 | if (is_data) { |
5249 | ret = btrfs_del_csums(trans, root, bytenr, num_bytes); | 5263 | ret = btrfs_del_csums(trans, root, bytenr, num_bytes); |
5250 | if (ret) | 5264 | if (ret) { |
5251 | goto abort; | 5265 | btrfs_abort_transaction(trans, extent_root, ret); |
5266 | goto out; | ||
5267 | } | ||
5252 | } | 5268 | } |
5253 | 5269 | ||
5254 | ret = update_block_group(trans, root, bytenr, num_bytes, 0); | 5270 | ret = update_block_group(trans, root, bytenr, num_bytes, 0); |
5255 | if (ret) | 5271 | if (ret) { |
5256 | goto abort; | 5272 | btrfs_abort_transaction(trans, extent_root, ret); |
5273 | goto out; | ||
5274 | } | ||
5257 | } | 5275 | } |
5258 | out: | 5276 | out: |
5259 | btrfs_free_path(path); | 5277 | btrfs_free_path(path); |
5260 | return ret; | 5278 | return ret; |
5261 | |||
5262 | abort: | ||
5263 | btrfs_abort_transaction(trans, extent_root, ret); | ||
5264 | goto out; | ||
5265 | } | 5279 | } |
5266 | 5280 | ||
5267 | /* | 5281 | /* |