summaryrefslogtreecommitdiff
path: root/tools/testing/selftests/cgroup/lib/git@git.tavy.me:linux.git
diff options
context:
space:
mode:
authorJan Kara <jack@suse.cz>2026-02-27 14:22:16 +0100
committerJan Kara <jack@suse.cz>2026-03-25 13:15:36 +0100
commite93ab401da4b2e2c1b8ef2424de2f238d51c8b2d (patch)
treec3b87682b75e4da6dea4aebcd109dee911c0b5dc /tools/testing/selftests/cgroup/lib/git@git.tavy.me:linux.git
parent08841b06fa64d8edbd1a21ca6e613420c90cc4b8 (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