]> www.infradead.org Git - nvme.git/commitdiff
bcachefs: Fix "journal stuck" during recovery
authorKent Overstreet <kent.overstreet@linux.dev>
Wed, 2 Apr 2025 16:23:25 +0000 (12:23 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Thu, 3 Apr 2025 16:11:43 +0000 (12:11 -0400)
If we crash when the journal pin fifo is completely full - i.e. we're
at the maximum number of dirty journal entries - that may put us in a
sticky situation in recovery, as journal replay will need to be able to
open new journal entries in order to get going.

bch2_fs_journal_start() already had provisions for resizing the journal
pin fifo if needed, but it needs a fudge factor to ensure there's room
for journal replay.

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

index 11f104f436e33a57b74833f57666319229fc730f..d8f74b6d0a75a8260269bd29811a14dfb4196de9 100644 (file)
@@ -1404,6 +1404,14 @@ int bch2_fs_journal_start(struct journal *j, u64 cur_seq)
 
        nr = cur_seq - last_seq;
 
+       /*
+        * Extra fudge factor, in case we crashed when the journal pin fifo was
+        * nearly or completely full. We'll need to be able to open additional
+        * journal entries (at least a few) in order for journal replay to get
+        * going:
+        */
+       nr += nr / 4;
+
        if (nr + 1 > j->pin.size) {
                free_fifo(&j->pin);
                init_fifo(&j->pin, roundup_pow_of_two(nr + 1), GFP_KERNEL);