ret = __bch2_alloc_write_key(c, ca, b, &iter,
                                must_flush ? &journal_seq : NULL,
                                BTREE_INSERT_GC_LOCK_HELD|
-                               !fifo_empty(&ca->free_inc) ? BTREE_INSERT_NOWAIT : 0);
+                               (!fifo_empty(&ca->free_inc)
+                                ? BTREE_INSERT_NOWAIT : 0));
        }
 
        bch2_btree_iter_unlock(&iter);
 
        closure_init_stack(&cl);
 
        /* Hack, because gc and splitting nodes doesn't mix yet: */
-       if (!down_read_trylock(&c->gc_lock)) {
+       if (!(flags & BTREE_INSERT_GC_LOCK_HELD) &&
+           !down_read_trylock(&c->gc_lock)) {
                if (flags & BTREE_INSERT_NOUNLOCK)
                        return -EINTR;
 
         */
        __bch2_btree_iter_downgrade(iter, 1);
 out:
-       up_read(&c->gc_lock);
+       if (!(flags & BTREE_INSERT_GC_LOCK_HELD))
+               up_read(&c->gc_lock);
        closure_sync(&cl);
        return ret;
 }
        }
 
        /* We're changing btree topology, doesn't mix with gc: */
-       if (!down_read_trylock(&c->gc_lock))
+       if (!(flags & BTREE_INSERT_GC_LOCK_HELD) &&
+           !down_read_trylock(&c->gc_lock))
                goto err_cycle_gc_lock;
 
        if (!bch2_btree_iter_upgrade(iter, U8_MAX,
 
        bch2_btree_update_done(as);
 
-       up_read(&c->gc_lock);
+       if (!(flags & BTREE_INSERT_GC_LOCK_HELD))
+               up_read(&c->gc_lock);
 out:
        bch2_btree_iter_verify_locks(iter);
 
 
 err_unlock:
        six_unlock_intent(&m->lock);
-       up_read(&c->gc_lock);
+       if (!(flags & BTREE_INSERT_GC_LOCK_HELD))
+               up_read(&c->gc_lock);
 err:
        BUG_ON(ret == -EAGAIN && (flags & BTREE_INSERT_NOUNLOCK));