On Wed, Nov 13, 2024 at 4:15 PM Josef Bacik <josef@xxxxxxxxxxxxxx> wrote: > > When I reworked delayed ref comparison in cf4f04325b2b ("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. > > cc: stable@xxxxxxxxxxxxxxx > Fixes: cf4f04325b2b ("btrfs: move ->parent and ->ref_root into btrfs_delayed_ref_node") > Signed-off-by: Josef Bacik <josef@xxxxxxxxxxxxxx> Reviewed-by: Filipe Manana <fdmanana@xxxxxxxx> Ouch! > --- > fs/btrfs/delayed-ref.c | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/fs/btrfs/delayed-ref.c b/fs/btrfs/delayed-ref.c > index 4d2ad5b66928..0d878dbbabba 100644 > --- a/fs/btrfs/delayed-ref.c > +++ b/fs/btrfs/delayed-ref.c > @@ -299,7 +299,7 @@ static int comp_refs(struct btrfs_delayed_ref_node *ref1, > if (ref1->ref_root < ref2->ref_root) > return -1; > if (ref1->ref_root > ref2->ref_root) > - return -1; > + return 1; > if (ref1->type == BTRFS_EXTENT_DATA_REF_KEY) > ret = comp_data_refs(ref1, ref2); > } > -- > 2.43.0 > >