diff options
author | Kent Overstreet <kent.overstreet@gmail.com> | 2021-04-24 16:33:06 -0400 |
---|---|---|
committer | Kent Overstreet <kent.overstreet@gmail.com> | 2021-04-26 20:18:47 -0400 |
commit | edc3ffe8f25506e60218aa6eb5cbcd3a019f6210 (patch) | |
tree | 78d57e95d6ea8c51cf0c04f3ffdc4d2f39650600 /libbcachefs/btree_cache.c | |
parent | 78905d7540c6689d4c780900f957318452aa316e (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.c | 30 |
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) { |