• Chao Yu's avatar
    f2fs: fix deadloop in foreground GC · cfd66bb7
    Chao Yu authored
    As Yanming reported in bugzilla:
    
    https://bugzilla.kernel.org/show_bug.cgi?id=215914
    
    The root cause is: in a very small sized image, it's very easy to
    exceed threshold of foreground GC, if we calculate free space and
    dirty data based on section granularity, in corner case,
    has_not_enough_free_secs() will always return true, result in
    deadloop in f2fs_gc().
    
    So this patch refactors has_not_enough_free_secs() as below to fix
    this issue:
    1. calculate needed space based on block granularity, and separate
    all blocks to two parts, section part, and block part, comparing
    section part to free section, and comparing block part to free space
    in openned log.
    2. account F2FS_DIRTY_NODES, F2FS_DIRTY_IMETA and F2FS_DIRTY_DENTS
    as node block consumer;
    3. account F2FS_DIRTY_DENTS as data block consumer;
    
    Cc: stable@vger.kernel.org
    Reported-by: default avatarMing Yan <yanming@tju.edu.cn>
    Signed-off-by: default avatarChao Yu <chao.yu@oppo.com>
    Signed-off-by: default avatarJaegeuk Kim <jaegeuk@kernel.org>
    cfd66bb7
segment.h 28.3 KB