diff options
author | Kent Overstreet <kent.overstreet@linux.dev> | 2025-06-30 17:05:38 -0400 |
---|---|---|
committer | Kent Overstreet <kent.overstreet@linux.dev> | 2025-06-30 17:52:47 -0400 |
commit | 5a1be50715c84f91937c3940afd41e7feaa8698f (patch) | |
tree | 1f95ca8a8f164ca19ea7e25ba92bfd563d0d7a5e | |
parent | db004913b6b9ae2bdbf50a8e72950fd7903a1427 (diff) |
bcachefs: opts.journal_rewind_no_extents
Add an option to skip rewinding extents when rewinding the journal.
If the only extents operatinos that have occurred are data move
operations, then this will give a higher probability of successful
recovery - until we implement the "buffer discards by a percentage of
device size" functionality.
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
-rw-r--r-- | fs/bcachefs/btree_journal_iter.c | 17 | ||||
-rw-r--r-- | fs/bcachefs/opts.h | 5 |
2 files changed, 19 insertions, 3 deletions
diff --git a/fs/bcachefs/btree_journal_iter.c b/fs/bcachefs/btree_journal_iter.c index ea839560a136..341d31b3a1f1 100644 --- a/fs/bcachefs/btree_journal_iter.c +++ b/fs/bcachefs/btree_journal_iter.c @@ -717,6 +717,18 @@ static void __journal_keys_sort(struct journal_keys *keys) keys->nr = dst - keys->data; } +static bool should_rewind_entry(struct bch_fs *c, struct jset_entry *entry) +{ + if (entry->level) + return false; + if (btree_id_is_alloc(entry->btree_id)) + return false; + if (c->opts.journal_rewind_no_extents && + entry->btree_id == BTREE_ID_extents) + return false; + return true; +} + int bch2_journal_keys_sort(struct bch_fs *c) { struct genradix_iter iter; @@ -735,9 +747,8 @@ int bch2_journal_keys_sort(struct bch_fs *c) cond_resched(); vstruct_for_each(&i->j, entry) { - bool rewind = !entry->level && - !btree_id_is_alloc(entry->btree_id) && - le64_to_cpu(i->j.seq) >= rewind_seq; + bool rewind = le64_to_cpu(i->j.seq) >= rewind_seq && + should_rewind_entry(c, entry); if (entry->type != (rewind ? BCH_JSET_ENTRY_overwrite diff --git a/fs/bcachefs/opts.h b/fs/bcachefs/opts.h index 63f8e254495c..d6c4abd316ba 100644 --- a/fs/bcachefs/opts.h +++ b/fs/bcachefs/opts.h @@ -389,6 +389,11 @@ enum fsck_err_opts { OPT_UINT(0, U64_MAX), \ BCH2_NO_SB_OPT, 0, \ NULL, "Rewind journal") \ + x(journal_rewind_no_extents, bool, \ + OPT_FS|OPT_MOUNT, \ + OPT_BOOL(), \ + BCH2_NO_SB_OPT, 0, \ + NULL, "Don't rewind extents when rewinding journal") \ x(recovery_passes, u64, \ OPT_FS|OPT_MOUNT, \ OPT_BITFIELD(bch2_recovery_passes), \ |