]> git.sesse.net Git - bcachefs-tools-debian/commitdiff
Update bcachefs sources to ed88ebf18c bcachefs: Handle last journal write being torn
authorKent Overstreet <kent.overstreet@linux.dev>
Sun, 20 Nov 2022 02:45:00 +0000 (21:45 -0500)
committerKent Overstreet <kent.overstreet@linux.dev>
Sun, 20 Nov 2022 02:45:00 +0000 (21:45 -0500)
.bcachefs_revision
libbcachefs/journal_io.c

index 8bdba8c8766ae67d2159d5dbd2cc77c867dac2c8..a58de04b5217d1e47faa961d5e6a212cd59dcbe4 100644 (file)
@@ -1 +1 @@
-586e7c5498345c048985f6864f07ce36adde48be
+ed88ebf18cd1ef0a3439ebfdf0059d37bb4d4249
index 01150635e1e9efe734e23857732757ec81d1ad6a..8c86bf063c5c6c594d84e7dcf5b9d247441d8690 100644 (file)
@@ -1107,7 +1107,7 @@ int bch2_journal_read(struct bch_fs *c, u64 *blacklist_seq, u64 *start_seq)
        struct bch_dev *ca;
        unsigned iter;
        struct printbuf buf = PRINTBUF;
-       bool degraded = false;
+       bool degraded = false, last_write_torn = false;
        u64 seq, last_seq = 0;
        int ret = 0;
 
@@ -1143,8 +1143,13 @@ int bch2_journal_read(struct bch_fs *c, u64 *blacklist_seq, u64 *start_seq)
        /*
         * 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;
+
                i = *_i;
 
                if (!i || i->ignore)
@@ -1153,21 +1158,27 @@ int bch2_journal_read(struct bch_fs *c, u64 *blacklist_seq, u64 *start_seq)
                if (!*start_seq)
                        *blacklist_seq = *start_seq = le64_to_cpu(i->j.seq) + 1;
 
-               if (!JSET_NO_FLUSH(&i->j)) {
-                       int write = READ;
-                       if (journal_entry_err_on(le64_to_cpu(i->j.last_seq) > le64_to_cpu(i->j.seq),
-                                                c, &i->j, NULL,
-                                                "invalid journal entry: last_seq > seq (%llu > %llu)",
-                                                le64_to_cpu(i->j.last_seq),
-                                                le64_to_cpu(i->j.seq)))
-                               i->j.last_seq = i->j.seq;
-
-                       last_seq        = le64_to_cpu(i->j.last_seq);
-                       *blacklist_seq  = le64_to_cpu(i->j.seq) + 1;
-                       break;
+               if (JSET_NO_FLUSH(&i->j)) {
+                       journal_replay_free(c, i);
+                       continue;
                }
 
-               journal_replay_free(c, i);
+               if (!last_write_torn && !i->csum_good) {
+                       last_write_torn = true;
+                       journal_replay_free(c, i);
+                       continue;
+               }
+
+               if (journal_entry_err_on(le64_to_cpu(i->j.last_seq) > le64_to_cpu(i->j.seq),
+                                        c, &i->j, NULL,
+                                        "invalid journal entry: last_seq > seq (%llu > %llu)",
+                                        le64_to_cpu(i->j.last_seq),
+                                        le64_to_cpu(i->j.seq)))
+                       i->j.last_seq = i->j.seq;
+
+               last_seq        = le64_to_cpu(i->j.last_seq);
+               *blacklist_seq  = le64_to_cpu(i->j.seq) + 1;
+               break;
        }
 
        if (!*start_seq) {