summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Harmstone <mark@harmstone.com>2026-03-23 20:16:43 +0300
committerDavid Sterba <dsterba@suse.com>2026-04-21 05:00:52 +0300
commit73db0fad673af844772de964eebecae60eda0496 (patch)
tree7e8dc4e3bd9680d847dc8a70c0a8052079f69670
parent9b8824533d75fb199a3fb0f6147ffcca64b5caf8 (diff)
downloadlinux-73db0fad673af844772de964eebecae60eda0496.tar.xz
btrfs: abort transaction in do_remap_reloc_trans() on failure
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>
-rw-r--r--fs/btrfs/relocation.c14
1 files changed, 10 insertions, 4 deletions
diff --git a/fs/btrfs/relocation.c b/fs/btrfs/relocation.c
index ad433b7ca919..3e48d1a59fb3 100644
--- a/fs/btrfs/relocation.c
+++ b/fs/btrfs/relocation.c
@@ -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;
}