fs: icache RCU free inodes
[firefly-linux-kernel-4.4.55.git] / fs / fuse / inode.c
index cfce3ad86a9253c8f82f793da306979357f4df6f..44e0a6c57e8729c02630fa5174a832580cafaddf 100644 (file)
@@ -99,6 +99,13 @@ static struct inode *fuse_alloc_inode(struct super_block *sb)
        return inode;
 }
 
+static void fuse_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(fuse_inode_cachep, inode);
+}
+
 static void fuse_destroy_inode(struct inode *inode)
 {
        struct fuse_inode *fi = get_fuse_inode(inode);
@@ -106,7 +113,7 @@ static void fuse_destroy_inode(struct inode *inode)
        BUG_ON(!list_empty(&fi->queued_writes));
        if (fi->forget_req)
                fuse_request_free(fi->forget_req);
-       kmem_cache_free(fuse_inode_cachep, inode);
+       call_rcu(&inode->i_rcu, fuse_i_callback);
 }
 
 void fuse_send_forget(struct fuse_conn *fc, struct fuse_req *req,