diff options
Diffstat (limited to 'fs/jfs/super.c')
-rw-r--r-- | fs/jfs/super.c | 10 |
1 files changed, 9 insertions, 1 deletions
diff --git a/fs/jfs/super.c b/fs/jfs/super.c index 0669fc1cc3bf..b715b0f7bdfd 100644 --- a/fs/jfs/super.c +++ b/fs/jfs/super.c | |||
@@ -115,6 +115,14 @@ static struct inode *jfs_alloc_inode(struct super_block *sb) | |||
115 | return &jfs_inode->vfs_inode; | 115 | return &jfs_inode->vfs_inode; |
116 | } | 116 | } |
117 | 117 | ||
118 | static void jfs_i_callback(struct rcu_head *head) | ||
119 | { | ||
120 | struct inode *inode = container_of(head, struct inode, i_rcu); | ||
121 | struct jfs_inode_info *ji = JFS_IP(inode); | ||
122 | INIT_LIST_HEAD(&inode->i_dentry); | ||
123 | kmem_cache_free(jfs_inode_cachep, ji); | ||
124 | } | ||
125 | |||
118 | static void jfs_destroy_inode(struct inode *inode) | 126 | static void jfs_destroy_inode(struct inode *inode) |
119 | { | 127 | { |
120 | struct jfs_inode_info *ji = JFS_IP(inode); | 128 | struct jfs_inode_info *ji = JFS_IP(inode); |
@@ -128,7 +136,7 @@ static void jfs_destroy_inode(struct inode *inode) | |||
128 | ji->active_ag = -1; | 136 | ji->active_ag = -1; |
129 | } | 137 | } |
130 | spin_unlock_irq(&ji->ag_lock); | 138 | spin_unlock_irq(&ji->ag_lock); |
131 | kmem_cache_free(jfs_inode_cachep, ji); | 139 | call_rcu(&inode->i_rcu, jfs_i_callback); |
132 | } | 140 | } |
133 | 141 | ||
134 | static int jfs_statfs(struct dentry *dentry, struct kstatfs *buf) | 142 | static int jfs_statfs(struct dentry *dentry, struct kstatfs *buf) |