]> www.infradead.org Git - users/hch/configfs.git/commitdiff
bcachefs: Fix replay_now_at() assert
authorKent Overstreet <kent.overstreet@linux.dev>
Thu, 22 Aug 2024 00:49:07 +0000 (20:49 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Thu, 22 Aug 2024 06:07:23 +0000 (02:07 -0400)
Journal replay, in the slowpath where we insert keys in journal order,
was inserting keys in the wrong order; keys from early repair come last.

Reported-by: syzbot+2c4fcb257ce2b6a29d0e@syzkaller.appspotmail.com
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
fs/bcachefs/recovery.c

index 11368dfa96b28224c3e55e42d39a0ff98426bb4b..36de1c6fe8c36e4ebc4c14af1eaf6f44a727e4a6 100644 (file)
@@ -241,7 +241,13 @@ static int journal_sort_seq_cmp(const void *_l, const void *_r)
        const struct journal_key *l = *((const struct journal_key **)_l);
        const struct journal_key *r = *((const struct journal_key **)_r);
 
-       return cmp_int(l->journal_seq, r->journal_seq);
+       /*
+        * Map 0 to U64_MAX, so that keys with journal_seq === 0 come last
+        *
+        * journal_seq == 0 means that the key comes from early repair, and
+        * should be inserted last so as to avoid overflowing the journal
+        */
+       return cmp_int(l->journal_seq - 1, r->journal_seq - 1);
 }
 
 int bch2_journal_replay(struct bch_fs *c)