if (c->opts.nochanges ||
            !percpu_ref_tryget(&c->writes)) {
-               __bcache_io_error(c, "read only");
+               if (!(op->flags & BCH_WRITE_FROM_INTERNAL))
+                       __bcache_io_error(c, "read only");
                op->error = -EROFS;
                goto err;
        }
 
        BCH_WRITE_ONLY_SPECIFIED_DEVS   = (1 << 6),
        BCH_WRITE_NOPUT_RESERVATION     = (1 << 7),
        BCH_WRITE_WROTE_DATA_INLINE     = (1 << 8),
+       BCH_WRITE_FROM_INTERNAL         = (1 << 9),
 
        /* Internal: */
-       BCH_WRITE_JOURNAL_SEQ_PTR       = (1 << 9),
-       BCH_WRITE_SKIP_CLOSURE_PUT      = (1 << 10),
+       BCH_WRITE_JOURNAL_SEQ_PTR       = (1 << 10),
+       BCH_WRITE_SKIP_CLOSURE_PUT      = (1 << 11),
 };
 
 static inline u64 *op_journal_seq(struct bch_write_op *op)
 
        m->op.flags |= BCH_WRITE_ONLY_SPECIFIED_DEVS|
                BCH_WRITE_PAGES_STABLE|
                BCH_WRITE_PAGES_OWNED|
-               BCH_WRITE_DATA_ENCODED;
+               BCH_WRITE_DATA_ENCODED|
+               BCH_WRITE_FROM_INTERNAL;
 
        m->op.nr_replicas       = 1;
        m->op.nr_replicas_required = 1;