提交 7af9cce8 编写于 作者: D Dmitry Monakhov 提交者: Jan Kara

quota: check quota reservation on remove_dquot_ref

Reserved space must being claimed before remove_dquot_ref() for a
given inode. Filesystem is responsible for performing force blocks
allocation in case of dealloc in ->quota_off. Let's add sanity check
for that case. Do it similar to add_dquot_ref().
Signed-off-by: NDmitry Monakhov <dmonakhov@openvz.org>
Signed-off-by: NJan Kara <jack@suse.cz>
上级 a9f7f2e7
...@@ -986,6 +986,7 @@ static void remove_dquot_ref(struct super_block *sb, int type, ...@@ -986,6 +986,7 @@ static void remove_dquot_ref(struct super_block *sb, int type,
struct list_head *tofree_head) struct list_head *tofree_head)
{ {
struct inode *inode; struct inode *inode;
int reserved = 0;
spin_lock(&inode_lock); spin_lock(&inode_lock);
list_for_each_entry(inode, &sb->s_inodes, i_sb_list) { list_for_each_entry(inode, &sb->s_inodes, i_sb_list) {
...@@ -995,10 +996,20 @@ static void remove_dquot_ref(struct super_block *sb, int type, ...@@ -995,10 +996,20 @@ static void remove_dquot_ref(struct super_block *sb, int type,
* only quota pointers and these have separate locking * only quota pointers and these have separate locking
* (dqptr_sem). * (dqptr_sem).
*/ */
if (!IS_NOQUOTA(inode)) if (!IS_NOQUOTA(inode)) {
if (unlikely(inode_get_rsv_space(inode) > 0))
reserved = 1;
remove_inode_dquot_ref(inode, type, tofree_head); remove_inode_dquot_ref(inode, type, tofree_head);
}
} }
spin_unlock(&inode_lock); spin_unlock(&inode_lock);
#ifdef CONFIG_QUOTA_DEBUG
if (reserved) {
printk(KERN_WARNING "VFS (%s): Writes happened after quota"
" was disabled thus quota information is probably "
"inconsistent. Please run quotacheck(8).\n", sb->s_id);
}
#endif
} }
/* Gather all references from inodes and drop them */ /* Gather all references from inodes and drop them */
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册