From: syzbot <syzbot+cb91f22d8a581fc19edf@syzkaller.appspotmail.com>
To: linux-kernel@vger.kernel.org, syzkaller-bugs@googlegroups.com
Subject: Forwarded: [PATCH] bcachefs: Fix deadlock between fallocate and readahead
Date: Fri, 26 Sep 2025 23:53:57 -0700 [thread overview]
Message-ID: <68d78a05.050a0220.25d7ab.0286.GAE@google.com> (raw)
In-Reply-To: <68cb3c24.050a0220.50883.0029.GAE@google.com>
For archival purposes, forwarding an incoming command email to
linux-kernel@vger.kernel.org, syzkaller-bugs@googlegroups.com.
***
Subject: [PATCH] bcachefs: Fix deadlock between fallocate and readahead
Author: kartikey406@gmail.com
#syz test: git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git master
There is an ABBA deadlock between fallocate and readahead operations:
Thread 1 (fallocate):
bch2_fallocate_dispatch
inode_lock(&inode->v)
bch2_pagecache_block_get(inode) // Acquires two_state_lock
__bchfs_fallocate
bch2_clamp_data_hole
bch2_seek_pagecache_hole
__filemap_get_folio
folio_lock() // BLOCKS - Thread 2 holds it
Thread 2 (readahead via copy_file_range):
bch2_readahead
folio_lock() // Holds page lock
__bch2_two_state_lock(&pagecache_lock) // BLOCKS - Thread 1 holds it
The issue is that drop_locks_do() only releases btree transaction locks,
but Thread 2 is blocked waiting for the two_state_lock (pagecache_block)
held by bch2_pagecache_block_get().
Fix by explicitly releasing and re-acquiring the pagecache_block lock
around the blocking bch2_clamp_data_hole() call, following the same
pattern used in bch2_page_fault(). Force a transaction restart after
lock release to ensure consistency.
Reported-by: syzbot+cb91f22d8a581fc19edf@syzkaller.appspotmail.com
Link: https://syzkaller.appspot.com/bug?extid=cb91f22d8a581fc19edf
Signed-off-by: Deepanshu Kartikey <Kartikey406@gmail.com>
---
fs/bcachefs/fs-io.c | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/fs/bcachefs/fs-io.c b/fs/bcachefs/fs-io.c
index a233f45875e9..04f76d141b17 100644
--- a/fs/bcachefs/fs-io.c
+++ b/fs/bcachefs/fs-io.c
@@ -694,13 +694,19 @@ static noinline int __bchfs_fallocate(struct bch_inode_info *inode, int mode,
&hole_start,
&hole_end,
opts.data_replicas, true)) {
+ /* Release pagecache_block to prevent deadlock with readahead */
+ bch2_pagecache_block_put(inode);
ret = drop_locks_do(trans,
(bch2_clamp_data_hole(&inode->v,
&hole_start,
&hole_end,
opts.data_replicas, false), 0));
+ bch2_pagecache_block_get(inode);
if (ret)
goto bkey_err;
+ /* Force transaction restart to revalidate state */
+ ret = -BCH_ERR_transaction_restart;
+ goto bkey_err;
}
bch2_btree_iter_set_pos(trans, &iter, POS(iter.pos.inode, hole_start));
--
2.43.0
next prev parent reply other threads:[~2025-09-27 6:53 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-09-17 22:54 [syzbot] [bcachefs?] INFO: task hung in bch2_seek_pagecache_hole (3) syzbot
2025-09-27 6:53 ` Forwarded: [PATCH] bcachefs: Fix deadlock between fallocate and readahead syzbot
2025-09-27 6:53 ` syzbot [this message]
2025-09-27 7:25 ` Forwarded: [PATCH] bcachefs: Fix deadlocks " syzbot
2025-09-27 7:25 ` syzbot
2025-10-25 3:55 ` [syzbot] [bcachefs?] INFO: task hung in bch2_seek_pagecache_hole (3) syzbot
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=68d78a05.050a0220.25d7ab.0286.GAE@google.com \
--to=syzbot+cb91f22d8a581fc19edf@syzkaller.appspotmail.com \
--cc=linux-kernel@vger.kernel.org \
--cc=syzkaller-bugs@googlegroups.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.