• Yi Chen's avatar
    f2fs: fix to avoid NULL pointer dereference · 594b6d04
    Yi Chen authored
    
    
    Unable to handle kernel NULL pointer dereference at virtual address 0000000000000000
    pc : f2fs_put_page+0x1c/0x26c
    lr : __revoke_inmem_pages+0x544/0x75c
    f2fs_put_page+0x1c/0x26c
    __revoke_inmem_pages+0x544/0x75c
    __f2fs_commit_inmem_pages+0x364/0x3c0
    f2fs_commit_inmem_pages+0xc8/0x1a0
    f2fs_ioc_commit_atomic_write+0xa4/0x15c
    f2fs_ioctl+0x5b0/0x1574
    file_ioctl+0x154/0x320
    do_vfs_ioctl+0x164/0x740
    __arm64_sys_ioctl+0x78/0xa4
    el0_svc_common+0xbc/0x1d0
    el0_svc_handler+0x74/0x98
    el0_svc+0x8/0xc
    
    In f2fs_put_page, we access page->mapping is NULL.
    The root cause is:
    In some cases, the page refcount and ATOMIC_WRITTEN_PAGE
    flag miss set for page-priavte flag has been set.
    We add f2fs_bug_on like this:
    
    f2fs_register_inmem_page()
    {
    	...
    	f2fs_set_page_private(page, ATOMIC_WRITTEN_PAGE);
    
    	f2fs_bug_on(F2FS_I_SB(inode), !IS_ATOMIC_WRITTEN_PAGE(page));
    	...
    }
    
    The bug on stack follow link this:
    PC is at f2fs_register_inmem_page+0x238/0x2b4
    LR is at f2fs_register_inmem_page+0x2a8/0x2b4
    f2fs_register_inmem_page+0x238/0x2b4
    f2fs_set_data_page_dirty+0x104/0x164
    set_page_dirty+0x78/0xc8
    f2fs_write_end+0x1b4/0x444
    generic_perform_write+0x144/0x1cc
    __generic_file_write_iter+0xc4/0x174
    f2fs_file_write_iter+0x2c0/0x350
    __vfs_write+0x104/0x134
    vfs_write+0xe8/0x19c
    SyS_pwrite64+0x78/0xb8
    
    To fix this issue, let's add page refcount add page-priavte flag.
    The page-private flag is not cleared and needs further analysis.
    Signed-off-by: default avatarChao Yu <yuchao0@huawei.com>
    Signed-off-by: default avatarGe Qiu <qiuge@huawei.com>
    Signed-off-by: default avatarDehe Gu <gudehe@huawei.com>
    Signed-off-by: default avatarYi Chen <chenyi77@huawei.com>
    Signed-off-by: default avatarJaegeuk Kim <jaegeuk@kernel.org>
    594b6d04
segment.c 136 KB