btrfs: unfold transaction abort at walk_up_proc()
authorFilipe Manana <fdmanana@suse.com>
Fri, 16 May 2025 16:32:14 +0000 (17:32 +0100)
committerDavid Sterba <dsterba@suse.com>
Mon, 21 Jul 2025 13:31:05 +0000 (15:31 +0200)
Instead of having a common btrfs_abort_transaction() call for when any of
the two btrfs_dec_ref() calls fail, move the btrfs_abort_transaction() to
happen immediately after each one of the calls, so that when analysing a
stack trace with a transaction abort we know which call failed.

Reviewed-by: Boris Burkov <boris@bur.io>
Reviewed-by: Qu Wenruo <wqu@suse.com>
Signed-off-by: Filipe Manana <fdmanana@suse.com>
Reviewed-by: David Sterba <dsterba@suse.cz>
Signed-off-by: David Sterba <dsterba@suse.com>
fs/btrfs/extent-tree.c

index 678989a5931de1a4fac62ec4986ae16c0a954d06..f1925ea2261f885540cd189f82150d6c6c79aa9e 100644 (file)
@@ -5874,13 +5874,18 @@ static noinline int walk_up_proc(struct btrfs_trans_handle *trans,
 
        if (wc->refs[level] == 1) {
                if (level == 0) {
-                       if (wc->flags[level] & BTRFS_BLOCK_FLAG_FULL_BACKREF)
+                       if (wc->flags[level] & BTRFS_BLOCK_FLAG_FULL_BACKREF) {
                                ret = btrfs_dec_ref(trans, root, eb, 1);
-                       else
+                               if (ret) {
+                                       btrfs_abort_transaction(trans, ret);
+                                       return ret;
+                               }
+                       } else {
                                ret = btrfs_dec_ref(trans, root, eb, 0);
-                       if (ret) {
-                               btrfs_abort_transaction(trans, ret);
-                               return ret;
+                               if (ret) {
+                                       btrfs_abort_transaction(trans, ret);
+                                       return ret;
+                               }
                        }
                        if (is_fstree(btrfs_root_id(root))) {
                                ret = btrfs_qgroup_trace_leaf_items(trans, eb);