• Sahitya Tummala's avatar
    f2fs: fix the panic in do_checkpoint() · bf22c3cc
    Sahitya Tummala authored
    There could be a scenario where f2fs_sync_meta_pages() will not
    ensure that all F2FS_DIRTY_META pages are submitted for IO. Thus,
    resulting in the below panic in do_checkpoint() -
    
    f2fs_bug_on(sbi, get_pages(sbi, F2FS_DIRTY_META) &&
    				!f2fs_cp_error(sbi));
    
    This can happen in a low-memory condition, where shrinker could
    also be doing the writepage operation (stack shown below)
    at the same time when checkpoint is running on another core.
    
    schedule
    down_write
    f2fs_submit_page_write -> by this time, this page in page cache is tagged
    			as PAGECACHE_TAG_WRITEBACK and PAGECACHE_TAG_DIRTY
    			is cleared, due to which f2fs_sync_meta_pages()
    			cannot sync this page in do_checkpoint() path.
    f2fs_do_write_meta_page
    __f2fs_write_meta_page
    f2fs_write_meta_page
    shrink_page_list
    shrink_inactive_list
    shrink_node_memcg
    shrink_node
    kswapd
    Signed-off-by: default avatarSahitya Tummala <stummala@codeaurora.org>
    Reviewed-by: default avatarChao Yu <yuchao0@huawei.com>
    Signed-off-by: default avatarJaegeuk Kim <jaegeuk@kernel.org>
    bf22c3cc
checkpoint.c 40.7 KB