btrfs: unfold transaction aborts at btrfs_create_new_inode()
authorFilipe Manana <fdmanana@suse.com>
Fri, 16 May 2025 16:07:40 +0000 (17:07 +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 either
btrfs_orphan_add() failed or when btrfs_add_link() failed, move the
btrfs_abort_transaction() to happen immediately after each one of those
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/inode.c

index fc66872b4c747f1814fe787f394e15be2831db88..bb938d5c0c9bf4190baf978e54492abe6eba9b9a 100644 (file)
@@ -6610,13 +6610,17 @@ int btrfs_create_new_inode(struct btrfs_trans_handle *trans,
 
        if (args->orphan) {
                ret = btrfs_orphan_add(trans, BTRFS_I(inode));
+               if (ret) {
+                       btrfs_abort_transaction(trans, ret);
+                       goto discard;
+               }
        } else {
                ret = btrfs_add_link(trans, BTRFS_I(dir), BTRFS_I(inode), name,
                                     0, BTRFS_I(inode)->dir_index);
-       }
-       if (ret) {
-               btrfs_abort_transaction(trans, ret);
-               goto discard;
+               if (ret) {
+                       btrfs_abort_transaction(trans, ret);
+                       goto discard;
+               }
        }
 
        return 0;