/* Now, redo traversals in correct order: */
        i = 0;
        while (i < trans->nr_sorted) {
-               path = trans->paths + trans->sorted[i];
+               btree_path_idx_t idx = trans->sorted[i];
 
                /*
                 * Traversing a path can cause another path to be added at about
                 * the same position:
                 */
-               if (path->uptodate) {
-                       __btree_path_get(path, false);
-                       ret = bch2_btree_path_traverse_one(trans, path, 0, _THIS_IP_);
-                       __btree_path_put(path, false);
+               if (trans->paths[idx].uptodate) {
+                       __btree_path_get(&trans->paths[idx], false);
+                       ret = bch2_btree_path_traverse_one(trans, idx, 0, _THIS_IP_);
+                       __btree_path_put(&trans->paths[idx], false);
 
                        if (bch2_err_matches(ret, BCH_ERR_transaction_restart) ||
                            bch2_err_matches(ret, ENOMEM))
  * stashed in the iterator and returned from bch2_trans_exit().
  */
 int bch2_btree_path_traverse_one(struct btree_trans *trans,
-                                struct btree_path *path,
+                                btree_path_idx_t path_idx,
                                 unsigned flags,
                                 unsigned long trace_ip)
 {
+       struct btree_path *path = &trans->paths[path_idx];
        unsigned depth_want = path->level;
        int ret = -((int) trans->restarted);
 
                goto out;
        }
 
+       path = &trans->paths[path_idx];
+
        if (unlikely(path->level >= BTREE_MAX_DEPTH))
                goto out;
 
 int __must_check
 __bch2_btree_iter_traverse(struct btree_iter *iter)
 {
-       return bch2_btree_path_traverse(iter->trans, iter->path, iter->flags);
+       return bch2_btree_path_traverse(iter->trans, iter->path->idx, iter->flags);
 }
 
 int __must_check
                                        iter->flags & BTREE_ITER_INTENT,
                                        btree_iter_ip_allocated(iter));
 
-       ret = bch2_btree_path_traverse(trans, iter->path, iter->flags);
+       ret = bch2_btree_path_traverse(trans, iter->path->idx, iter->flags);
        if (ret)
                return ret;
 
        EBUG_ON(iter->path->cached);
        bch2_btree_iter_verify(iter);
 
-       ret = bch2_btree_path_traverse(trans, iter->path, iter->flags);
+       ret = bch2_btree_path_traverse(trans, iter->path->idx, iter->flags);
        if (ret)
                goto err;
 
 
                btree_path_set_level_down(trans, path, iter->min_depth);
 
-               ret = bch2_btree_path_traverse(trans, path, iter->flags);
+               ret = bch2_btree_path_traverse(trans, path->idx, iter->flags);
                if (ret)
                        goto err;
 
                                        iter->flags & BTREE_ITER_INTENT,
                                        btree_iter_ip_allocated(iter));
 
-       ret =   bch2_btree_path_traverse(trans, iter->key_cache_path,
+       ret =   bch2_btree_path_traverse(trans, iter->key_cache_path->idx,
                                         iter->flags|BTREE_ITER_CACHED) ?:
                bch2_btree_path_relock(trans, iter->path, _THIS_IP_);
        if (unlikely(ret))
                                        iter->flags & BTREE_ITER_INTENT,
                                        btree_iter_ip_allocated(iter));
 
-               ret = bch2_btree_path_traverse(trans, iter->path, iter->flags);
+               ret = bch2_btree_path_traverse(trans, iter->path->idx, iter->flags);
                if (unlikely(ret)) {
                        /* ensure that iter->k is consistent with iter->pos: */
                        bch2_btree_iter_set_pos(iter, iter->pos);
                                                iter->update_path->idx, pos,
                                                iter->flags & BTREE_ITER_INTENT,
                                                _THIS_IP_);
-                       ret = bch2_btree_path_traverse(trans, iter->update_path, iter->flags);
+                       ret = bch2_btree_path_traverse(trans, iter->update_path->idx, iter->flags);
                        if (unlikely(ret)) {
                                k = bkey_s_c_err(ret);
                                goto out_no_locked;
                                                iter->flags & BTREE_ITER_INTENT,
                                                btree_iter_ip_allocated(iter));
 
-               ret = bch2_btree_path_traverse(trans, iter->path, iter->flags);
+               ret = bch2_btree_path_traverse(trans, iter->path->idx, iter->flags);
                if (unlikely(ret)) {
                        /* ensure that iter->k is consistent with iter->pos: */
                        bch2_btree_iter_set_pos(iter, iter->pos);
                                        iter->flags & BTREE_ITER_INTENT,
                                        btree_iter_ip_allocated(iter));
 
-       ret = bch2_btree_path_traverse(trans, iter->path, iter->flags);
+       ret = bch2_btree_path_traverse(trans, iter->path->idx, iter->flags);
        if (unlikely(ret)) {
                k = bkey_s_c_err(ret);
                goto out_no_locked;
 
                : path;
 }
 
-int __must_check bch2_btree_path_traverse_one(struct btree_trans *, struct btree_path *,
+int __must_check bch2_btree_path_traverse_one(struct btree_trans *,
+                                             btree_path_idx_t,
                                              unsigned, unsigned long);
 
 static inline int __must_check bch2_btree_path_traverse(struct btree_trans *trans,
-                                         struct btree_path *path, unsigned flags)
+                                         btree_path_idx_t path, unsigned flags)
 {
-       if (path->uptodate < BTREE_ITER_NEED_RELOCK)
+       if (trans->paths[path].uptodate < BTREE_ITER_NEED_RELOCK)
                return 0;
 
        return bch2_btree_path_traverse_one(trans, path, flags, _RET_IP_);
 }
 
-int __must_check bch2_btree_path_traverse(struct btree_trans *,
-                                         struct btree_path *, unsigned);
 btree_path_idx_t bch2_path_get(struct btree_trans *, enum btree_id, struct bpos,
                               unsigned, unsigned, unsigned, unsigned long);
 struct bkey_s_c bch2_btree_path_peek_slot(struct btree_path *, struct bkey *);
 
        btree_path_idx_t path_idx =
                bch2_path_get(trans, path->btree_id, path->pos, 1, 0,
                              BTREE_ITER_INTENT, _THIS_IP_);
-       ret = bch2_btree_path_traverse(trans, trans->paths + path_idx, 0);
+       ret = bch2_btree_path_traverse(trans, path_idx, 0);
        if (ret)
                goto out;
 
        btree_path_set_should_be_locked(btree_path);
        ret = bch2_trans_update_by_path(trans, btree_path, i->k, flags, ip);
 out:
-       bch2_path_put(trans, btree_path->idx, true);
+       bch2_path_put(trans, path_idx, true);
        return ret;
 }
 
                                                iter->flags & BTREE_ITER_INTENT,
                                                _THIS_IP_);
 
