• Chao Yu's avatar
    f2fs: fix fdatasync · 281518c6
    Chao Yu authored
    For below two cases, we can't guarantee data consistence:
    
    a)
    1. xfs_io "pwrite 0 4195328" "fsync"
    2. xfs_io "pwrite 4195328 1024" "fdatasync"
    3. godown
    4. umount & mount
    --> isize we updated before fdatasync won't be recovered
    
    b)
    1. xfs_io "pwrite -S 0xcc 0 4202496" "fsync"
    2. xfs_io "fpunch 4194304 4096" "fdatasync"
    3. godown
    4. umount & mount
    --> dnode we punched before fdatasync won't be recovered
    
    The reason is that normally fdatasync won't be aware of modification
    of metadata in file, e.g. isize changing, dnode updating, so in ->fsync
    we will skip flushing node pages for above cases, result in making
    fdatasynced file being lost during recovery.
    
    Currently we have introduced DIRTY_META global list in sbi for tracking
    dirty inode selectively, so in fdatasync we can choose to flush nodes
    depend on dirty state of current inode in the list.
    Signed-off-by: default avatarChao Yu <yuchao0@huawei.com>
    Signed-off-by: default avatarJaegeuk Kim <jaegeuk@kernel.org>
    281518c6
file.c 52.7 KB