bcachefs: Don't start copygc until recovery is finished
authorKent Overstreet <kent.overstreet@linux.dev>
Mon, 10 Jul 2023 21:23:59 +0000 (17:23 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Sun, 22 Oct 2023 21:10:07 +0000 (17:10 -0400)
With "bcachefs: Snapshot depth, skiplist fields", we now can't run data
move operations until after bch2_check_snapshots() is complete.

Ideally we'd have the copygc (and rebalance) threads wait until
c->curr_recovery_pass has advanced, but the waitlist handling is tricky
- so for now, move starting copygc back to read_write_late().

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

index 6ab98c2299dda4a27ce1aa0155e72245cfac901e..63e9dafa83957270ff5e7b8a5fbbca4a7d1f4f4e 100644 (file)
@@ -344,6 +344,19 @@ static int bch2_fs_read_write_late(struct bch_fs *c)
 {
        int ret;
 
+       /*
+        * Data move operations can't run until after check_snapshots has
+        * completed, and bch2_snapshot_is_ancestor() is available.
+        *
+        * Ideally we'd start copygc/rebalance earlier instead of waiting for
+        * all of recovery/fsck to complete:
+        */
+       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");
@@ -403,12 +416,6 @@ static int __bch2_fs_read_write(struct bch_fs *c, bool early)
                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)