* [PATCH 4.19 5.4 5.10 5.15 6.1 6.6] nilfs2: fix potential kernel bug due to lack of writeback flag waiting
@ 2024-06-16 18:17 Ryusuke Konishi
2024-06-19 8:52 ` Greg Kroah-Hartman
0 siblings, 1 reply; 2+ messages in thread
From: Ryusuke Konishi @ 2024-06-16 18:17 UTC (permalink / raw)
To: stable, Greg Kroah-Hartman; +Cc: Andrew Morton
commit a4ca369ca221bb7e06c725792ac107f0e48e82e7 upstream.
Destructive writes to a block device on which nilfs2 is mounted can cause
a kernel bug in the folio/page writeback start routine or writeback end
routine (__folio_start_writeback in the log below):
kernel BUG at mm/page-writeback.c:3070!
Oops: invalid opcode: 0000 [#1] PREEMPT SMP KASAN PTI
...
RIP: 0010:__folio_start_writeback+0xbaa/0x10e0
Code: 25 ff 0f 00 00 0f 84 18 01 00 00 e8 40 ca c6 ff e9 17 f6 ff ff
e8 36 ca c6 ff 4c 89 f7 48 c7 c6 80 c0 12 84 e8 e7 b3 0f 00 90 <0f>
0b e8 1f ca c6 ff 4c 89 f7 48 c7 c6 a0 c6 12 84 e8 d0 b3 0f 00
...
Call Trace:
<TASK>
nilfs_segctor_do_construct+0x4654/0x69d0 [nilfs2]
nilfs_segctor_construct+0x181/0x6b0 [nilfs2]
nilfs_segctor_thread+0x548/0x11c0 [nilfs2]
kthread+0x2f0/0x390
ret_from_fork+0x4b/0x80
ret_from_fork_asm+0x1a/0x30
</TASK>
This is because when the log writer starts a writeback for segment summary
blocks or a super root block that use the backing device's page cache, it
does not wait for the ongoing folio/page writeback, resulting in an
inconsistent writeback state.
Fix this issue by waiting for ongoing writebacks when putting
folios/pages on the backing device into writeback state.
Link: https://lkml.kernel.org/r/20240530141556.4411-1-konishi.ryusuke@gmail.com
Fixes: 9ff05123e3bf ("nilfs2: segment constructor")
Signed-off-by: Ryusuke Konishi <konishi.ryusuke@gmail.com>
Tested-by: Ryusuke Konishi <konishi.ryusuke@gmail.com>
Cc: <stable@vger.kernel.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
---
Please apply this patch to the stable trees indicated by the subject
prefix instead of the patch that failed.
This patch is tailored to account for page/folio conversion and can
be applied to v6.7 and earlier.
Also, all the builds and tests I did on each stable tree passed.
Thanks,
Ryusuke Konishi
fs/nilfs2/segment.c | 3 +++
1 file changed, 3 insertions(+)
diff --git a/fs/nilfs2/segment.c b/fs/nilfs2/segment.c
index 2d74fb229799..5783efafbabd 100644
--- a/fs/nilfs2/segment.c
+++ b/fs/nilfs2/segment.c
@@ -1694,6 +1694,7 @@ static void nilfs_segctor_prepare_write(struct nilfs_sc_info *sci)
if (bh->b_page != bd_page) {
if (bd_page) {
lock_page(bd_page);
+ wait_on_page_writeback(bd_page);
clear_page_dirty_for_io(bd_page);
set_page_writeback(bd_page);
unlock_page(bd_page);
@@ -1707,6 +1708,7 @@ static void nilfs_segctor_prepare_write(struct nilfs_sc_info *sci)
if (bh == segbuf->sb_super_root) {
if (bh->b_page != bd_page) {
lock_page(bd_page);
+ wait_on_page_writeback(bd_page);
clear_page_dirty_for_io(bd_page);
set_page_writeback(bd_page);
unlock_page(bd_page);
@@ -1723,6 +1725,7 @@ static void nilfs_segctor_prepare_write(struct nilfs_sc_info *sci)
}
if (bd_page) {
lock_page(bd_page);
+ wait_on_page_writeback(bd_page);
clear_page_dirty_for_io(bd_page);
set_page_writeback(bd_page);
unlock_page(bd_page);
--
2.43.0
^ permalink raw reply related [flat|nested] 2+ messages in thread* Re: [PATCH 4.19 5.4 5.10 5.15 6.1 6.6] nilfs2: fix potential kernel bug due to lack of writeback flag waiting
2024-06-16 18:17 [PATCH 4.19 5.4 5.10 5.15 6.1 6.6] nilfs2: fix potential kernel bug due to lack of writeback flag waiting Ryusuke Konishi
@ 2024-06-19 8:52 ` Greg Kroah-Hartman
0 siblings, 0 replies; 2+ messages in thread
From: Greg Kroah-Hartman @ 2024-06-19 8:52 UTC (permalink / raw)
To: Ryusuke Konishi; +Cc: stable, Andrew Morton
On Mon, Jun 17, 2024 at 03:17:29AM +0900, Ryusuke Konishi wrote:
> commit a4ca369ca221bb7e06c725792ac107f0e48e82e7 upstream.
>
> Destructive writes to a block device on which nilfs2 is mounted can cause
> a kernel bug in the folio/page writeback start routine or writeback end
> routine (__folio_start_writeback in the log below):
>
> kernel BUG at mm/page-writeback.c:3070!
> Oops: invalid opcode: 0000 [#1] PREEMPT SMP KASAN PTI
> ...
> RIP: 0010:__folio_start_writeback+0xbaa/0x10e0
> Code: 25 ff 0f 00 00 0f 84 18 01 00 00 e8 40 ca c6 ff e9 17 f6 ff ff
> e8 36 ca c6 ff 4c 89 f7 48 c7 c6 80 c0 12 84 e8 e7 b3 0f 00 90 <0f>
> 0b e8 1f ca c6 ff 4c 89 f7 48 c7 c6 a0 c6 12 84 e8 d0 b3 0f 00
> ...
> Call Trace:
> <TASK>
> nilfs_segctor_do_construct+0x4654/0x69d0 [nilfs2]
> nilfs_segctor_construct+0x181/0x6b0 [nilfs2]
> nilfs_segctor_thread+0x548/0x11c0 [nilfs2]
> kthread+0x2f0/0x390
> ret_from_fork+0x4b/0x80
> ret_from_fork_asm+0x1a/0x30
> </TASK>
>
> This is because when the log writer starts a writeback for segment summary
> blocks or a super root block that use the backing device's page cache, it
> does not wait for the ongoing folio/page writeback, resulting in an
> inconsistent writeback state.
>
> Fix this issue by waiting for ongoing writebacks when putting
> folios/pages on the backing device into writeback state.
>
> Link: https://lkml.kernel.org/r/20240530141556.4411-1-konishi.ryusuke@gmail.com
> Fixes: 9ff05123e3bf ("nilfs2: segment constructor")
> Signed-off-by: Ryusuke Konishi <konishi.ryusuke@gmail.com>
> Tested-by: Ryusuke Konishi <konishi.ryusuke@gmail.com>
> Cc: <stable@vger.kernel.org>
> Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
> ---
> Please apply this patch to the stable trees indicated by the subject
> prefix instead of the patch that failed.
>
> This patch is tailored to account for page/folio conversion and can
> be applied to v6.7 and earlier.
>
> Also, all the builds and tests I did on each stable tree passed.
Now queued up, thanks.
greg k-h
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2024-06-19 8:52 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-06-16 18:17 [PATCH 4.19 5.4 5.10 5.15 6.1 6.6] nilfs2: fix potential kernel bug due to lack of writeback flag waiting Ryusuke Konishi
2024-06-19 8:52 ` Greg Kroah-Hartman
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox