fs: protect inode->i_state with inode->i_lock
[GitHub/mt8127/android_kernel_alcatel_ttab.git] / fs / drop_caches.c
index 816f88e6b9ceaa08c8ff443e3e54035c567b3a2e..6c6f73ba0868558e226ef9dc47869700418762d0 100644 (file)
@@ -18,11 +18,14 @@ static void drop_pagecache_sb(struct super_block *sb, void *unused)
 
        spin_lock(&inode_lock);
        list_for_each_entry(inode, &sb->s_inodes, i_sb_list) {
-               if (inode->i_state & (I_FREEING|I_WILL_FREE|I_NEW))
-                       continue;
-               if (inode->i_mapping->nrpages == 0)
+               spin_lock(&inode->i_lock);
+               if ((inode->i_state & (I_FREEING|I_WILL_FREE|I_NEW)) ||
+                   (inode->i_mapping->nrpages == 0)) {
+                       spin_unlock(&inode->i_lock);
                        continue;
+               }
                __iget(inode);
+               spin_unlock(&inode->i_lock);
                spin_unlock(&inode_lock);
                invalidate_mapping_pages(inode->i_mapping, 0, -1);
                iput(toput_inode);