Skip to content

Commit 8301c71

Browse files
konistorvalds
authored andcommitted
nilfs2: fix null pointer dereference at nilfs_segctor_do_construct()
After commit c3aab9a ("mm/filemap.c: don't initiate writeback if mapping has no dirty pages"), the following null pointer dereference has been reported on nilfs2: BUG: kernel NULL pointer dereference, address: 00000000000000a8 #PF: supervisor read access in kernel mode #PF: error_code(0x0000) - not-present page PGD 0 P4D 0 Oops: 0000 [#1] SMP PTI ... RIP: 0010:percpu_counter_add_batch+0xa/0x60 ... Call Trace: __test_set_page_writeback+0x2d3/0x330 nilfs_segctor_do_construct+0x10d3/0x2110 [nilfs2] nilfs_segctor_construct+0x168/0x260 [nilfs2] nilfs_segctor_thread+0x127/0x3b0 [nilfs2] kthread+0xf8/0x130 ... This crash turned out to be caused by set_page_writeback() call for segment summary buffers at nilfs_segctor_prepare_write(). set_page_writeback() can call inc_wb_stat(inode_to_wb(inode), WB_WRITEBACK) where inode_to_wb(inode) is NULL if the inode of underlying block device does not have an associated wb. This fixes the issue by calling inode_attach_wb() in advance to ensure to associate the bdev inode with its wb. Fixes: c3aab9a ("mm/filemap.c: don't initiate writeback if mapping has no dirty pages") Reported-by: Walton Hoops <[email protected]> Reported-by: Tomas Hlavaty <[email protected]> Reported-by: ARAI Shun-ichi <[email protected]> Reported-by: Hideki EIRAKU <[email protected]> Signed-off-by: Ryusuke Konishi <[email protected]> Signed-off-by: Andrew Morton <[email protected]> Tested-by: Ryusuke Konishi <[email protected]> Cc: <[email protected]> [5.4+] Link: http://lkml.kernel.org/r/[email protected] Signed-off-by: Linus Torvalds <[email protected]>
1 parent e8ec049 commit 8301c71

File tree

1 file changed

+2
-0
lines changed

1 file changed

+2
-0
lines changed

fs/nilfs2/segment.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2780,6 +2780,8 @@ int nilfs_attach_log_writer(struct super_block *sb, struct nilfs_root *root)
27802780
if (!nilfs->ns_writer)
27812781
return -ENOMEM;
27822782

2783+
inode_attach_wb(nilfs->ns_bdev->bd_inode, NULL);
2784+
27832785
err = nilfs_segctor_start_thread(nilfs->ns_writer);
27842786
if (err) {
27852787
kfree(nilfs->ns_writer);

0 commit comments

Comments
 (0)