aboutsummaryrefslogtreecommitdiffstats
path: root/fs/btrfs/extent-tree.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/btrfs/extent-tree.c')
-rw-r--r--fs/btrfs/extent-tree.c56
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 }
5258out: 5276out:
5259 btrfs_free_path(path); 5277 btrfs_free_path(path);
5260 return ret; 5278 return ret;
5261
5262abort:
5263 btrfs_abort_transaction(trans, extent_root, ret);
5264 goto out;
5265} 5279}
5266 5280
5267/* 5281/*