quota: simplify remove_inode_dquot_ref()
Simplify the remove_inode_dquot_ref() to make it more obvious that now we keep one reference for each dquot from inodes. Signed-off-by: Jan Kara <jack@suse.cz> Signed-off-by: Niu Yawei <yawei.niu@intel.com> Signed-off-by: Jan Kara <jack@suse.cz>
This commit is contained in:
parent
1ea06bec78
commit
9eb6463f31
|
@ -733,7 +733,6 @@ static struct shrinker dqcache_shrinker = {
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Put reference to dquot
|
* Put reference to dquot
|
||||||
* NOTE: If you change this function please check whether dqput_blocks() works right...
|
|
||||||
*/
|
*/
|
||||||
void dqput(struct dquot *dquot)
|
void dqput(struct dquot *dquot)
|
||||||
{
|
{
|
||||||
|
@ -962,47 +961,35 @@ static void add_dquot_ref(struct super_block *sb, int type)
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* Return 0 if dqput() won't block.
|
|
||||||
* (note that 1 doesn't necessarily mean blocking)
|
|
||||||
*/
|
|
||||||
static inline int dqput_blocks(struct dquot *dquot)
|
|
||||||
{
|
|
||||||
if (atomic_read(&dquot->dq_count) <= 1)
|
|
||||||
return 1;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Remove references to dquots from inode and add dquot to list for freeing
|
* Remove references to dquots from inode and add dquot to list for freeing
|
||||||
* if we have the last reference to dquot
|
* if we have the last reference to dquot
|
||||||
* We can't race with anybody because we hold dqptr_sem for writing...
|
* We can't race with anybody because we hold dqptr_sem for writing...
|
||||||
*/
|
*/
|
||||||
static int remove_inode_dquot_ref(struct inode *inode, int type,
|
static void remove_inode_dquot_ref(struct inode *inode, int type,
|
||||||
struct list_head *tofree_head)
|
struct list_head *tofree_head)
|
||||||
{
|
{
|
||||||
struct dquot *dquot = inode->i_dquot[type];
|
struct dquot *dquot = inode->i_dquot[type];
|
||||||
|
|
||||||
inode->i_dquot[type] = NULL;
|
inode->i_dquot[type] = NULL;
|
||||||
if (dquot) {
|
if (!dquot)
|
||||||
if (dqput_blocks(dquot)) {
|
return;
|
||||||
#ifdef CONFIG_QUOTA_DEBUG
|
|
||||||
if (atomic_read(&dquot->dq_count) != 1)
|
if (list_empty(&dquot->dq_free)) {
|
||||||
quota_error(inode->i_sb, "Adding dquot with "
|
/*
|
||||||
"dq_count %d to dispose list",
|
* The inode still has reference to dquot so it can't be in the
|
||||||
atomic_read(&dquot->dq_count));
|
* free list
|
||||||
#endif
|
*/
|
||||||
spin_lock(&dq_list_lock);
|
spin_lock(&dq_list_lock);
|
||||||
/* As dquot must have currently users it can't be on
|
|
||||||
* the free list... */
|
|
||||||
list_add(&dquot->dq_free, tofree_head);
|
list_add(&dquot->dq_free, tofree_head);
|
||||||
spin_unlock(&dq_list_lock);
|
spin_unlock(&dq_list_lock);
|
||||||
return 1;
|
} else {
|
||||||
|
/*
|
||||||
|
* Dquot is already in a list to put so we won't drop the last
|
||||||
|
* reference here.
|
||||||
|
*/
|
||||||
|
dqput(dquot);
|
||||||
}
|
}
|
||||||
else
|
|
||||||
dqput(dquot); /* We have guaranteed we won't block */
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
Loading…
Reference in New Issue