diff options
author | Kent Overstreet <kent.overstreet@linux.dev> | 2022-12-20 11:26:57 -0500 |
---|---|---|
committer | Kent Overstreet <kent.overstreet@linux.dev> | 2022-12-20 20:01:27 -0500 |
commit | 3dd0197b94d6752eb830448cf8bb485962324161 (patch) | |
tree | c8c97418ced5f6265eae16b7b8238fe5ad500c9f | |
parent | ad5b71f9d14d5b6d1db9e3a686b4684009a6bdc9 (diff) |
bcachefs: Bring back BTREE_ITER_CACHED_NOFILL
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
-rw-r--r-- | fs/bcachefs/btree_iter.c | 6 | ||||
-rw-r--r-- | fs/bcachefs/btree_key_cache.c | 3 | ||||
-rw-r--r-- | fs/bcachefs/btree_types.h | 1 |
3 files changed, 6 insertions, 4 deletions
diff --git a/fs/bcachefs/btree_iter.c b/fs/bcachefs/btree_iter.c index 77eece890304..4f9aac02ee2e 100644 --- a/fs/bcachefs/btree_iter.c +++ b/fs/bcachefs/btree_iter.c @@ -1613,7 +1613,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); @@ -1883,7 +1884,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, _THIS_IP_); iter->key_cache_path = bch2_btree_path_set_pos(trans, iter->key_cache_path, pos, diff --git a/fs/bcachefs/btree_key_cache.c b/fs/bcachefs/btree_key_cache.c index dcd1a4796efe..1a689325b826 100644 --- a/fs/bcachefs/btree_key_cache.c +++ b/fs/bcachefs/btree_key_cache.c @@ -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; diff --git a/fs/bcachefs/btree_types.h b/fs/bcachefs/btree_types.h index af86ba12e3a4..46ae58374555 100644 --- a/fs/bcachefs/btree_types.h +++ b/fs/bcachefs/btree_types.h @@ -217,6 +217,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, |