Commit 273bbb5b authored by Filipe Manana's avatar Filipe Manana Committed by David Sterba
Browse files

btrfs: unfold transaction abort at btrfs_copy_root()



Instead of having a common btrfs_abort_transaction() call for when any of
the two btrfs_inc_ref() calls fail, move the btrfs_abort_transaction() to
happen immediately after each one of the calls, so that when analyzing a
stack trace with a transaction abort we know which call failed.

Reviewed-by: default avatarDaniel Vacek <neelx@suse.com>
Reviewed-by: default avatarQu Wenruo <wqu@suse.com>
Signed-off-by: default avatarFilipe Manana <fdmanana@suse.com>
Reviewed-by: default avatarDavid Sterba <dsterba@suse.com>
Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
parent b63c8c1e
Loading
Loading
Loading
Loading
+7 −3
Original line number Diff line number Diff line
@@ -284,14 +284,18 @@ int btrfs_copy_root(struct btrfs_trans_handle *trans,
	write_extent_buffer_fsid(cow, fs_info->fs_devices->metadata_uuid);

	WARN_ON(btrfs_header_generation(buf) > trans->transid);
	if (new_root_objectid == BTRFS_TREE_RELOC_OBJECTID)
	if (new_root_objectid == BTRFS_TREE_RELOC_OBJECTID) {
		ret = btrfs_inc_ref(trans, root, cow, 1);
	else
		if (ret)
			btrfs_abort_transaction(trans, ret);
	} else {
		ret = btrfs_inc_ref(trans, root, cow, 0);
		if (ret)
			btrfs_abort_transaction(trans, ret);
	}
	if (ret) {
		btrfs_tree_unlock(cow);
		free_extent_buffer(cow);
		btrfs_abort_transaction(trans, ret);
		return ret;
	}