• Chao Yu's avatar
    f2fs: quota: fix potential deadlock · a5c00422
    Chao Yu authored
    As Yi Zhuang reported in bugzilla:
    
    https://bugzilla.kernel.org/show_bug.cgi?id=214299
    
    There is potential deadlock during quota data flush as below:
    
    Thread A:			Thread B:
    f2fs_dquot_acquire
    down_read(&sbi->quota_sem)
    				f2fs_write_checkpoint
    				block_operations
    				f2fs_look_all
    				down_write(&sbi->cp_rwsem)
    f2fs_quota_write
    f2fs_write_begin
    __do_map_lock
    f2fs_lock_op
    down_read(&sbi->cp_rwsem)
    				__need_flush_qutoa
    				down_write(&sbi->quota_sem)
    
    This patch changes block_operations() to use trylock, if it fails,
    it means there is potential quota data updater, in this condition,
    let's flush quota data first and then trylock again to check dirty
    status of quota data.
    
    The side effect is: in heavy race condition (e.g. multi quota data
    upaters vs quota data flusher), it may decrease the probability of
    synchronizing quota data successfully in checkpoint() due to limited
    retry time of quota flush.
    Reported-by: default avatarYi Zhuang <zhuangyi1@huawei.com>
    Signed-off-by: default avatarChao Yu <chao@kernel.org>
    Signed-off-by: default avatarJaegeuk Kim <jaegeuk@kernel.org>
    a5c00422
checkpoint.c 46.8 KB