• Yunlei He's avatar
    f2fs: fix an infinite loop when flush nodes in cp · d40a43af
    Yunlei He authored
    Thread A			Thread B
    
    - write_checkpoint
     - block_operations
       -blk_start_plug
        -sync_node_pages		- f2fs_do_sync_file
    				 - fsync_node_pages
    				  - f2fs_wait_on_page_writeback
    
    Thread A wait for global F2FS_DIRTY_NODES decreased to zero,
    it start a plug list, some requests have been added to this list.
    Thread B lock one dirty node page, and wait this page write back.
    But this page has been in plug list of thread A with PG_writeback flag.
    Thread A keep on running and its plug list has no chance to finish,
    so it seems a deadlock between cp and fsync path.
    
    This patch add a wait on page write back before set node page dirty
    to avoid this problem.
    Signed-off-by: default avatarYunlei He <heyunlei@huawei.com>
    Signed-off-by: default avatarPengyang Hou <houpengyang@huawei.com>
    Reviewed-by: default avatarChao Yu <yuchao0@huawei.com>
    Signed-off-by: default avatarJaegeuk Kim <jaegeuk@kernel.org>
    d40a43af
node.c 57.9 KB