* the post write cleanup:
*/
if (verify_btree_ondisk(c))
- bch2_btree_node_write(c, b, NULL, SIX_LOCK_intent);
+ bch2_btree_node_write(c, b, SIX_LOCK_intent);
else
- __bch2_btree_node_write(c, b, NULL, SIX_LOCK_read);
+ __bch2_btree_node_write(c, b, SIX_LOCK_read);
/* wait for any in flight btree write */
btree_node_wait_on_io(b);
struct btree *b;
struct bset_tree *t;
- BUG_ON(level >= BTREE_MAX_DEPTH);
+ /* btree_node_fill() requires parent to be locked: */
+ EBUG_ON(!btree_node_locked(iter, level + 1));
+ EBUG_ON(level >= BTREE_MAX_DEPTH);
retry:
rcu_read_lock();
b = btree_cache_find(bc, k);
if (IS_ERR(ret) && PTR_ERR(ret) == -EINTR) {
btree_node_unlock(iter, level);
+
+ if (!bch2_btree_node_relock(iter, level + 1)) {
+ bch2_btree_iter_set_locks_want(iter, level + 2);
+ return ERR_PTR(-EINTR);
+ }
+
ret = bch2_btree_node_get(c, iter, &tmp.k, level, SIX_LOCK_intent);
}