diff options
Diffstat (limited to 'fs/quota/dquot.c')
-rw-r--r-- | fs/quota/dquot.c | 10 |
1 files changed, 8 insertions, 2 deletions
diff --git a/fs/quota/dquot.c b/fs/quota/dquot.c index eb938015bd91..2ca967a5ef77 100644 --- a/fs/quota/dquot.c +++ b/fs/quota/dquot.c | |||
@@ -823,12 +823,12 @@ static void add_dquot_ref(struct super_block *sb, int type) | |||
823 | 823 | ||
824 | spin_lock(&inode_lock); | 824 | spin_lock(&inode_lock); |
825 | list_for_each_entry(inode, &sb->s_inodes, i_sb_list) { | 825 | list_for_each_entry(inode, &sb->s_inodes, i_sb_list) { |
826 | if (inode->i_state & (I_FREEING|I_WILL_FREE|I_NEW)) | ||
827 | continue; | ||
826 | if (!atomic_read(&inode->i_writecount)) | 828 | if (!atomic_read(&inode->i_writecount)) |
827 | continue; | 829 | continue; |
828 | if (!dqinit_needed(inode, type)) | 830 | if (!dqinit_needed(inode, type)) |
829 | continue; | 831 | continue; |
830 | if (inode->i_state & (I_FREEING|I_WILL_FREE)) | ||
831 | continue; | ||
832 | 832 | ||
833 | __iget(inode); | 833 | __iget(inode); |
834 | spin_unlock(&inode_lock); | 834 | spin_unlock(&inode_lock); |
@@ -915,6 +915,12 @@ static void remove_dquot_ref(struct super_block *sb, int type, | |||
915 | 915 | ||
916 | spin_lock(&inode_lock); | 916 | spin_lock(&inode_lock); |
917 | list_for_each_entry(inode, &sb->s_inodes, i_sb_list) { | 917 | list_for_each_entry(inode, &sb->s_inodes, i_sb_list) { |
918 | /* | ||
919 | * We have to scan also I_NEW inodes because they can already | ||
920 | * have quota pointer initialized. Luckily, we need to touch | ||
921 | * only quota pointers and these have separate locking | ||
922 | * (dqptr_sem). | ||
923 | */ | ||
918 | if (!IS_NOQUOTA(inode)) | 924 | if (!IS_NOQUOTA(inode)) |
919 | remove_inode_dquot_ref(inode, type, tofree_head); | 925 | remove_inode_dquot_ref(inode, type, tofree_head); |
920 | } | 926 | } |