diff options
Diffstat (limited to 'fs/quota/dquot.c')
-rw-r--r-- | fs/quota/dquot.c | 13 |
1 files changed, 7 insertions, 6 deletions
diff --git a/fs/quota/dquot.c b/fs/quota/dquot.c index a2a622e079f0..a1470fda366c 100644 --- a/fs/quota/dquot.c +++ b/fs/quota/dquot.c | |||
@@ -902,18 +902,19 @@ static void add_dquot_ref(struct super_block *sb, int type) | |||
902 | 902 | ||
903 | spin_lock(&inode_lock); | 903 | spin_lock(&inode_lock); |
904 | list_for_each_entry(inode, &sb->s_inodes, i_sb_list) { | 904 | list_for_each_entry(inode, &sb->s_inodes, i_sb_list) { |
905 | if (inode->i_state & (I_FREEING|I_WILL_FREE|I_NEW)) | 905 | spin_lock(&inode->i_lock); |
906 | if ((inode->i_state & (I_FREEING|I_WILL_FREE|I_NEW)) || | ||
907 | !atomic_read(&inode->i_writecount) || | ||
908 | !dqinit_needed(inode, type)) { | ||
909 | spin_unlock(&inode->i_lock); | ||
906 | continue; | 910 | continue; |
911 | } | ||
907 | #ifdef CONFIG_QUOTA_DEBUG | 912 | #ifdef CONFIG_QUOTA_DEBUG |
908 | if (unlikely(inode_get_rsv_space(inode) > 0)) | 913 | if (unlikely(inode_get_rsv_space(inode) > 0)) |
909 | reserved = 1; | 914 | reserved = 1; |
910 | #endif | 915 | #endif |
911 | if (!atomic_read(&inode->i_writecount)) | ||
912 | continue; | ||
913 | if (!dqinit_needed(inode, type)) | ||
914 | continue; | ||
915 | |||
916 | __iget(inode); | 916 | __iget(inode); |
917 | spin_unlock(&inode->i_lock); | ||
917 | spin_unlock(&inode_lock); | 918 | spin_unlock(&inode_lock); |
918 | 919 | ||
919 | iput(old_inode); | 920 | iput(old_inode); |