- for_each_online_member(ca, c, i)
- bch2_sb_from_fs(c, ca);
- mutex_unlock(&c->sb_lock);
-
- if (BCH_SB_INITIALIZED(c->disk_sb)) {
- ret = bch2_journal_read(c, &journal);
- if (ret)
- goto err;
-
- j = &list_entry(journal.prev, struct journal_replay, list)->j;
-
- c->prio_clock[READ].hand = le16_to_cpu(j->read_clock);
- c->prio_clock[WRITE].hand = le16_to_cpu(j->write_clock);
-
- err = "error reading priorities";
- for_each_readable_member(ca, c, i) {
- ret = bch2_prio_read(ca);
- if (ret) {
- percpu_ref_put(&ca->io_ref);
- goto err;
- }
- }
-
- for (id = 0; id < BTREE_ID_NR; id++) {
- unsigned level;
- struct bkey_i *k;
-
- err = "bad btree root";
- k = bch2_journal_find_btree_root(c, j, id, &level);
- if (!k && id == BTREE_ID_EXTENTS)
- goto err;
- if (!k) {
- pr_debug("missing btree root: %d", id);
- continue;
- }
-
- err = "error reading btree root";
- if (bch2_btree_root_read(c, id, k, level))
- goto err;
- }
-
- bch_verbose(c, "starting mark and sweep:");
-
- err = "error in recovery";
- ret = bch2_initial_gc(c, &journal);
- if (ret)
- goto err;
-
- if (c->opts.noreplay)
- goto recovery_done;
-
- bch_verbose(c, "mark and sweep done");
-
- /*
- * bch2_journal_start() can't happen sooner, or btree_gc_finish()
- * will give spurious errors about oldest_gen > bucket_gen -
- * this is a hack but oh well.
- */
- bch2_journal_start(c);
-
- err = "error starting allocator thread";
- for_each_rw_member(ca, c, i)
- if (bch2_dev_allocator_start(ca)) {
- percpu_ref_put(&ca->io_ref);
- goto err;
- }
-
- bch_verbose(c, "starting journal replay:");
-
- err = "journal replay failed";
- ret = bch2_journal_replay(c, &journal);
- if (ret)
- goto err;
-
- bch_verbose(c, "journal replay done");
-
- if (c->opts.norecovery)
- goto recovery_done;
-
- bch_verbose(c, "starting fsck:");
- err = "error in fsck";
- ret = bch2_fsck(c, !c->opts.nofsck);
- if (ret)
- goto err;
-
- for_each_rw_member(ca, c, i)
- if (ca->need_prio_write) {
- ret = bch2_prio_write(ca);
- if (ret) {
- percpu_ref_put(&ca->io_ref);
- goto err;
- }
- }
-
- bch_verbose(c, "fsck done");
- } else {
- struct bch_inode_unpacked inode;
- struct bkey_inode_buf packed_inode;
- struct closure cl;
-
- closure_init_stack(&cl);
-
- bch_notice(c, "initializing new filesystem");