struct mutex            btree_interior_update_lock;
        struct closure_waitlist btree_interior_update_wait;
 
+       mempool_t               btree_iters_pool;
+
        struct workqueue_struct *wq;
        /* copygc needs its own workqueue for index updates.. */
        struct workqueue_struct *copygc_wq;
 
 
        bch2_trans_unlock(trans);
 
-       new_iters = kmalloc(sizeof(struct btree_iter) * BTREE_ITER_MAX,
-                           GFP_NOFS);
-       if (!new_iters)
-               return -ENOMEM;
+       new_iters = mempool_alloc(&trans->c->btree_iters_pool, GFP_NOFS);
 
        memcpy(new_iters, trans->iters,
               sizeof(struct btree_iter) * trans->nr_iters);
        return 0;
 }
 
-int bch2_trans_preload_iters(struct btree_trans *trans)
+void bch2_trans_preload_iters(struct btree_trans *trans)
 {
-       if (trans->iters != trans->iters_onstack)
-               return 0;
-
-       return btree_trans_realloc_iters(trans);
+       if (trans->iters == trans->iters_onstack)
+               btree_trans_realloc_iters(trans);
 }
 
 static struct btree_iter *__btree_trans_get_iter(struct btree_trans *trans,
 
        kfree(trans->mem);
        if (trans->iters != trans->iters_onstack)
-               kfree(trans->iters);
+               mempool_free(trans->iters, &trans->c->btree_iters_pool);
        trans->mem      = (void *) 0x1;
        trans->iters    = (void *) 0x1;
        return ret;
 
 
 /* new multiple iterator interface: */
 
-int bch2_trans_preload_iters(struct btree_trans *);
+void bch2_trans_preload_iters(struct btree_trans *);
 void bch2_trans_iter_free(struct btree_trans *,
                                struct btree_iter *);
 
 
 
        bch2_trans_init(&trans, c);
 
-       BUG_ON(bch2_trans_preload_iters(&trans));
+       bch2_trans_preload_iters(&trans);
 
        iter = bch2_trans_get_iter(&trans, BTREE_ID_DIRENTS,
                                   POS(BCACHEFS_ROOT_INO, 0), 0);
 
        bch2_trans_init(&trans, c);
 
-       BUG_ON(bch2_trans_preload_iters(&trans));
+       bch2_trans_preload_iters(&trans);
 
        iter = bch2_trans_get_iter(&trans, BTREE_ID_XATTRS,
                                   POS(BCACHEFS_ROOT_INO, 0), 0);
 
        bch2_fs_compress_exit(c);
        percpu_free_rwsem(&c->usage_lock);
        free_percpu(c->usage_percpu);
+       mempool_exit(&c->btree_iters_pool);
        mempool_exit(&c->btree_bounce_pool);
        bioset_exit(&c->btree_bio);
        mempool_exit(&c->btree_interior_update_pool);
            percpu_init_rwsem(&c->usage_lock) ||
            mempool_init_kvpmalloc_pool(&c->btree_bounce_pool, 1,
                                        btree_bytes(c)) ||
+           mempool_init_kmalloc_pool(&c->btree_iters_pool, 1,
+                       sizeof(struct btree_iter) * BTREE_ITER_MAX) ||
            bch2_io_clock_init(&c->io_clock[READ]) ||
            bch2_io_clock_init(&c->io_clock[WRITE]) ||
            bch2_fs_journal_init(&c->journal) ||