• Chao Yu's avatar
    f2fs: fix to recover cold bit of inode block during POR · 56db43fd
    Chao Yu authored
    commit ef2a0071 upstream.
    
    Testcase to reproduce this bug:
    1. mkfs.f2fs /dev/sdd
    2. mount -t f2fs /dev/sdd /mnt/f2fs
    3. touch /mnt/f2fs/file
    4. sync
    5. chattr +A /mnt/f2fs/file
    6. xfs_io -f /mnt/f2fs/file -c "fsync"
    7. godown /mnt/f2fs
    8. umount /mnt/f2fs
    9. mount -t f2fs /dev/sdd /mnt/f2fs
    10. chattr -A /mnt/f2fs/file
    11. xfs_io -f /mnt/f2fs/file -c "fsync"
    12. umount /mnt/f2fs
    13. mount -t f2fs /dev/sdd /mnt/f2fs
    14. lsattr /mnt/f2fs/file
    
    -----------------N- /mnt/f2fs/file
    
    But actually, we expect the corrct result is:
    
    -------A---------N- /mnt/f2fs/file
    
    The reason is in step 9) we missed to recover cold bit flag in inode
    block, so later, in fsync, we will skip write inode block due to below
    condition check, result in lossing data in another SPOR.
    
    f2fs_fsync_node_pages()
    	if (!IS_DNODE(page) || !is_cold_node(page))
    		continue;
    
    Note that, I guess that some non-dir inode has already lost cold bit
    during POR, so in order to reenable recovery for those inode, let's
    try to recover cold bit in f2fs_iget() to save more fsynced data.
    
    Fixes: c5667575 ("f2fs: remove unneeded set_cold_node()")
    Cc: <stable@vger.kernel.org> 4.17+
    Signed-off-by: default avatarChao Yu <yuchao0@huawei.com>
    Signed-off-by: default avatarJaegeuk Kim <jaegeuk@kernel.org>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    56db43fd
node.c 74.8 KB