bcachefs: Bring back BTREE_ITER_CACHED_NOFILL
authorKent Overstreet <kent.overstreet@linux.dev>
Tue, 20 Dec 2022 16:26:57 +0000 (11:26 -0500)
committerKent Overstreet <kent.overstreet@linux.dev>
Sun, 22 Oct 2023 21:09:47 +0000 (17:09 -0400)
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
fs/bcachefs/btree_iter.c
fs/bcachefs/btree_key_cache.c
fs/bcachefs/btree_types.h

index 5883bb4..b1580f6 100644 (file)
@@ -1581,7 +1581,8 @@ struct bkey_s_c bch2_btree_path_peek_slot(struct btree_path *path, struct bkey *
                EBUG_ON(ck &&
                        (path->btree_id != ck->key.btree_id ||
                         !bkey_eq(path->pos, ck->key.pos)));
-               EBUG_ON(!ck || !ck->valid);
+               if (!ck || !ck->valid)
+                       return bkey_s_c_null;
 
                *u = ck->k->k;
                k = bkey_i_to_s_c(ck->k);
@@ -1860,7 +1861,8 @@ struct bkey_s_c btree_trans_peek_key_cache(struct btree_iter *iter, struct bpos
        if (!iter->key_cache_path)
                iter->key_cache_path = bch2_path_get(trans, iter->btree_id, pos,
                                                     iter->flags & BTREE_ITER_INTENT, 0,
-                                                    iter->flags|BTREE_ITER_CACHED);
+                                                    iter->flags|BTREE_ITER_CACHED|
+                                                    BTREE_ITER_CACHED_NOFILL);
 
        iter->key_cache_path = bch2_btree_path_set_pos(trans, iter->key_cache_path, pos,
                                        iter->flags & BTREE_ITER_INTENT);
index 0ae5d89..fc924fd 100644 (file)
@@ -487,7 +487,7 @@ retry:
        path->l[0].lock_seq     = ck->c.lock.state.seq;
        path->l[0].b            = (void *) ck;
 fill:
-       if (!ck->valid) {
+       if (!ck->valid && !(flags & BTREE_ITER_CACHED_NOFILL)) {
                /*
                 * Using the underscore version because we haven't set
                 * path->uptodate yet:
@@ -508,7 +508,6 @@ fill:
                set_bit(BKEY_CACHED_ACCESSED, &ck->flags);
 
        path->uptodate = BTREE_ITER_UPTODATE;
-       BUG_ON(!ck->valid);
        BUG_ON(btree_node_locked_type(path, 0) != btree_lock_want(path, 0));
 
        return ret;
index ae5a692..cdb887a 100644 (file)
@@ -207,6 +207,7 @@ struct btree_node_iter {
 #define BTREE_ITER_ALL_SNAPSHOTS       (1 << 11)
 #define BTREE_ITER_FILTER_SNAPSHOTS    (1 << 12)
 #define BTREE_ITER_NOPRESERVE          (1 << 13)
+#define BTREE_ITER_CACHED_NOFILL       (1 << 14)
 
 enum btree_path_uptodate {
        BTREE_ITER_UPTODATE             = 0,