diff options
Diffstat (limited to 'libbcachefs/btree_cache.c')
-rw-r--r-- | libbcachefs/btree_cache.c | 40 |
1 files changed, 11 insertions, 29 deletions
diff --git a/libbcachefs/btree_cache.c b/libbcachefs/btree_cache.c index f8692f7..f6adbe8 100644 --- a/libbcachefs/btree_cache.c +++ b/libbcachefs/btree_cache.c @@ -581,6 +581,7 @@ out: b->sib_u64s[1] = 0; b->whiteout_u64s = 0; bch2_btree_keys_init(b); + set_btree_node_accessed(b); bch2_time_stats_update(&c->times[BCH_TIME_btree_node_mem_alloc], start_time); @@ -653,9 +654,13 @@ static noinline struct btree *bch2_btree_node_fill(struct bch_fs *c, return NULL; } - /* Unlock before doing IO: */ - if (iter && sync) - bch2_trans_unlock(iter->trans); + /* + * Unlock before doing IO: + * + * XXX: ideally should be dropping all btree node locks here + */ + if (iter && btree_node_read_locked(iter, level + 1)) + btree_node_unlock(iter, level + 1); bch2_btree_node_read(c, b, sync); @@ -666,16 +671,6 @@ static noinline struct btree *bch2_btree_node_fill(struct bch_fs *c, return NULL; } - /* - * XXX: this will probably always fail because btree_iter_relock() - * currently fails for iterators that aren't pointed at a valid btree - * node - */ - if (iter && !bch2_trans_relock(iter->trans)) { - six_unlock_intent(&b->c.lock); - return ERR_PTR(-EINTR); - } - if (lock_type == SIX_LOCK_read) six_lock_downgrade(&b->c.lock); @@ -817,22 +812,9 @@ lock_node: } } - if (unlikely(btree_node_read_in_flight(b))) { - six_unlock_type(&b->c.lock, lock_type); - bch2_trans_unlock(iter->trans); - - wait_on_bit_io(&b->flags, BTREE_NODE_read_in_flight, - TASK_UNINTERRUPTIBLE); - - /* - * XXX: check if this always fails - btree_iter_relock() - * currently fails for iterators that aren't pointed at a valid - * btree node - */ - if (iter && !bch2_trans_relock(iter->trans)) - return ERR_PTR(-EINTR); - goto retry; - } + /* XXX: waiting on IO with btree locks held: */ + wait_on_bit_io(&b->flags, BTREE_NODE_read_in_flight, + TASK_UNINTERRUPTIBLE); prefetch(b->aux_data); |