vfs: fix lock inversion in drop_pagecache_sb()
Changes
1 files changed · +7 −1
| File | Status | Add | Del | Content |
|---|---|---|---|---|
| fs/drop_caches.c | modified | +7 | −1 | View file |
fs/drop_caches.c
View filediff --git a/fs/drop_caches.c b/fs/drop_caches.c
index e2c6b65..50f9087 100644
--- a/fs/drop_caches.c
+++ b/fs/drop_caches.c
@@ -14,15 +14,21 @@ int sysctl_drop_caches;
static void drop_pagecache_sb(struct super_block *sb)
{
- struct inode *inode;
+ struct inode *inode, *toput_inode = NULL;
spin_lock(&inode_lock);
list_for_each_entry(inode, &sb->s_inodes, i_sb_list) {
if (inode->i_state & (I_FREEING|I_WILL_FREE))
continue;
+ __iget(inode);
+ spin_unlock(&inode_lock);
__invalidate_mapping_pages(inode->i_mapping, 0, -1, true);
+ iput(toput_inode);
+ toput_inode = inode;
+ spin_lock(&inode_lock);
}
spin_unlock(&inode_lock);
+ iput(toput_inode);
}
static void drop_pagecache(void)