summaryrefslogtreecommitdiff
path: root/fs/bcachefs/journal_reclaim.c
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@gmail.com>2021-04-29 05:12:07 +0300
committerKent Overstreet <kent.overstreet@linux.dev>2023-10-23 00:09:02 +0300
commit2ce867df3161886cfc6baf54aa9ef53f2281cdee (patch)
treef697ed2cb9bc3791e11629154f8582f0f7c8c016 /fs/bcachefs/journal_reclaim.c
parent050197b1c1df1cfee84523bf2183c8674e06d10f (diff)
downloadlinux-2ce867df3161886cfc6baf54aa9ef53f2281cdee.tar.xz
bcachefs: Make sure to initialize j->last_flushed
If the journal reclaim thread makes it to the timeout without ever initializing j->last_flushed, we could end up sleeping for a very long time. Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com> Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
Diffstat (limited to 'fs/bcachefs/journal_reclaim.c')
-rw-r--r--fs/bcachefs/journal_reclaim.c18
1 files changed, 12 insertions, 6 deletions
diff --git a/fs/bcachefs/journal_reclaim.c b/fs/bcachefs/journal_reclaim.c
index 416f8611f008..812620d3de31 100644
--- a/fs/bcachefs/journal_reclaim.c
+++ b/fs/bcachefs/journal_reclaim.c
@@ -677,13 +677,15 @@ int bch2_journal_reclaim(struct journal *j)
static int bch2_journal_reclaim_thread(void *arg)
{
struct journal *j = arg;
- unsigned long next;
+ unsigned long delay, now;
int ret = 0;
set_freezable();
kthread_wait_freezable(test_bit(JOURNAL_RECLAIM_STARTED, &j->flags));
+ j->last_flushed = jiffies;
+
while (!ret && !kthread_should_stop()) {
j->reclaim_kicked = false;
@@ -691,18 +693,22 @@ static int bch2_journal_reclaim_thread(void *arg)
ret = __bch2_journal_reclaim(j, false);
mutex_unlock(&j->reclaim_lock);
- next = j->last_flushed + msecs_to_jiffies(j->reclaim_delay_ms);
+ now = jiffies;
+ delay = msecs_to_jiffies(j->reclaim_delay_ms);
+ j->next_reclaim = j->last_flushed + delay;
+
+ if (!time_in_range(j->next_reclaim, now, now + delay))
+ j->next_reclaim = now + delay;
while (1) {
- set_current_state(TASK_INTERRUPTIBLE);
+ set_current_state(TASK_INTERRUPTIBLE|TASK_FREEZABLE);
if (kthread_should_stop())
break;
if (j->reclaim_kicked)
break;
- if (time_after_eq(jiffies, next))
+ if (time_after_eq(jiffies, j->next_reclaim))
break;
- schedule_timeout(next - jiffies);
- try_to_freeze();
+ schedule_timeout(j->next_reclaim - jiffies);
}
__set_current_state(TASK_RUNNING);