btrfs: fix incorrect comparison for delayed refs

When I reworked delayed ref comparison in cf4f04325b ("btrfs: move
->parent and ->ref_root into btrfs_delayed_ref_node"), I made a mistake
and returned -1 for the case where ref1->ref_root was > than
ref2->ref_root.  This is a subtle bug that can result in improper
delayed ref running order, which can result in transaction aborts.

Fixes: cf4f04325b ("btrfs: move ->parent and ->ref_root into btrfs_delayed_ref_node")
CC: stable@vger.kernel.org # 6.10+
Reviewed-by: Filipe Manana <fdmanana@suse.com>
Reviewed-by: Qu Wenruo <wqu@suse.com>
Signed-off-by: Josef Bacik <josef@toxicpanda.com>
Reviewed-by: David Sterba <dsterba@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
This commit is contained in:
Josef Bacik 2024-11-13 11:05:13 -05:00 committed by David Sterba
parent 2b084d8205
commit 7d493a5ecc

View File

@ -298,7 +298,7 @@ static int comp_refs(struct btrfs_delayed_ref_node *ref1,
if (ref1->ref_root < ref2->ref_root) if (ref1->ref_root < ref2->ref_root)
return -1; return -1;
if (ref1->ref_root > ref2->ref_root) if (ref1->ref_root > ref2->ref_root)
return -1; return 1;
if (ref1->type == BTRFS_EXTENT_DATA_REF_KEY) if (ref1->type == BTRFS_EXTENT_DATA_REF_KEY)
ret = comp_data_refs(ref1, ref2); ret = comp_data_refs(ref1, ref2);
} }