summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@gmail.com>2022-03-05 13:38:54 -0500
committerKent Overstreet <kent.overstreet@gmail.com>2022-03-12 20:14:10 -0500
commite4774eae58dd9c95ce44da0dc0f9869fdc42dde7 (patch)
tree6a469603679707ca065ec06cb1fd85222f08405d
parent96c3a0e0584ebc6762a4a40a8b23e985b5ac0833 (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>
-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 fb533ecc78f8..ded4b6800d4c 100644
--- a/fs/bcachefs/journal.c
+++ b/fs/bcachefs/journal.c
@@ -310,17 +310,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);
}
@@ -940,6 +942,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));
@@ -957,7 +960,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,