aboutsummaryrefslogtreecommitdiffstats
path: root/fs/btrfs/extent-tree.c
diff options
context:
space:
mode:
authorDavid Sterba <dsterba@suse.cz>2012-09-18 09:52:32 -0400
committerChris Mason <chris.mason@fusionio.com>2012-10-08 20:09:02 -0400
commit005d6427ac4f276d937a36ca6a1d62b181ed70bf (patch)
treea17de085350c5137e669774f0a810010997b95de /fs/btrfs/extent-tree.c
parent8732d44f806a9da9a7ca4d1704b8a1ed81639bc4 (diff)
btrfs: move transaction aborts to the point of failure
Call btrfs_abort_transaction as early as possible when an error condition is detected, that way the line number reported is useful and we're not clueless anymore which error path led to the abort. Signed-off-by: David Sterba <dsterba@suse.cz>
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/*