j->last_empty_seq = cur_seq - 1; /* to match j->seq */
 
        spin_lock(&j->lock);
-
-       set_bit(JOURNAL_running, &j->flags);
        j->last_flush_write = jiffies;
 
        j->reservations.idx = journal_cur_seq(j);
        return 0;
 }
 
+void bch2_journal_set_replay_done(struct journal *j)
+{
+       /*
+        * journal_space_available must happen before setting JOURNAL_running
+        * JOURNAL_running must happen before JOURNAL_replay_done
+        */
+       spin_lock(&j->lock);
+       bch2_journal_space_available(j);
+
+       set_bit(JOURNAL_need_flush_write, &j->flags);
+       set_bit(JOURNAL_running, &j->flags);
+       set_bit(JOURNAL_replay_done, &j->flags);
+       spin_unlock(&j->lock);
+}
+
 /* init/exit: */
 
 void bch2_dev_journal_exit(struct bch_dev *ca)
 
 
 struct bch_dev;
 
-static inline void bch2_journal_set_replay_done(struct journal *j)
-{
-       BUG_ON(!test_bit(JOURNAL_running, &j->flags));
-       set_bit(JOURNAL_replay_done, &j->flags);
-}
-
 void bch2_journal_unblock(struct journal *);
 void bch2_journal_block(struct journal *);
 struct journal_buf *bch2_next_write_buffer_flush_journal_buf(struct journal *, u64, bool *);
 
 void bch2_fs_journal_stop(struct journal *);
 int bch2_fs_journal_start(struct journal *, u64);
+void bch2_journal_set_replay_done(struct journal *);
 
 void bch2_dev_journal_exit(struct bch_dev *);
 int bch2_dev_journal_init(struct bch_dev *, struct bch_sb *);
 
        if (ret)
                goto err;
 
-       set_bit(BCH_FS_accounting_replay_done, &c->flags);
-       bch2_journal_set_replay_done(&c->journal);
-
        ret = bch2_fs_read_write_early(c);
        if (ret)
                goto err;
 
+       set_bit(BCH_FS_accounting_replay_done, &c->flags);
+       bch2_journal_set_replay_done(&c->journal);
+
        for_each_member_device(c, ca) {
                ret = bch2_dev_usage_init(ca, false);
                if (ret) {
 
 
        clear_bit(BCH_FS_clean_shutdown, &c->flags);
 
+       __for_each_online_member(c, ca, BIT(BCH_MEMBER_STATE_rw), READ) {
+               bch2_dev_allocator_add(c, ca);
+               percpu_ref_reinit(&ca->io_ref[WRITE]);
+       }
+       bch2_recalc_capacity(c);
+
        /*
         * First journal write must be a flush write: after a clean shutdown we
         * don't read the journal, so the first journal write may end up
         * overwriting whatever was there previously, and there must always be
         * at least one non-flush write in the journal or recovery will fail:
         */
+       spin_lock(&c->journal.lock);
        set_bit(JOURNAL_need_flush_write, &c->journal.flags);
        set_bit(JOURNAL_running, &c->journal.flags);
-
-       __for_each_online_member(c, ca, BIT(BCH_MEMBER_STATE_rw), READ) {
-               bch2_dev_allocator_add(c, ca);
-               percpu_ref_reinit(&ca->io_ref[WRITE]);
-       }
-       bch2_recalc_capacity(c);
+       bch2_journal_space_available(&c->journal);
+       spin_unlock(&c->journal.lock);
 
        ret = bch2_fs_mark_dirty(c);
        if (ret)
                goto err;
 
-       spin_lock(&c->journal.lock);
-       bch2_journal_space_available(&c->journal);
-       spin_unlock(&c->journal.lock);
-
        ret = bch2_journal_reclaim_start(&c->journal);
        if (ret)
                goto err;