summaryrefslogtreecommitdiff
path: root/libbcachefs/btree_cache.c
diff options
context:
space:
mode:
Diffstat (limited to 'libbcachefs/btree_cache.c')
-rw-r--r--libbcachefs/btree_cache.c40
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);