diff options
author | Kent Overstreet <kent.overstreet@gmail.com> | 2021-08-19 15:18:12 -0400 |
---|---|---|
committer | Kent Overstreet <kent.overstreet@gmail.com> | 2021-08-19 15:18:12 -0400 |
commit | 6ccc6a6e8cdf53d6a051ae3bdacc1952cba77e27 (patch) | |
tree | fcd5bac8e948e0e643ca9216bb146f9cdc4318ac | |
parent | f16b1798ce55cf498ab4ab17fa48cf884367bcdf (diff) |
fixup! bcachefs: Fix btree_trans_peek_updates()
-rw-r--r-- | fs/bcachefs/btree_iter.c | 11 |
1 files changed, 8 insertions, 3 deletions
diff --git a/fs/bcachefs/btree_iter.c b/fs/bcachefs/btree_iter.c index 8180120264a7..c2830919f76d 100644 --- a/fs/bcachefs/btree_iter.c +++ b/fs/bcachefs/btree_iter.c @@ -1717,9 +1717,13 @@ struct bkey_s_c bch2_btree_iter_peek(struct btree_iter *iter) if (unlikely(ret)) return bkey_s_c_err(ret); - k = btree_iter_level_peek(iter, &iter->l[0]); - + /* + * btree_iter_level_peek() mutates iter->real_pos, which + * btree_trans_peek_updates() checks against, so we have to call + * them in this order: + */ next_update = btree_trans_peek_updates(iter); + k = btree_iter_level_peek(iter, &iter->l[0]); if (next_update && bpos_cmp(next_update->k.p, iter->real_pos) <= 0) { iter->k = next_update->k; @@ -1883,6 +1887,8 @@ struct bkey_s_c bch2_btree_iter_peek_slot(struct btree_iter *iter) struct bkey_i *next_update; struct bkey_cached *ck; + next_update = btree_trans_peek_updates(iter); + switch (btree_iter_type(iter)) { case BTREE_ITER_KEYS: k = btree_iter_level_peek_all(iter, &iter->l[0]); @@ -1900,7 +1906,6 @@ struct bkey_s_c bch2_btree_iter_peek_slot(struct btree_iter *iter) BUG(); } - next_update = btree_trans_peek_updates(iter); if (next_update && (!k.k || bpos_cmp(next_update->k.p, k.k->p) <= 0)) { iter->k = next_update->k; |