-               ret = bch2_btree_path_traverse(trans, iter->key_cache_path,
+               ret = bch2_btree_path_traverse(trans, iter->key_cache_path->idx,
                                               BTREE_ITER_CACHED);
                if (unlikely(ret))
                        return ret;
 
                ? bpos_predecessor(b->data->min_key)
                : bpos_successor(b->data->max_key);
 
-       sib_path = trans->paths + bch2_path_get(trans, path->btree_id, sib_pos,
-                                U8_MAX, level, BTREE_ITER_INTENT, _THIS_IP_);
-       ret = bch2_btree_path_traverse(trans, sib_path, false);
+       btree_path_idx_t sib_path_idx =
+               bch2_path_get(trans, path->btree_id, sib_pos,
+                             U8_MAX, level, BTREE_ITER_INTENT, _THIS_IP_);
+       ret = bch2_btree_path_traverse(trans, sib_path_idx, false);
        if (ret)
                goto err;
 
+       sib_path = trans->paths + sib_path_idx;
        btree_path_set_should_be_locked(sib_path);
 
        m = sib_path->l[level].b;
 err:
        if (new_path)
                bch2_path_put(trans, new_path->idx, true);
-       bch2_path_put(trans, sib_path->idx, true);
+       bch2_path_put(trans, sib_path_idx, true);
        bch2_trans_verify_locks(trans);
        return ret;
 err_free_update: