|
@@ -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)
|