bcachefs: Start snapshots before bch2_gc()
authorKent Overstreet <kent.overstreet@linux.dev>
Thu, 19 Jan 2023 08:37:44 +0000 (03:37 -0500)
committerKent Overstreet <kent.overstreet@linux.dev>
Sun, 22 Oct 2023 21:09:51 +0000 (17:09 -0400)
bch2_gc may require snapshots to be started - the repair path when
checking the reflink btree may do updates to the extents btree.

This moves bch2_fs_initialize_subvolumes() and bch2_fs_snapshots_start()
to before bch2_gc() - since we haven't gone RW yet, the updates in
bch2_fs_initialize_subvolumes() are done via the journal replay keys
list, so it's fine to do this before bch2_gc().

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

index 55356c117737c53a1c33f9a32ca470819496fc63..2df1a541cb40f25743fd857e617e3ef98638dfea 100644 (file)
@@ -1250,6 +1250,20 @@ use_clean:
 
        bch2_stripes_heap_start(c);
 
+       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");
+
        if (c->opts.fsck) {
                bool metadata_only = c->opts.norecovery;
 
@@ -1262,20 +1276,6 @@ use_clean:
 
                set_bit(BCH_FS_INITIAL_GC_DONE, &c->flags);
 
-               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);
@@ -1343,20 +1343,6 @@ 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);