• Chao Yu's avatar
    f2fs: fix to avoid REQ_TIME and CP_TIME collision · 493720a4
    Chao Yu authored
    Lei Li reported a issue: if foreground operations are frequent, background
    checkpoint may be always skipped due to below check, result in losing more
    data after sudden power-cut.
    
    f2fs_balance_fs_bg()
    ...
    	if (!is_idle(sbi, REQ_TIME) &&
    		(!excess_dirty_nats(sbi) && !excess_dirty_nodes(sbi)))
    		return;
    
    E.g:
    cp_interval = 5 second
    idle_interval = 2 second
    foreground operation interval = 1 second (append 1 byte per second into file)
    
    In such case, no matter when it calls f2fs_balance_fs_bg(), is_idle(, REQ_TIME)
    returns false, result in skipping background checkpoint.
    
    This patch changes as below to make trigger condition being more reasonable:
    - trigger sync_fs() if dirty_{nats,nodes} and prefree segs exceeds threshold;
    - skip triggering sync_fs() if there is any background inflight IO or there is
    foreground operation recently and meanwhile cp_rwsem is being held by someone;
    Reported-by: default avatarLei Li <noctis.akm@gmail.com>
    Signed-off-by: default avatarChao Yu <yuchao0@huawei.com>
    Signed-off-by: default avatarJaegeuk Kim <jaegeuk@kernel.org>
    493720a4
segment.c 134 KB