• Jan Kara's avatar
    quota: Fix slow quotaoff · 869b6ea1
    Jan Kara authored
    Eric has reported that commit dabc8b20 ("quota: fix dqput() to
    follow the guarantees dquot_srcu should provide") heavily increases
    runtime of generic/270 xfstest for ext4 in nojournal mode. The reason
    for this is that ext4 in nojournal mode leaves dquots dirty until the last
    dqput() and thus the cleanup done in quota_release_workfn() has to write
    them all. Due to the way quota_release_workfn() is written this results
    in synchronize_srcu() call for each dirty dquot which makes the dquot
    cleanup when turning quotas off extremely slow.
    
    To be able to avoid synchronize_srcu() for each dirty dquot we need to
    rework how we track dquots to be cleaned up. Instead of keeping the last
    dquot reference while it is on releasing_dquots list, we drop it right
    away and mark the dquot with new DQ_RELEASING_B bit instead. This way we
    can we can remove dquot from releasing_dquots list when new reference to
    it is acquired and thus there's no need to call synchronize_srcu() each
    time we drop dq_list_lock.
    
    References: https://lore.kernel.org/all/ZRytn6CxFK2oECUt@debian-BULLSEYE-live-builder-AMD64Reported-by: default avatarEric Whitney <enwlinux@gmail.com>
    Fixes: dabc8b20 ("quota: fix dqput() to follow the guarantees dquot_srcu should provide")
    CC: stable@vger.kernel.org
    Signed-off-by: default avatarJan Kara <jack@suse.cz>
    869b6ea1
dquot.c 80 KB