struct btree_iter *iter)
 {
        struct bkey_i *k = bch2_journal_keys_peek_slot(trans->c, iter->btree_id,
-                                                      0, iter->path->pos);
+                                                      iter->path->level,
+                                                      iter->path->pos);
 
        if (k) {
                iter->k = k->k;
        struct bkey_s_c k;
        int ret;
 
-       EBUG_ON(iter->path->level);
        bch2_btree_iter_verify(iter);
        bch2_btree_iter_verify_entry_exit(iter);
+       EBUG_ON(iter->path->level && (iter->flags & BTREE_ITER_WITH_KEY_CACHE));
 
        /* extents can't span inode numbers: */
        if ((iter->flags & BTREE_ITER_IS_EXTENTS) &&
        } else {
                struct bpos next;
 
+               EBUG_ON(iter->path->level);
+
                if (iter->flags & BTREE_ITER_INTENT) {
                        struct btree_iter iter2;
                        struct bpos end = iter->pos;
        if (trans->journal_replay_not_finished)
                flags |= BTREE_ITER_WITH_JOURNAL;
 
-       if (!btree_id_cached(trans->c, btree_id)) {
-               flags &= ~BTREE_ITER_CACHED;
-               flags &= ~BTREE_ITER_WITH_KEY_CACHE;
-       } else if (!(flags & BTREE_ITER_CACHED))
-               flags |= BTREE_ITER_WITH_KEY_CACHE;
-
        iter->trans     = trans;
        iter->path      = NULL;
        iter->update_path = NULL;
                          unsigned btree_id, struct bpos pos,
                          unsigned flags)
 {
+       if (!btree_id_cached(trans->c, btree_id)) {
+               flags &= ~BTREE_ITER_CACHED;
+               flags &= ~BTREE_ITER_WITH_KEY_CACHE;
+       } else if (!(flags & BTREE_ITER_CACHED))
+               flags |= BTREE_ITER_WITH_KEY_CACHE;
+
        __bch2_trans_iter_init(trans, iter, btree_id, pos,
                               0, 0, flags);
 }