• Chao Yu's avatar
    f2fs: fix to clear dirty inode in f2fs_evict_inode() · f2db7105
    Chao Yu authored
    As Yanming reported in bugzilla:
    
    https://bugzilla.kernel.org/show_bug.cgi?id=215904
    
    The kernel message is shown below:
    
    kernel BUG at fs/f2fs/inode.c:825!
    Call Trace:
     evict+0x282/0x4e0
     __dentry_kill+0x2b2/0x4d0
     shrink_dentry_list+0x17c/0x4f0
     shrink_dcache_parent+0x143/0x1e0
     do_one_tree+0x9/0x30
     shrink_dcache_for_umount+0x51/0x120
     generic_shutdown_super+0x5c/0x3a0
     kill_block_super+0x90/0xd0
     kill_f2fs_super+0x225/0x310
     deactivate_locked_super+0x78/0xc0
     cleanup_mnt+0x2b7/0x480
     task_work_run+0xc8/0x150
     exit_to_user_mode_prepare+0x14a/0x150
     syscall_exit_to_user_mode+0x1d/0x40
     do_syscall_64+0x48/0x90
    
    The root cause is: inode node and dnode node share the same nid,
    so during f2fs_evict_inode(), dnode node truncation will invalidate
    its NAT entry, so when truncating inode node, it fails due to
    invalid NAT entry, result in inode is still marked as dirty, fix
    this issue by clearing dirty for inode and setting SBI_NEED_FSCK
    flag in filesystem.
    
    output from dump.f2fs:
    [print_node_info: 354] Node ID [0xf:15] is inode
    i_nid[0]                      		[0x       f : 15]
    
    Cc: stable@vger.kernel.org
    Reported-by: default avatarMing Yan <yanming@tju.edu.cn>
    Signed-off-by: default avatarChao Yu <chao.yu@oppo.com>
    Signed-off-by: default avatarJaegeuk Kim <jaegeuk@kernel.org>
    f2db7105
inode.c 26 KB