bcachefs: split out ignore_blacklisted, ignore_not_dirty
authorKent Overstreet <kent.overstreet@linux.dev>
Sun, 25 Feb 2024 23:48:21 +0000 (18:48 -0500)
committerKent Overstreet <kent.overstreet@linux.dev>
Thu, 14 Mar 2024 01:22:25 +0000 (21:22 -0400)
prep work for replaying the journal backwards

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

index 207dd32e2ecc9e9c7e43002d8da2616d24957a3c..50e04356d72c8ea0f920545561b4797875afc03f 100644 (file)
@@ -512,7 +512,7 @@ int bch2_journal_keys_sort(struct bch_fs *c)
        genradix_for_each(&c->journal_entries, iter, _i) {
                i = *_i;
 
-               if (!i || i->ignore)
+               if (journal_replay_ignore(i))
                        continue;
 
                cond_resched();
index 2e714a32fc7eb3fc2f9e0cb484b48a7f034e12f2..95fd84c08c8c0a17221706a11e13a3802b2bcd4c 100644 (file)
@@ -1204,7 +1204,7 @@ int bch2_fs_journal_start(struct journal *j, u64 cur_seq)
        genradix_for_each_reverse(&c->journal_entries, iter, _i) {
                i = *_i;
 
-               if (!i || i->ignore)
+               if (journal_replay_ignore(i))
                        continue;
 
                last_seq = le64_to_cpu(i->j.last_seq);
@@ -1237,7 +1237,7 @@ int bch2_fs_journal_start(struct journal *j, u64 cur_seq)
        genradix_for_each(&c->journal_entries, iter, _i) {
                i = *_i;
 
-               if (!i || i->ignore)
+               if (journal_replay_ignore(i))
                        continue;
 
                seq = le64_to_cpu(i->j.seq);
index 1c2edfc5448f123a13ebf81cd05da9ae6bede145..34af25f286aab908a97cce774e1242f1ea694ad2 100644 (file)
@@ -86,9 +86,12 @@ static void __journal_replay_free(struct bch_fs *c,
        kvfree(i);
 }
 
-static void journal_replay_free(struct bch_fs *c, struct journal_replay *i)
+static void journal_replay_free(struct bch_fs *c, struct journal_replay *i, bool blacklisted)
 {
-       i->ignore = true;
+       if (blacklisted)
+               i->ignore_blacklisted = true;
+       else
+               i->ignore_not_dirty = true;
 
        if (!c->opts.read_entire_journal)
                __journal_replay_free(c, i);
@@ -138,12 +141,13 @@ static int journal_entry_add(struct bch_fs *c, struct bch_dev *ca,
                                       journal_entry_radix_idx(c, jlist->last_seq)) {
                        i = *_i;
 
-                       if (!i || i->ignore)
+                       if (journal_replay_ignore(i))
                                continue;
 
                        if (le64_to_cpu(i->j.seq) >= last_seq)
                                break;
-                       journal_replay_free(c, i);
+
+                       journal_replay_free(c, i, false);
                }
        }
 
@@ -199,8 +203,9 @@ replace:
                return -BCH_ERR_ENOMEM_journal_entry_add;
 
        darray_init(&i->ptrs);
-       i->csum_good    = entry_ptr.csum_good;
-       i->ignore       = false;
+       i->csum_good            = entry_ptr.csum_good;
+       i->ignore_blacklisted   = false;
+       i->ignore_not_dirty     = false;
        unsafe_memcpy(&i->j, j, bytes, "embedded variable length struct");
 
        if (dup) {
@@ -1255,20 +1260,20 @@ int bch2_journal_read(struct bch_fs *c,
 
                i = *_i;
 
-               if (!i || i->ignore)
+               if (journal_replay_ignore(i))
                        continue;
 
                if (!*start_seq)
                        *blacklist_seq = *start_seq = le64_to_cpu(i->j.seq) + 1;
 
                if (JSET_NO_FLUSH(&i->j)) {
-                       i->ignore = true;
+                       i->ignore_blacklisted = true;
                        continue;
                }
 
                if (!last_write_torn && !i->csum_good) {
                        last_write_torn = true;
-                       i->ignore = true;
+                       i->ignore_blacklisted = true;
                        continue;
                }
 
@@ -1307,12 +1312,12 @@ int bch2_journal_read(struct bch_fs *c,
        genradix_for_each(&c->journal_entries, radix_iter, _i) {
                i = *_i;
 
-               if (!i || i->ignore)
+               if (journal_replay_ignore(i))
                        continue;
 
                seq = le64_to_cpu(i->j.seq);
                if (seq < *last_seq) {
-                       journal_replay_free(c, i);
+                       journal_replay_free(c, i, false);
                        continue;
                }
 
@@ -1320,7 +1325,7 @@ int bch2_journal_read(struct bch_fs *c,
                        fsck_err_on(!JSET_NO_FLUSH(&i->j), c,
                                    jset_seq_blacklisted,
                                    "found blacklisted journal entry %llu", seq);
-                       i->ignore = true;
+                       i->ignore_blacklisted = true;
                }
        }
 
@@ -1329,7 +1334,7 @@ int bch2_journal_read(struct bch_fs *c,
        genradix_for_each(&c->journal_entries, radix_iter, _i) {
                i = *_i;
 
-               if (!i || i->ignore)
+               if (journal_replay_ignore(i))
                        continue;
 
                BUG_ON(seq > le64_to_cpu(i->j.seq));
@@ -1382,7 +1387,7 @@ int bch2_journal_read(struct bch_fs *c,
                };
 
                i = *_i;
-               if (!i || i->ignore)
+               if (journal_replay_ignore(i))
                        continue;
 
                darray_for_each(i->ptrs, ptr) {
index 4d66c77a35e05628da971735947d909c392057ce..4f1e763ab506007c4488b81285b2a6464e5a2f2c 100644 (file)
@@ -20,11 +20,17 @@ struct journal_replay {
        DARRAY_PREALLOCATED(struct journal_ptr, 8) ptrs;
 
        bool                    csum_good;
-       bool                    ignore;
+       bool                    ignore_blacklisted;
+       bool                    ignore_not_dirty;
        /* must be last: */
        struct jset             j;
 };
 
+static inline bool journal_replay_ignore(struct journal_replay *i)
+{
+       return !i || i->ignore_blacklisted || i->ignore_not_dirty;
+}
+
 static inline struct jset_entry *__jset_entry_type_next(struct jset *jset,
                                        struct jset_entry *entry, unsigned type)
 {
index f11e882de02bf2d9f8467f067cf499c3ad326c03..0c579ba8de7802a883759fb745f57186ba43b875 100644 (file)
@@ -366,7 +366,7 @@ static int journal_replay_early(struct bch_fs *c,
                genradix_for_each(&c->journal_entries, iter, _i) {
                        i = *_i;
 
-                       if (!i || i->ignore)
+                       if (journal_replay_ignore(i))
                                continue;
 
                        vstruct_for_each(&i->j, entry) {
@@ -868,7 +868,7 @@ int bch2_fs_recovery(struct bch_fs *c)
                        goto out;
 
                genradix_for_each_reverse(&c->journal_entries, iter, i)
-                       if (*i && !(*i)->ignore) {
+                       if (!journal_replay_ignore(*i)) {
                                last_journal_entry = &(*i)->j;
                                break;
                        }
@@ -893,7 +893,8 @@ int bch2_fs_recovery(struct bch_fs *c)
                        genradix_for_each_reverse(&c->journal_entries, iter, i)
                                if (*i) {
                                        last_journal_entry = &(*i)->j;
-                                       (*i)->ignore = false;
+                                       (*i)->ignore_blacklisted = false;
+                                       (*i)->ignore_not_dirty= false;
                                        /*
                                         * This was probably a NO_FLUSH entry,
                                         * so last_seq was garbage - but we know