summaryrefslogtreecommitdiff
path: root/libbcachefs/btree_cache.c
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@gmail.com>2021-04-24 16:33:06 -0400
committerKent Overstreet <kent.overstreet@gmail.com>2021-04-26 20:18:47 -0400
commitedc3ffe8f25506e60218aa6eb5cbcd3a019f6210 (patch)
tree78d57e95d6ea8c51cf0c04f3ffdc4d2f39650600 /libbcachefs/btree_cache.c
parent78905d7540c6689d4c780900f957318452aa316e (diff)
Update bcachefs sources to 8d3093bd9b bcachefs: Evict btree nodes we're deleting
Diffstat (limited to 'libbcachefs/btree_cache.c')
-rw-r--r--libbcachefs/btree_cache.c30
1 files changed, 30 insertions, 0 deletions
diff --git a/libbcachefs/btree_cache.c b/libbcachefs/btree_cache.c
index edc3c5ed..f8692f79 100644
--- a/libbcachefs/btree_cache.c
+++ b/libbcachefs/btree_cache.c
@@ -958,6 +958,36 @@ void bch2_btree_node_prefetch(struct bch_fs *c, struct btree_iter *iter,
bch2_btree_node_fill(c, iter, k, btree_id, level, SIX_LOCK_read, false);
}
+void bch2_btree_node_evict(struct bch_fs *c, const struct bkey_i *k)
+{
+ struct btree_cache *bc = &c->btree_cache;
+ struct btree *b;
+
+ b = btree_cache_find(bc, k);
+ if (!b)
+ return;
+
+ six_lock_intent(&b->c.lock, NULL, NULL);
+ six_lock_write(&b->c.lock, NULL, NULL);
+
+ wait_on_bit_io(&b->flags, BTREE_NODE_read_in_flight,
+ TASK_UNINTERRUPTIBLE);
+ __bch2_btree_node_write(c, b);
+
+ /* wait for any in flight btree write */
+ btree_node_wait_on_io(b);
+
+ BUG_ON(btree_node_dirty(b));
+
+ mutex_lock(&bc->lock);
+ btree_node_data_free(c, b);
+ bch2_btree_node_hash_remove(bc, b);
+ mutex_unlock(&bc->lock);
+
+ six_unlock_write(&b->c.lock);
+ six_unlock_intent(&b->c.lock);
+}
+
void bch2_btree_node_to_text(struct printbuf *out, struct bch_fs *c,
struct btree *b)
{