btrfs: unfold transaction abort at clone_copy_inline_extent()
authorFilipe Manana <fdmanana@suse.com>
Fri, 16 May 2025 18:37:44 +0000 (19:37 +0100)
committerDavid Sterba <dsterba@suse.com>
Mon, 21 Jul 2025 13:31:06 +0000 (15:31 +0200)
We have a common error path where we abort the transaction, but like this
in case we get a transaction abort stack trace we don't know exactly which
previous function call failed. Instead abort the transaction after any
function call that returns an error, so that we can easily identify which
function failed.

Signed-off-by: Filipe Manana <fdmanana@suse.com>
Reviewed-by: David Sterba <dsterba@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
fs/btrfs/reflink.c

index 5eacd3584a8d321a1489922436d239ddce91978c..0197bd9160a7950632aedd4a7e607310917f419f 100644 (file)
@@ -268,11 +268,15 @@ copy_inline_extent:
        drop_args.end = aligned_end;
        drop_args.drop_cache = true;
        ret = btrfs_drop_extents(trans, root, inode, &drop_args);
-       if (ret)
+       if (ret) {
+               btrfs_abort_transaction(trans, ret);
                goto out;
+       }
        ret = btrfs_insert_empty_item(trans, root, path, new_key, size);
-       if (ret)
+       if (ret) {
+               btrfs_abort_transaction(trans, ret);
                goto out;
+       }
 
        write_extent_buffer(path->nodes[0], inline_data,
                            btrfs_item_ptr_offset(path->nodes[0],
@@ -281,6 +285,8 @@ copy_inline_extent:
        btrfs_update_inode_bytes(inode, datal, drop_args.bytes_found);
        btrfs_set_inode_full_sync(inode);
        ret = btrfs_inode_set_file_extent_range(inode, 0, aligned_end);
+       if (ret)
+               btrfs_abort_transaction(trans, ret);
 out:
        if (!ret && !trans) {
                /*
@@ -295,10 +301,8 @@ out:
                        trans = NULL;
                }
        }
-       if (ret && trans) {
-               btrfs_abort_transaction(trans, ret);
+       if (ret && trans)
                btrfs_end_transaction(trans);
-       }
        if (!ret)
                *trans_out = trans;