]> git.sesse.net Git - bcachefs-tools-debian/blobdiff - libbcachefs/journal_io.c
Update bcachefs sources to 7958ebe324 bcachefs: Fix alloc_v4_backpointers()
[bcachefs-tools-debian] / libbcachefs / journal_io.c
index 2b1974a9f360e943e59a408ccbbcb9cc2c262f4b..d6f259348b3dbb67eec2740a19b93b333765d038 100644 (file)
@@ -1080,7 +1080,10 @@ void bch2_journal_ptrs_to_text(struct printbuf *out, struct bch_fs *c,
        }
 }
 
-int bch2_journal_read(struct bch_fs *c, u64 *blacklist_seq, u64 *start_seq)
+int bch2_journal_read(struct bch_fs *c,
+                     u64 *last_seq,
+                     u64 *blacklist_seq,
+                     u64 *start_seq)
 {
        struct journal_list jlist;
        struct journal_replay *i, **_i, *prev = NULL;
@@ -1089,7 +1092,7 @@ int bch2_journal_read(struct bch_fs *c, u64 *blacklist_seq, u64 *start_seq)
        unsigned iter;
        struct printbuf buf = PRINTBUF;
        bool degraded = false, last_write_torn = false;
-       u64 seq, last_seq = 0;
+       u64 seq;
        int ret = 0;
 
        closure_init_stack(&jlist.cl);
@@ -1118,15 +1121,13 @@ int bch2_journal_read(struct bch_fs *c, u64 *blacklist_seq, u64 *start_seq)
        if (jlist.ret)
                return jlist.ret;
 
+       *last_seq       = 0;
        *start_seq      = 0;
        *blacklist_seq  = 0;
 
        /*
         * Find most recent flush entry, and ignore newer non flush entries -
         * those entries will be blacklisted:
-        *
-        *
-        * XXX check for torn write on last journal entry
         */
        genradix_for_each_reverse(&c->journal_entries, radix_iter, _i) {
                int write = READ;
@@ -1140,13 +1141,13 @@ int bch2_journal_read(struct bch_fs *c, u64 *blacklist_seq, u64 *start_seq)
                        *blacklist_seq = *start_seq = le64_to_cpu(i->j.seq) + 1;
 
                if (JSET_NO_FLUSH(&i->j)) {
-                       journal_replay_free(c, i);
+                       i->ignore = true;
                        continue;
                }
 
                if (!last_write_torn && !i->csum_good) {
                        last_write_torn = true;
-                       journal_replay_free(c, i);
+                       i->ignore = true;
                        continue;
                }
 
@@ -1157,7 +1158,7 @@ int bch2_journal_read(struct bch_fs *c, u64 *blacklist_seq, u64 *start_seq)
                                         le64_to_cpu(i->j.seq)))
                        i->j.last_seq = i->j.seq;
 
-               last_seq        = le64_to_cpu(i->j.last_seq);
+               *last_seq       = le64_to_cpu(i->j.last_seq);
                *blacklist_seq  = le64_to_cpu(i->j.seq) + 1;
                break;
        }
@@ -1167,13 +1168,13 @@ int bch2_journal_read(struct bch_fs *c, u64 *blacklist_seq, u64 *start_seq)
                return 0;
        }
 
-       if (!last_seq) {
+       if (!*last_seq) {
                fsck_err(c, "journal read done, but no entries found after dropping non-flushes");
                return 0;
        }
 
        bch_info(c, "journal read done, replaying entries %llu-%llu",
-                last_seq, *blacklist_seq - 1);
+                *last_seq, *blacklist_seq - 1);
 
        if (*start_seq != *blacklist_seq)
                bch_info(c, "dropped unflushed entries %llu-%llu",
@@ -1187,7 +1188,7 @@ int bch2_journal_read(struct bch_fs *c, u64 *blacklist_seq, u64 *start_seq)
                        continue;
 
                seq = le64_to_cpu(i->j.seq);
-               if (seq < last_seq) {
+               if (seq < *last_seq) {
                        journal_replay_free(c, i);
                        continue;
                }
@@ -1195,13 +1196,12 @@ int bch2_journal_read(struct bch_fs *c, u64 *blacklist_seq, u64 *start_seq)
                if (bch2_journal_seq_is_blacklisted(c, seq, true)) {
                        fsck_err_on(!JSET_NO_FLUSH(&i->j), c,
                                    "found blacklisted journal entry %llu", seq);
-
-                       journal_replay_free(c, i);
+                       i->ignore = true;
                }
        }
 
        /* Check for missing entries: */
-       seq = last_seq;
+       seq = *last_seq;
        genradix_for_each(&c->journal_entries, radix_iter, _i) {
                i = *_i;
 
@@ -1239,7 +1239,7 @@ int bch2_journal_read(struct bch_fs *c, u64 *blacklist_seq, u64 *start_seq)
                                 "  prev at %s\n"
                                 "  next at %s",
                                 missing_start, missing_end,
-                                last_seq, *blacklist_seq - 1,
+                                *last_seq, *blacklist_seq - 1,
                                 buf1.buf, buf2.buf);
 
                        printbuf_exit(&buf1);