diff options
Diffstat (limited to 'fs/bcachefs/btree_iter.c')
-rw-r--r-- | fs/bcachefs/btree_iter.c | 68 |
1 files changed, 24 insertions, 44 deletions
diff --git a/fs/bcachefs/btree_iter.c b/fs/bcachefs/btree_iter.c index 45ddfb54188a..dd716b35a11d 100644 --- a/fs/bcachefs/btree_iter.c +++ b/fs/bcachefs/btree_iter.c @@ -2448,27 +2448,10 @@ struct bkey_s_c bch2_btree_iter_peek_max(struct btree_trans *trans, struct btree continue; } - if (!(iter->flags & BTREE_ITER_nofilter_whiteouts)) { - /* - * KEY_TYPE_extent_whiteout indicates that there - * are no extents that overlap with this - * whiteout - meaning bkey_start_pos() is - * monotonically increasing when including - * KEY_TYPE_extent_whiteout (not - * KEY_TYPE_whiteout). - * - * Without this @end wouldn't be able to - * terminate searches and we'd have to scan - * through tons of whiteouts: - */ - if (k.k->type == KEY_TYPE_extent_whiteout && - bkey_ge(k.k->p, end)) - goto end; - - if (bkey_extent_whiteout(k.k)) { - search_key = bkey_successor(iter, k.k->p); - continue; - } + if (bkey_whiteout(k.k) && + !(iter->flags & BTREE_ITER_key_cache_fill)) { + search_key = bkey_successor(iter, k.k->p); + continue; } } @@ -2728,7 +2711,7 @@ struct bkey_s_c bch2_btree_iter_peek_prev_min(struct btree_trans *trans, struct saved_path = 0; } - if (!bkey_extent_whiteout(k.k)) { + if (!bkey_whiteout(k.k)) { saved_path = btree_path_clone(trans, iter->path, iter->flags & BTREE_ITER_intent, _THIS_IP_); @@ -2741,7 +2724,7 @@ struct bkey_s_c bch2_btree_iter_peek_prev_min(struct btree_trans *trans, struct continue; } - if (bkey_extent_whiteout(k.k)) { + if (bkey_whiteout(k.k)) { search_key = bkey_predecessor(iter, k.k->p); search_key.snapshot = U32_MAX; continue; @@ -2882,9 +2865,9 @@ struct bkey_s_c bch2_btree_iter_peek_slot(struct btree_trans *trans, struct btre iter->k = *k.k; } - if (unlikely(bkey_extent_whiteout(k.k) && + if (unlikely(k.k->type == KEY_TYPE_whiteout && (iter->flags & BTREE_ITER_filter_snapshots) && - !(iter->flags & BTREE_ITER_nofilter_whiteouts))) + !(iter->flags & BTREE_ITER_key_cache_fill))) iter->k.type = KEY_TYPE_deleted; } else { struct bpos next; @@ -2895,30 +2878,27 @@ struct bkey_s_c bch2_btree_iter_peek_slot(struct btree_trans *trans, struct btre EBUG_ON(btree_iter_path(trans, iter)->level); - struct btree_iter iter2; - - bch2_trans_copy_iter(trans, &iter2, iter); - iter2.flags |= BTREE_ITER_nofilter_whiteouts; + if (iter->flags & BTREE_ITER_intent) { + struct btree_iter iter2; - while (1) { + bch2_trans_copy_iter(trans, &iter2, iter); k = bch2_btree_iter_peek_max(trans, &iter2, end); - if ((iter2.flags & BTREE_ITER_is_extents) && - k.k && - !bkey_err(k) && - k.k->type == KEY_TYPE_whiteout) { - bch2_btree_iter_set_pos(trans, &iter2, k.k->p); - continue; - } - break; - } + if (k.k && !bkey_err(k)) { + swap(iter->key_cache_path, iter2.key_cache_path); + iter->k = iter2.k; + k.k = &iter->k; + } + bch2_trans_iter_exit(trans, &iter2); + } else { + struct bpos pos = iter->pos; - if (k.k && !bkey_err(k)) { - swap(iter->key_cache_path, iter2.key_cache_path); - iter->k = iter2.k; - k.k = &iter->k; + k = bch2_btree_iter_peek_max(trans, iter, end); + if (unlikely(bkey_err(k))) + bch2_btree_iter_set_pos(trans, iter, pos); + else + iter->pos = pos; } - bch2_trans_iter_exit(trans, &iter2); if (unlikely(bkey_err(k))) goto out; |