summaryrefslogtreecommitdiff
path: root/fs/bcachefs/journal.c
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@gmail.com>2022-03-05 13:38:54 -0500
committerKent Overstreet <kent.overstreet@linux.dev>2023-10-22 17:09:27 -0400
commitb60c380bca5458be9e4c0ff77289f0979fbbb52f (patch)
treee4435580b66a62836595cd65e23a2f953618c8ec /fs/bcachefs/journal.c
parent5521b1dfa20262a9cb8d1214c095c9ca2a4cb127 (diff)
bcachefs: Don't arm journal->write_work when journal entry !open
This fixes a shutdown race where we were rearming journal->write_work after the journal has already shut down. Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
Diffstat (limited to 'fs/bcachefs/journal.c')
-rw-r--r--fs/bcachefs/journal.c10
1 files changed, 6 insertions, 4 deletions
diff --git a/fs/bcachefs/journal.c b/fs/bcachefs/journal.c
index 9df600d55da0..1c43ec1d4f6c 100644
--- a/fs/bcachefs/journal.c
+++ b/fs/bcachefs/journal.c
@@ -309,17 +309,19 @@ static void journal_write_work(struct work_struct *work)
{
struct journal *j = container_of(work, struct journal, write_work.work);
struct bch_fs *c = container_of(j, struct bch_fs, journal);
- struct journal_buf *buf;
long delta;
spin_lock(&j->lock);
- buf = journal_cur_buf(j);
- delta = buf->expires - jiffies;
+ if (!__journal_entry_is_open(j->reservations))
+ goto unlock;
+
+ delta = journal_cur_buf(j)->expires - jiffies;
if (delta > 0)
mod_delayed_work(c->io_complete_wq, &j->write_work, delta);
else
__journal_entry_close(j, JOURNAL_ENTRY_CLOSED_VAL);
+unlock:
spin_unlock(&j->lock);
}
@@ -939,6 +941,7 @@ void bch2_dev_journal_stop(struct journal *j, struct bch_dev *ca)
void bch2_fs_journal_stop(struct journal *j)
{
+ bch2_journal_reclaim_stop(j);
bch2_journal_flush_all_pins(j);
wait_event(j->wait, journal_entry_close(j));
@@ -956,7 +959,6 @@ void bch2_fs_journal_stop(struct journal *j)
j->last_empty_seq != journal_cur_seq(j));
cancel_delayed_work_sync(&j->write_work);
- bch2_journal_reclaim_stop(j);
}
int bch2_fs_journal_start(struct journal *j, u64 cur_seq,