quota: factor out dquot_write_dquot()
[ Upstream commit 024128477809f8073d870307c8157b8826ebfd08 ] Refactor out dquot_write_dquot() to reduce duplicate code. Signed-off-by: Baokun Li <libaokun1@huawei.com> Signed-off-by: Jan Kara <jack@suse.cz> Message-Id: <20230630110822.3881712-2-libaokun1@huawei.com> Stable-dep-of: dabc8b207566 ("quota: fix dqput() to follow the guarantees dquot_srcu should provide") Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
parent
53805176ec
commit
a5da2849db
@ -630,6 +630,18 @@ int dquot_scan_active(struct super_block *sb,
|
|||||||
}
|
}
|
||||||
EXPORT_SYMBOL(dquot_scan_active);
|
EXPORT_SYMBOL(dquot_scan_active);
|
||||||
|
|
||||||
|
static inline int dquot_write_dquot(struct dquot *dquot)
|
||||||
|
{
|
||||||
|
int ret = dquot->dq_sb->dq_op->write_dquot(dquot);
|
||||||
|
if (ret < 0) {
|
||||||
|
quota_error(dquot->dq_sb, "Can't write quota structure "
|
||||||
|
"(error %d). Quota may get out of sync!", ret);
|
||||||
|
/* Clear dirty bit anyway to avoid infinite loop. */
|
||||||
|
clear_dquot_dirty(dquot);
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
/* Write all dquot structures to quota files */
|
/* Write all dquot structures to quota files */
|
||||||
int dquot_writeback_dquots(struct super_block *sb, int type)
|
int dquot_writeback_dquots(struct super_block *sb, int type)
|
||||||
{
|
{
|
||||||
@ -660,16 +672,9 @@ int dquot_writeback_dquots(struct super_block *sb, int type)
|
|||||||
* use count */
|
* use count */
|
||||||
dqgrab(dquot);
|
dqgrab(dquot);
|
||||||
spin_unlock(&dq_list_lock);
|
spin_unlock(&dq_list_lock);
|
||||||
err = sb->dq_op->write_dquot(dquot);
|
err = dquot_write_dquot(dquot);
|
||||||
if (err) {
|
if (err && !ret)
|
||||||
/*
|
ret = err;
|
||||||
* Clear dirty bit anyway to avoid infinite
|
|
||||||
* loop here.
|
|
||||||
*/
|
|
||||||
clear_dquot_dirty(dquot);
|
|
||||||
if (!ret)
|
|
||||||
ret = err;
|
|
||||||
}
|
|
||||||
dqput(dquot);
|
dqput(dquot);
|
||||||
spin_lock(&dq_list_lock);
|
spin_lock(&dq_list_lock);
|
||||||
}
|
}
|
||||||
@ -767,8 +772,6 @@ static struct shrinker dqcache_shrinker = {
|
|||||||
*/
|
*/
|
||||||
void dqput(struct dquot *dquot)
|
void dqput(struct dquot *dquot)
|
||||||
{
|
{
|
||||||
int ret;
|
|
||||||
|
|
||||||
if (!dquot)
|
if (!dquot)
|
||||||
return;
|
return;
|
||||||
#ifdef CONFIG_QUOTA_DEBUG
|
#ifdef CONFIG_QUOTA_DEBUG
|
||||||
@ -796,17 +799,7 @@ void dqput(struct dquot *dquot)
|
|||||||
if (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);
|
dquot_write_dquot(dquot);
|
||||||
if (ret < 0) {
|
|
||||||
quota_error(dquot->dq_sb, "Can't write quota structure"
|
|
||||||
" (error %d). Quota may get out of sync!",
|
|
||||||
ret);
|
|
||||||
/*
|
|
||||||
* We clear dirty bit anyway, so that we avoid
|
|
||||||
* infinite loop here
|
|
||||||
*/
|
|
||||||
clear_dquot_dirty(dquot);
|
|
||||||
}
|
|
||||||
goto we_slept;
|
goto we_slept;
|
||||||
}
|
}
|
||||||
if (test_bit(DQ_ACTIVE_B, &dquot->dq_flags)) {
|
if (test_bit(DQ_ACTIVE_B, &dquot->dq_flags)) {
|
||||||
|
Loading…
Reference in New Issue
Block a user