]> www.infradead.org Git - users/hch/configfs.git/commitdiff
bcachefs: Ensure BCH_FS_may_go_rw is set before exiting recovery
authorKent Overstreet <kent.overstreet@linux.dev>
Thu, 31 Oct 2024 07:33:36 +0000 (03:33 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Thu, 7 Nov 2024 21:48:21 +0000 (16:48 -0500)
If BCH_FS_may_go_rw is not yet set, it indicates to the transaction
commit path that updates should be done via the list of journal replay
keys.

This must be set before multithreaded use commences.

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

index 32d15aacc06986d7ab01e41b5a18dc93ff7a35ef..3c7f941dde39ad5fc934c57ff099865a394b0112 100644 (file)
@@ -862,6 +862,13 @@ use_clean:
        if (ret)
                goto err;
 
+       /*
+        * Normally set by the appropriate recovery pass: when cleared, this
+        * indicates we're in early recovery and btree updates should be done by
+        * being applied to the journal replay keys. _Must_ be cleared before
+        * multithreaded use:
+        */
+       set_bit(BCH_FS_may_go_rw, &c->flags);
        clear_bit(BCH_FS_fsck_running, &c->flags);
 
        /* in case we don't run journal replay, i.e. norecovery mode */
index 735b8adc8f9d95835c4037ef869623e04ce44af7..4bbeac9e0526bf24603a7aab5199d07ca699a87c 100644 (file)
@@ -221,6 +221,12 @@ int bch2_run_recovery_passes(struct bch_fs *c)
 {
        int ret = 0;
 
+       /*
+        * We can't allow set_may_go_rw to be excluded; that would cause us to
+        * use the journal replay keys for updates where it's not expected.
+        */
+       c->opts.recovery_passes_exclude &= ~BCH_RECOVERY_PASS_set_may_go_rw;
+
        while (c->curr_recovery_pass < ARRAY_SIZE(recovery_pass_fns)) {
                if (c->opts.recovery_pass_last &&
                    c->curr_recovery_pass > c->opts.recovery_pass_last)