From dc02bed6d9b8c85a8db686fecac5749fbde8cba1 Mon Sep 17 00:00:00 2001 From: Kent Overstreet Date: Mon, 23 Aug 2021 17:19:17 -0400 Subject: [PATCH] bcachefs: Free iterator if we have duplicate This helps - but does not fully fix - the outstanding "transaction iterator overflow" bugs. Signed-off-by: Kent Overstreet --- fs/bcachefs/btree_iter.c | 21 +++++++++++++++++++-- fs/bcachefs/btree_update_leaf.c | 1 + 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/fs/bcachefs/btree_iter.c b/fs/bcachefs/btree_iter.c index f38f231fb2963..c97569450741f 100644 --- a/fs/bcachefs/btree_iter.c +++ b/fs/bcachefs/btree_iter.c @@ -2204,6 +2204,22 @@ static inline void __bch2_trans_iter_free(struct btree_trans *trans, btree_trans_verify_sorted_refs(trans); } +static bool have_iter_at_pos(struct btree_trans *trans, + struct btree_iter *iter) +{ + struct btree_iter *n; + + n = prev_btree_iter(trans, iter); + if (n && !btree_iter_cmp(n, iter)) + return true; + + n = next_btree_iter(trans, iter); + if (n && !btree_iter_cmp(n, iter)) + return true; + + return false; +} + int bch2_trans_iter_put(struct btree_trans *trans, struct btree_iter *iter) { @@ -2217,8 +2233,9 @@ int bch2_trans_iter_put(struct btree_trans *trans, ret = btree_iter_err(iter); - if (!(trans->iters_touched & (1ULL << iter->idx)) && - !(iter->flags & BTREE_ITER_KEEP_UNTIL_COMMIT)) + if (!(iter->flags & BTREE_ITER_KEEP_UNTIL_COMMIT) && + (!(trans->iters_touched & (1ULL << iter->idx)) || + have_iter_at_pos(trans, iter))) __bch2_trans_iter_free(trans, iter->idx); trans->iters_live &= ~(1ULL << iter->idx); diff --git a/fs/bcachefs/btree_update_leaf.c b/fs/bcachefs/btree_update_leaf.c index 179091e4c5617..cfb691fa65cf4 100644 --- a/fs/bcachefs/btree_update_leaf.c +++ b/fs/bcachefs/btree_update_leaf.c @@ -1040,6 +1040,7 @@ int bch2_trans_update(struct btree_trans *trans, struct btree_iter *iter, n.iter = bch2_trans_get_iter(trans, n.btree_id, n.k->k.p, BTREE_ITER_INTENT| BTREE_ITER_NOT_EXTENTS); + n.iter->flags |= BTREE_ITER_KEEP_UNTIL_COMMIT; ret = bch2_btree_iter_traverse(n.iter); bch2_trans_iter_put(trans, n.iter); -- 2.30.2