bcachefs: Start copygc when first going read-write
authorKent Overstreet <kent.overstreet@linux.dev>
Mon, 17 Oct 2022 08:51:58 +0000 (04:51 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Sun, 22 Oct 2023 21:09:50 +0000 (17:09 -0400)
In the distant past, it wasn't possible to start copygc until after
journal replay had finished. Now, the btree iterator code overlays keys
from the journal, so there's no reason not to start it earlier - and it
solves a rare deadlock.

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
fs/bcachefs/recovery.c
fs/bcachefs/super.c

index 80736be21b9f93dcb64dc8f274dce996e0d300d8..ebdf9f754e081b7039bc74f981a2603529c0d4a3 100644 (file)
@@ -1267,6 +1267,20 @@ use_clean:
                        goto err;
                bch_verbose(c, "done checking need_discard and freespace btrees");
 
+               if (c->sb.version < bcachefs_metadata_version_snapshot_2) {
+                       err = "error creating root snapshot node";
+                       ret = bch2_fs_initialize_subvolumes(c);
+                       if (ret)
+                               goto err;
+               }
+
+               bch_verbose(c, "reading snapshots table");
+               err = "error reading snapshots table";
+               ret = bch2_fs_snapshots_start(c);
+               if (ret)
+                       goto err;
+               bch_verbose(c, "reading snapshots done");
+
                set_bit(BCH_FS_MAY_GO_RW, &c->flags);
 
                bch_info(c, "starting journal replay, %zu keys", c->journal_keys.nr);
@@ -1293,7 +1307,6 @@ use_clean:
                bch_verbose(c, "done checking alloc to lru refs");
                set_bit(BCH_FS_CHECK_ALLOC_TO_LRU_REFS_DONE, &c->flags);
        } else {
-               set_bit(BCH_FS_MAY_GO_RW, &c->flags);
                set_bit(BCH_FS_INITIAL_GC_DONE, &c->flags);
                set_bit(BCH_FS_CHECK_LRUS_DONE, &c->flags);
                set_bit(BCH_FS_CHECK_ALLOC_TO_LRU_REFS_DONE, &c->flags);
@@ -1302,6 +1315,22 @@ use_clean:
                if (c->opts.norecovery)
                        goto out;
 
+               if (c->sb.version < bcachefs_metadata_version_snapshot_2) {
+                       err = "error creating root snapshot node";
+                       ret = bch2_fs_initialize_subvolumes(c);
+                       if (ret)
+                               goto err;
+               }
+
+               bch_verbose(c, "reading snapshots table");
+               err = "error reading snapshots table";
+               ret = bch2_fs_snapshots_start(c);
+               if (ret)
+                       goto err;
+               bch_verbose(c, "reading snapshots done");
+
+               set_bit(BCH_FS_MAY_GO_RW, &c->flags);
+
                bch_verbose(c, "starting journal replay, %zu keys", c->journal_keys.nr);
                err = "journal replay failed";
                ret = bch2_journal_replay(c, last_seq, blacklist_seq - 1);
@@ -1316,22 +1345,6 @@ use_clean:
        if (ret)
                goto err;
 
-       if (c->sb.version < bcachefs_metadata_version_snapshot_2) {
-               bch2_fs_lazy_rw(c);
-
-               err = "error creating root snapshot node";
-               ret = bch2_fs_initialize_subvolumes(c);
-               if (ret)
-                       goto err;
-       }
-
-       bch_verbose(c, "reading snapshots table");
-       err = "error reading snapshots table";
-       ret = bch2_fs_snapshots_start(c);
-       if (ret)
-               goto err;
-       bch_verbose(c, "reading snapshots done");
-
        if (c->sb.version < bcachefs_metadata_version_snapshot_2) {
                /* set bi_subvol on root inode */
                err = "error upgrade root inode for subvolumes";
index 872b82a2450562053a61d0c9dbcb1c104e10bc64..e7e3dcbe23395a19d4bc76a3ac256b68c94fc59f 100644 (file)
@@ -332,26 +332,12 @@ static int bch2_fs_read_write_late(struct bch_fs *c)
 {
        int ret;
 
-       ret = bch2_gc_thread_start(c);
-       if (ret) {
-               bch_err(c, "error starting gc thread");
-               return ret;
-       }
-
-       ret = bch2_copygc_start(c);
-       if (ret) {
-               bch_err(c, "error starting copygc thread");
-               return ret;
-       }
-
        ret = bch2_rebalance_start(c);
        if (ret) {
                bch_err(c, "error starting rebalance thread");
                return ret;
        }
 
-       schedule_work(&c->ec_stripe_delete_work);
-
        return 0;
 }
 
@@ -398,6 +384,18 @@ static int __bch2_fs_read_write(struct bch_fs *c, bool early)
                bch2_dev_allocator_add(c, ca);
        bch2_recalc_capacity(c);
 
+       ret = bch2_gc_thread_start(c);
+       if (ret) {
+               bch_err(c, "error starting gc thread");
+               return ret;
+       }
+
+       ret = bch2_copygc_start(c);
+       if (ret) {
+               bch_err(c, "error starting copygc thread");
+               return ret;
+       }
+
        if (!early) {
                ret = bch2_fs_read_write_late(c);
                if (ret)