mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-12-18 09:16:55 +07:00
quota: Do not dirty bad dquots
Currently we mark dirty even dquots that are not active (i.e., initialization or reading failed for them). Thus later we have to check whether dirty dquot is really active and just clear the dirty bit if not. Avoid this complication by just never marking non-active dquot as dirty. Signed-off-by: Jan Kara <jack@suse.cz>
This commit is contained in:
parent
15512377bd
commit
4580b30ea8
@ -339,6 +339,9 @@ int dquot_mark_dquot_dirty(struct dquot *dquot)
|
|||||||
{
|
{
|
||||||
int ret = 1;
|
int ret = 1;
|
||||||
|
|
||||||
|
if (!test_bit(DQ_ACTIVE_B, &dquot->dq_flags))
|
||||||
|
return 0;
|
||||||
|
|
||||||
/* If quota is dirty already, we don't have to acquire dq_list_lock */
|
/* If quota is dirty already, we don't have to acquire dq_list_lock */
|
||||||
if (test_bit(DQ_MOD_B, &dquot->dq_flags))
|
if (test_bit(DQ_MOD_B, &dquot->dq_flags))
|
||||||
return 1;
|
return 1;
|
||||||
@ -624,11 +627,9 @@ int dquot_writeback_dquots(struct super_block *sb, int type)
|
|||||||
while (!list_empty(dirty)) {
|
while (!list_empty(dirty)) {
|
||||||
dquot = list_first_entry(dirty, struct dquot,
|
dquot = list_first_entry(dirty, struct dquot,
|
||||||
dq_dirty);
|
dq_dirty);
|
||||||
/* Dirty and inactive can be only bad dquot... */
|
|
||||||
if (!test_bit(DQ_ACTIVE_B, &dquot->dq_flags)) {
|
WARN_ON(!test_bit(DQ_ACTIVE_B, &dquot->dq_flags));
|
||||||
clear_dquot_dirty(dquot);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
/* Now we have active dquot from which someone is
|
/* Now we have active dquot from which someone is
|
||||||
* holding reference so we can safely just increase
|
* holding reference so we can safely just increase
|
||||||
* use count */
|
* use count */
|
||||||
@ -759,7 +760,7 @@ void dqput(struct dquot *dquot)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
/* Need to release dquot? */
|
/* Need to release dquot? */
|
||||||
if (test_bit(DQ_ACTIVE_B, &dquot->dq_flags) && dquot_dirty(dquot)) {
|
if (dquot_dirty(dquot)) {
|
||||||
spin_unlock(&dq_list_lock);
|
spin_unlock(&dq_list_lock);
|
||||||
/* Commit dquot before releasing */
|
/* Commit dquot before releasing */
|
||||||
ret = dquot->dq_sb->dq_op->write_dquot(dquot);
|
ret = dquot->dq_sb->dq_op->write_dquot(dquot);
|
||||||
@ -777,8 +778,6 @@ void dqput(struct dquot *dquot)
|
|||||||
}
|
}
|
||||||
goto we_slept;
|
goto we_slept;
|
||||||
}
|
}
|
||||||
/* Clear flag in case dquot was inactive (something bad happened) */
|
|
||||||
clear_dquot_dirty(dquot);
|
|
||||||
if (test_bit(DQ_ACTIVE_B, &dquot->dq_flags)) {
|
if (test_bit(DQ_ACTIVE_B, &dquot->dq_flags)) {
|
||||||
spin_unlock(&dq_list_lock);
|
spin_unlock(&dq_list_lock);
|
||||||
dquot->dq_sb->dq_op->release_dquot(dquot);
|
dquot->dq_sb->dq_op->release_dquot(dquot);
|
||||||
|
Loading…
Reference in New Issue
Block a user