Commit 33e8f24b authored by Filipe Manana's avatar Filipe Manana Committed by David Sterba
Browse files

btrfs: abort transaction on unexpected eb generation at btrfs_copy_root()



If we find an unexpected generation for the extent buffer we are cloning
at btrfs_copy_root(), we just WARN_ON() and don't error out and abort the
transaction, meaning we allow to persist metadata with an unexpected
generation. Instead of warning only, abort the transaction and return
-EUCLEAN.

CC: stable@vger.kernel.org # 6.1+
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 273bbb5b
Loading
Loading
Loading
Loading
+8 −1
Original line number Diff line number Diff line
@@ -283,7 +283,14 @@ 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 (unlikely(btrfs_header_generation(buf) > trans->transid)) {
		btrfs_tree_unlock(cow);
		free_extent_buffer(cow);
		ret = -EUCLEAN;
		btrfs_abort_transaction(trans, ret);
		return ret;
	}

	if (new_root_objectid == BTRFS_TREE_RELOC_OBJECTID) {
		ret = btrfs_inc_ref(trans, root, cow, 1);
		if (ret)