1

bcachefs: Ensure BCH_FS_may_go_rw is set before exiting recovery

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>
This commit is contained in:
Kent Overstreet 2024-10-31 03:33:36 -04:00
parent cec136d348
commit ef4f6c322b
2 changed files with 13 additions and 0 deletions

View File

@ -862,6 +862,13 @@ use_clean:
if (ret) if (ret)
goto err; 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); clear_bit(BCH_FS_fsck_running, &c->flags);
/* in case we don't run journal replay, i.e. norecovery mode */ /* in case we don't run journal replay, i.e. norecovery mode */

View File

@ -221,6 +221,12 @@ int bch2_run_recovery_passes(struct bch_fs *c)
{ {
int ret = 0; 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)) { while (c->curr_recovery_pass < ARRAY_SIZE(recovery_pass_fns)) {
if (c->opts.recovery_pass_last && if (c->opts.recovery_pass_last &&
c->curr_recovery_pass > c->opts.recovery_pass_last) c->curr_recovery_pass > c->opts.recovery_pass_last)