diff options
author | Kent Overstreet <kent.overstreet@gmail.com> | 2022-03-05 13:38:54 -0500 |
---|---|---|
committer | Kent Overstreet <kent.overstreet@linux.dev> | 2023-10-22 17:09:27 -0400 |
commit | b60c380bca5458be9e4c0ff77289f0979fbbb52f (patch) | |
tree | e4435580b66a62836595cd65e23a2f953618c8ec /fs/bcachefs/journal.c | |
parent | 5521b1dfa20262a9cb8d1214c095c9ca2a4cb127 (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.c | 10 |
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, |