From b05c0e9370bec71c62df690250f451e58e8ed2a4 Mon Sep 17 00:00:00 2001 From: Kent Overstreet Date: Thu, 2 Nov 2023 21:06:52 -0400 Subject: bcachefs: journal->buf_lock Add a new lock for synchronizing between journal IO path and btree write buffer flush. Signed-off-by: Kent Overstreet --- fs/bcachefs/journal.c | 1 + fs/bcachefs/journal_io.c | 2 ++ fs/bcachefs/journal_types.h | 6 ++++++ 3 files changed, 9 insertions(+) diff --git a/fs/bcachefs/journal.c b/fs/bcachefs/journal.c index fb983061af4a..6d56a71243bd 100644 --- a/fs/bcachefs/journal.c +++ b/fs/bcachefs/journal.c @@ -1219,6 +1219,7 @@ int bch2_fs_journal_init(struct journal *j) static struct lock_class_key res_key; unsigned i; + mutex_init(&j->buf_lock); spin_lock_init(&j->lock); spin_lock_init(&j->err_lock); init_waitqueue_head(&j->wait); diff --git a/fs/bcachefs/journal_io.c b/fs/bcachefs/journal_io.c index f2e038116b0f..afcb2a435956 100644 --- a/fs/bcachefs/journal_io.c +++ b/fs/bcachefs/journal_io.c @@ -1885,9 +1885,11 @@ CLOSURE_CALLBACK(bch2_journal_write) if (ret) goto err; + mutex_lock(&j->buf_lock); journal_buf_realloc(j, w); ret = bch2_journal_write_prep(j, w); + mutex_unlock(&j->buf_lock); if (ret) goto err; diff --git a/fs/bcachefs/journal_types.h b/fs/bcachefs/journal_types.h index 4ffae252e01e..5c8d3a8ec4df 100644 --- a/fs/bcachefs/journal_types.h +++ b/fs/bcachefs/journal_types.h @@ -181,6 +181,12 @@ struct journal { */ darray_u64 early_journal_entries; + /* + * Protects journal_buf->data, when accessing without a jorunal + * reservation: for synchronization between the btree write buffer code + * and the journal write path: + */ + struct mutex buf_lock; /* * Two journal entries -- one is currently open for new entries, the * other is possibly being written out. -- cgit v1.2.3-70-g09d2