mirror of
https://github.com/torvalds/linux.git
synced 2024-12-24 11:51:27 +00:00
quota: Fix quota corruption with generic/232 test
Eric has reported that since commitd2faa41516
"quota: Do not acquire dqio_sem for dquot overwrites in v2 format" test generic/232 occasionally fails due to quota information being incorrect. Indeed that commit was too eager to remove dqio_sem completely from the path that just overwrites quota structure with updated information. Although that is innocent on its own, another process that inserts new quota structure to the same block can perform read-modify-write cycle of that block thus effectively discarding quota information update if they race in a wrong way. Fix the problem by acquiring dqio_sem for reading for overwrites of quota structure. Note that it *is* possible to completely avoid taking dqio_sem in the overwrite path however that will require modifying path inserting / deleting quota structures to avoid RMW cycles of the full block and for now it is not clear whether it is worth the hassle. Fixes:d2faa41516
Reported-and-tested-by: Eric Whitney <enwlinux@gmail.com> Signed-off-by: Jan Kara <jack@suse.cz>
This commit is contained in:
parent
0ab0b271bf
commit
4c6bb69663
@ -328,12 +328,16 @@ static int v2_write_dquot(struct dquot *dquot)
|
|||||||
if (!dquot->dq_off) {
|
if (!dquot->dq_off) {
|
||||||
alloc = true;
|
alloc = true;
|
||||||
down_write(&dqopt->dqio_sem);
|
down_write(&dqopt->dqio_sem);
|
||||||
|
} else {
|
||||||
|
down_read(&dqopt->dqio_sem);
|
||||||
}
|
}
|
||||||
ret = qtree_write_dquot(
|
ret = qtree_write_dquot(
|
||||||
sb_dqinfo(dquot->dq_sb, dquot->dq_id.type)->dqi_priv,
|
sb_dqinfo(dquot->dq_sb, dquot->dq_id.type)->dqi_priv,
|
||||||
dquot);
|
dquot);
|
||||||
if (alloc)
|
if (alloc)
|
||||||
up_write(&dqopt->dqio_sem);
|
up_write(&dqopt->dqio_sem);
|
||||||
|
else
|
||||||
|
up_read(&dqopt->dqio_sem);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user