diff options
| author | Jan Kara <jack@suse.cz> | 2026-02-27 14:22:16 +0100 |
|---|---|---|
| committer | Jan Kara <jack@suse.cz> | 2026-03-25 13:15:36 +0100 |
| commit | e93ab401da4b2e2c1b8ef2424de2f238d51c8b2d (patch) | |
| tree | c3b87682b75e4da6dea4aebcd109dee911c0b5dc /tools/testing/selftests/cgroup/lib/git@git.tavy.me:linux.git | |
| parent | 08841b06fa64d8edbd1a21ca6e613420c90cc4b8 (diff) | |
quota: Fix race of dquot_scan_active() with quota deactivation
dquot_scan_active() can race with quota deactivation in
quota_release_workfn() like:
CPU0 (quota_release_workfn) CPU1 (dquot_scan_active)
============================== ==============================
spin_lock(&dq_list_lock);
list_replace_init(
&releasing_dquots, &rls_head);
/* dquot X on rls_head,
dq_count == 0,
DQ_ACTIVE_B still set */
spin_unlock(&dq_list_lock);
synchronize_srcu(&dquot_srcu);
spin_lock(&dq_list_lock);
list_for_each_entry(dquot,
&inuse_list, dq_inuse) {
/* finds dquot X */
dquot_active(X) -> true
atomic_inc(&X->dq_count);
}
spin_unlock(&dq_list_lock);
spin_lock(&dq_list_lock);
dquot = list_first_entry(&rls_head);
WARN_ON_ONCE(atomic_read(&dquot->dq_count));
The problem is not only a cosmetic one as under memory pressure the
caller of dquot_scan_active() can end up working on freed dquot.
Fix the problem by making sure the dquot is removed from releasing list
when we acquire a reference to it.
Fixes: 869b6ea1609f ("quota: Fix slow quotaoff")
Reported-by: Sam Sun <samsun1006219@gmail.com>
Link: https://lore.kernel.org/all/CAEkJfYPTt3uP1vAYnQ5V2ZWn5O9PLhhGi5HbOcAzyP9vbXyjeg@mail.gmail.com
Signed-off-by: Jan Kara <jack@suse.cz>
Diffstat (limited to 'tools/testing/selftests/cgroup/lib/git@git.tavy.me:linux.git')
0 files changed, 0 insertions, 0 deletions
