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 <[email protected]>
---
 fs/bcachefs/btree_journal_iter.c | 17 ++++++++++++++---
 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 b0a76bd6d6f5..9301f318c4d4 100644
--- a/fs/bcachefs/opts.h
+++ b/fs/bcachefs/opts.h
@@ -384,6 +384,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),                           \
-- 
2.50.0


Reply via email to