diff options
author | Dmitry Monakhov <dmonakhov@openvz.org> | 2010-06-01 11:39:48 +0400 |
---|---|---|
committer | Jan Kara <jack@suse.cz> | 2010-07-21 16:01:46 +0200 |
commit | 7af9cce8ae467bb2fcf3b0b6be3898835bdb984c (patch) | |
tree | ee72b3f199b775484ad61a984d5cfd5cb34d6de8 | |
parent | a9f7f2e74ae0e6a801a2433dc8e9124d73da0cb4 (diff) | |
download | linux-3.10-7af9cce8ae467bb2fcf3b0b6be3898835bdb984c.tar.gz linux-3.10-7af9cce8ae467bb2fcf3b0b6be3898835bdb984c.tar.bz2 linux-3.10-7af9cce8ae467bb2fcf3b0b6be3898835bdb984c.zip |
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: Dmitry Monakhov <dmonakhov@openvz.org>
Signed-off-by: Jan Kara <jack@suse.cz>
-rw-r--r-- | fs/quota/dquot.c | 13 |
1 files changed, 12 insertions, 1 deletions
diff --git a/fs/quota/dquot.c b/fs/quota/dquot.c index 12c233da1b6..a5974c49a78 100644 --- a/fs/quota/dquot.c +++ b/fs/quota/dquot.c @@ -986,6 +986,7 @@ static void remove_dquot_ref(struct super_block *sb, int type, struct list_head *tofree_head) { struct inode *inode; + int reserved = 0; spin_lock(&inode_lock); 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, * only quota pointers and these have separate locking * (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); + } } 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 */ |