fs: icache RCU free inodes
[firefly-linux-kernel-4.4.55.git] / fs / logfs / inode.c
index d8c71ece098fb2d5ce87afe1fbb16a1fc130d336..03b8c240aeda37ea287b36f8ebaeeae1ee23a479 100644 (file)
@@ -141,13 +141,20 @@ struct inode *logfs_safe_iget(struct super_block *sb, ino_t ino, int *is_cached)
        return __logfs_iget(sb, ino);
 }
 
+static void logfs_i_callback(struct rcu_head *head)
+{
+       struct inode *inode = container_of(head, struct inode, i_rcu);
+       INIT_LIST_HEAD(&inode->i_dentry);
+       kmem_cache_free(logfs_inode_cache, logfs_inode(inode));
+}
+
 static void __logfs_destroy_inode(struct inode *inode)
 {
        struct logfs_inode *li = logfs_inode(inode);
 
        BUG_ON(li->li_block);
        list_del(&li->li_freeing_list);
-       kmem_cache_free(logfs_inode_cache, li);
+       call_rcu(&inode->i_rcu, logfs_i_callback);
 }
 
 static void logfs_destroy_inode(struct inode *inode)