aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/fs/bcachefs/super.c
diff options
context:
space:
mode:
authorJeongjun Park <aha310510@gmail.com>2025-02-02 15:13:51 +0900
committerKent Overstreet <kent.overstreet@linux.dev>2025-02-06 22:35:11 -0500
commit2ef995df0ce592f665d312008dbe1ad1c4bcf87f (patch)
treef24aa732b4218060fa97083c54967d8fe323acd9 /fs/bcachefs/super.c
parentbcachefs: fix incorrect pointer check in __bch2_subvolume_delete() (diff)
downloadwireguard-linux-2ef995df0ce592f665d312008dbe1ad1c4bcf87f.tar.xz
wireguard-linux-2ef995df0ce592f665d312008dbe1ad1c4bcf87f.zip
bcachefs: fix deadlock in journal_entry_open()
In the previous commit b3d82c2f2761, code was added to prevent journal sequence overflow. Among them, the code added to journal_entry_open() uses the bch2_fs_fatal_err_on() function to handle errors. However, __journal_res_get() , which calls journal_entry_open() , calls journal_entry_open() while holding journal->lock , but bch2_fs_fatal_err_on() internally tries to acquire journal->lock , which results in a deadlock. So we need to add a locked helper to handle fatal errors even when the journal->lock is held. Fixes: b3d82c2f2761 ("bcachefs: Guard against journal seq overflow") Signed-off-by: Jeongjun Park <aha310510@gmail.com> Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
Diffstat (limited to 'fs/bcachefs/super.c')
-rw-r--r--fs/bcachefs/super.c11
1 files changed, 11 insertions, 0 deletions
diff --git a/fs/bcachefs/super.c b/fs/bcachefs/super.c
index d97ea7bd1171..6d97d412fed9 100644
--- a/fs/bcachefs/super.c
+++ b/fs/bcachefs/super.c
@@ -411,6 +411,17 @@ bool bch2_fs_emergency_read_only(struct bch_fs *c)
return ret;
}
+bool bch2_fs_emergency_read_only_locked(struct bch_fs *c)
+{
+ bool ret = !test_and_set_bit(BCH_FS_emergency_ro, &c->flags);
+
+ bch2_journal_halt_locked(&c->journal);
+ bch2_fs_read_only_async(c);
+
+ wake_up(&bch2_read_only_wait);
+ return ret;
+}
+
static int bch2_fs_read_write_late(struct bch_fs *c)
{
int ret;