• Yunlei He's avatar
    f2fs: fix an error case of missing update inode page · 211a6fa0
    Yunlei He authored
    -Thread A                             Thread B
    
    -write_checkpoint
     -block_operations
      -f2fs_unlock_all                    -f2fs_sync_file
                                           -f2fs_write_inode
                                            -f2fs_inode_synced
        -f2fs_sync_inode_meta
         -sync_node_pages
                                            -set_page_drity
    
    In this case, if sudden power off without next new checkpoint,
    the last inode page update will lost. wb_writeback is same with
    fsync.
    
    Yunlei also reproduced the bug by:
    
    @@ -366,7 +366,7 @@ int update_inode(struct inode *inode, struct page *node_page)
            struct extent_tree *et = F2FS_I(inode)->extent_tree;
    
            f2fs_inode_synced(inode);
    -
    +       msleep(10000);
            f2fs_wait_on_page_writeback(node_page, NODE, true);
    
    shell 1:                                       shell2:
    
    dd if=/dev/zero of=./test bs=1M count=10
    sync
    echo "hello" >> ./test
    fsync test  // sleep 10s
                                                   sync //return quickly
    echo c > /proc/sysrq-trigger
    Signed-off-by: default avatarYunlei He <heyunlei@huawei.com>
    Signed-off-by: default avatarJaegeuk Kim <jaegeuk@kernel.org>
    211a6fa0
inode.c 16.5 KB