bch2_btree_trans_verify_locks(iter->trans);
 }
 
-int bch2_btree_iter_unlock(struct btree_iter *iter)
-{
-       struct btree_iter *linked;
-
-       trans_for_each_iter(iter->trans, linked)
-               __bch2_btree_iter_unlock(linked);
-
-       return btree_iter_err(iter);
-}
-
 bool bch2_btree_trans_relock(struct btree_trans *trans)
 {
        struct btree_iter *iter;
  * Returns 0 on success, -EIO on error (error reading in a btree node).
  *
  * On error, caller (peek_node()/peek_key()) must return NULL; the error is
- * stashed in the iterator and returned from bch2_btree_iter_unlock().
+ * stashed in the iterator and returned from bch2_trans_exit().
  */
 int __must_check __bch2_btree_iter_traverse(struct btree_iter *iter)
 {
 
 int bch2_btree_split_leaf(struct bch_fs *c, struct btree_iter *iter,
                          unsigned flags)
 {
+       struct btree_trans *trans = iter->trans;
        struct btree *b = iter->l[0].b;
        struct btree_update *as;
        struct closure cl;
         * We already have a disk reservation and open buckets pinned; this
         * allocation must not block:
         */
-       trans_for_each_iter(iter->trans, linked)
+       trans_for_each_iter(trans, linked)
                if (linked->btree_id == BTREE_ID_EXTENTS)
                        flags |= BTREE_INSERT_USE_RESERVE;
 
                if (flags & BTREE_INSERT_NOUNLOCK)
                        return -EINTR;
 
-               bch2_btree_trans_unlock(iter->trans);
+               bch2_btree_trans_unlock(trans);
                down_read(&c->gc_lock);
 
-               if (!bch2_btree_trans_relock(iter->trans))
+               if (!bch2_btree_trans_relock(trans))
                        ret = -EINTR;
        }
 
                ret = PTR_ERR(as);
                if (ret == -EAGAIN) {
                        BUG_ON(flags & BTREE_INSERT_NOUNLOCK);
-                       bch2_btree_iter_unlock(iter);
+                       bch2_btree_trans_unlock(trans);
                        ret = -EINTR;
                }
                goto out;
                                   unsigned flags,
                                   enum btree_node_sibling sib)
 {
+       struct btree_trans *trans = iter->trans;
        struct btree_update *as;
        struct bkey_format_state new_s;
        struct bkey_format new_f;
        if (flags & BTREE_INSERT_NOUNLOCK)
                goto out;
 
-       bch2_btree_iter_unlock(iter);
+       bch2_btree_trans_unlock(trans);
 
        down_read(&c->gc_lock);
        up_read(&c->gc_lock);
 
        if ((ret == -EAGAIN || ret == -EINTR) &&
            !(flags & BTREE_INSERT_NOUNLOCK)) {
-               bch2_btree_iter_unlock(iter);
+               bch2_btree_trans_unlock(trans);
                closure_sync(&cl);
                ret = bch2_btree_iter_traverse(iter);
                if (ret)
 int bch2_btree_node_rewrite(struct bch_fs *c, struct btree_iter *iter,
                            __le64 seq, unsigned flags)
 {
+       struct btree_trans *trans = iter->trans;
        struct closure cl;
        struct btree *b;
        int ret;
 
        if (!(flags & BTREE_INSERT_GC_LOCK_HELD)) {
                if (!down_read_trylock(&c->gc_lock)) {
-                       bch2_btree_iter_unlock(iter);
+                       bch2_btree_trans_unlock(trans);
                        down_read(&c->gc_lock);
                }
        }
                    ret != -EINTR)
                        break;
 
-               bch2_btree_iter_unlock(iter);
+               bch2_btree_trans_unlock(trans);
                closure_sync(&cl);
        }