]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
btrfs: unfold transaction aborts in btrfs_finish_one_ordered()
authorFilipe Manana <fdmanana@suse.com>
Wed, 21 Jan 2026 16:35:56 +0000 (16:35 +0000)
committerDavid Sterba <dsterba@suse.com>
Tue, 3 Feb 2026 06:56:19 +0000 (07:56 +0100)
We have a single transaction abort that can be caused either by a failure
from a call to btrfs_mark_extent_written(), if we are dealing with a
write to a prealloc extent, or otherwise from a call to
insert_ordered_extent_file_extent(). So when the transaction abort happens
we can not know for sure which case failed. Unfold the aborts so that it's
clear in case of a failure.

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.com>
Signed-off-by: David Sterba <dsterba@suse.com>
fs/btrfs/inode.c

index fa110827aaabc0ec7be2e9afcf22f4b81163f803..6637e451992fd4032014e81fd5d3f644885f487a 100644 (file)
@@ -3256,19 +3256,21 @@ int btrfs_finish_one_ordered(struct btrfs_ordered_extent *ordered_extent)
                                                logical_len);
                btrfs_zoned_release_data_reloc_bg(fs_info, ordered_extent->disk_bytenr,
                                                  ordered_extent->disk_num_bytes);
+               if (unlikely(ret < 0)) {
+                       btrfs_abort_transaction(trans, ret);
+                       goto out;
+               }
        } else {
                BUG_ON(root == fs_info->tree_root);
                ret = insert_ordered_extent_file_extent(trans, ordered_extent);
-               if (!ret) {
-                       clear_reserved_extent = false;
-                       btrfs_release_delalloc_bytes(fs_info,
-                                               ordered_extent->disk_bytenr,
-                                               ordered_extent->disk_num_bytes);
+               if (unlikely(ret < 0)) {
+                       btrfs_abort_transaction(trans, ret);
+                       goto out;
                }
-       }
-       if (unlikely(ret < 0)) {
-               btrfs_abort_transaction(trans, ret);
-               goto out;
+               clear_reserved_extent = false;
+               btrfs_release_delalloc_bytes(fs_info,
+                                            ordered_extent->disk_bytenr,
+                                            ordered_extent->disk_num_bytes);
        }
 
        ret = btrfs_unpin_extent_cache(inode, ordered_extent->file_offset,