Commit 73db0fad authored by Mark Harmstone's avatar Mark Harmstone Committed by David Sterba
Browse files

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: default avatarJohannes Thumshirn <johannes.thumshirn@wdc.com>
Signed-off-by: default avatarMark Harmstone <mark@harmstone.com>
Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
parent 9b882453
Loading
Loading
Loading
Loading
+10 −4
Original line number Diff line number Diff line
@@ -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;
	}