]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
btrfs: abort transaction in do_remap_reloc_trans() on failure
authorMark Harmstone <mark@harmstone.com>
Mon, 23 Mar 2026 17:16:43 +0000 (17:16 +0000)
committerDavid Sterba <dsterba@suse.com>
Tue, 21 Apr 2026 02:00:52 +0000 (04:00 +0200)
If one of the calls made by do_remap_reloc_trans() fails, we can leave
the remap tree in an inconsistent state. Abort the transaction if this
happens, to prevent the corrupt state from reaching the disk.

Reviewed-by: Johannes Thumshirn <johannes.thumshirn@wdc.com>
Signed-off-by: Mark Harmstone <mark@harmstone.com>
Signed-off-by: David Sterba <dsterba@suse.com>
fs/btrfs/relocation.c

index ad433b7ca919aaa4357bfab8ce823359faae7984..3e48d1a59fb337fb1a0ea9e7b20373bb77f1ce2d 100644 (file)
@@ -5035,21 +5035,27 @@ static int do_remap_reloc_trans(struct btrfs_fs_info *fs_info,
 
        if (bg_needs_free_space) {
                ret = btrfs_add_block_group_free_space(trans, dest_bg);
-               if (ret)
+               if (ret) {
+                       btrfs_abort_transaction(trans, ret);
                        goto fail;
+               }
        }
 
        ret = copy_remapped_data(fs_info, start, new_addr, length);
-       if (ret)
+       if (ret) {
+               btrfs_abort_transaction(trans, ret);
                goto fail;
+       }
 
        ret = btrfs_remove_from_free_space_tree(trans, new_addr, length);
-       if (ret)
+       if (ret) {
+               btrfs_abort_transaction(trans, ret);
                goto fail;
+       }
 
        ret = add_remap_entry(trans, path, src_bg, start, new_addr, length);
        if (ret) {
-               btrfs_add_to_free_space_tree(trans, new_addr, length);
+               btrfs_abort_transaction(trans, ret);
                goto fail;
        }