bcachefs: Fix journal reclaim spinning in recovery
authorKent Overstreet <kent.overstreet@gmail.com>
Sun, 29 Nov 2020 22:09:13 +0000 (17:09 -0500)
committerKent Overstreet <kent.overstreet@linux.dev>
Sun, 22 Oct 2023 21:08:48 +0000 (17:08 -0400)
We can't run journal reclaim until we've finished replaying updates to
interior btree nodes - the check for this was in the wrong place though,
leading to journal reclaim spinning before it was allowed to proceed.

Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
fs/bcachefs/journal_reclaim.c
fs/bcachefs/recovery.c

index 9f0d2e6..c20f6de 100644 (file)
@@ -609,6 +609,10 @@ static int bch2_journal_reclaim_thread(void *arg)
        struct journal *j = arg;
        unsigned long next;
 
+       set_freezable();
+
+       kthread_wait_freezable(test_bit(JOURNAL_RECLAIM_STARTED, &j->flags));
+
        while (!kthread_should_stop()) {
                j->reclaim_kicked = false;
 
@@ -627,6 +631,7 @@ static int bch2_journal_reclaim_thread(void *arg)
                        if (time_after_eq(jiffies, next))
                                break;
                        schedule_timeout(next - jiffies);
+                       try_to_freeze();
 
                }
                __set_current_state(TASK_RUNNING);
index 6750063..0b3521c 100644 (file)
@@ -616,6 +616,7 @@ static int bch2_journal_replay(struct bch_fs *c,
         */
        set_bit(BCH_FS_BTREE_INTERIOR_REPLAY_DONE, &c->flags);
        set_bit(JOURNAL_RECLAIM_STARTED, &j->flags);
+       journal_reclaim_kick(j);
 
        j->replay_journal_seq = seq;