diff options
Diffstat (limited to 'fs/ext3/super.c')
-rw-r--r-- | fs/ext3/super.c | 10 |
1 files changed, 8 insertions, 2 deletions
diff --git a/fs/ext3/super.c b/fs/ext3/super.c index 2fedaf8b5012..77ce1616f725 100644 --- a/fs/ext3/super.c +++ b/fs/ext3/super.c | |||
@@ -27,7 +27,6 @@ | |||
27 | #include <linux/init.h> | 27 | #include <linux/init.h> |
28 | #include <linux/blkdev.h> | 28 | #include <linux/blkdev.h> |
29 | #include <linux/parser.h> | 29 | #include <linux/parser.h> |
30 | #include <linux/smp_lock.h> | ||
31 | #include <linux/buffer_head.h> | 30 | #include <linux/buffer_head.h> |
32 | #include <linux/exportfs.h> | 31 | #include <linux/exportfs.h> |
33 | #include <linux/vfs.h> | 32 | #include <linux/vfs.h> |
@@ -480,6 +479,13 @@ static struct inode *ext3_alloc_inode(struct super_block *sb) | |||
480 | return &ei->vfs_inode; | 479 | return &ei->vfs_inode; |
481 | } | 480 | } |
482 | 481 | ||
482 | static void ext3_i_callback(struct rcu_head *head) | ||
483 | { | ||
484 | struct inode *inode = container_of(head, struct inode, i_rcu); | ||
485 | INIT_LIST_HEAD(&inode->i_dentry); | ||
486 | kmem_cache_free(ext3_inode_cachep, EXT3_I(inode)); | ||
487 | } | ||
488 | |||
483 | static void ext3_destroy_inode(struct inode *inode) | 489 | static void ext3_destroy_inode(struct inode *inode) |
484 | { | 490 | { |
485 | if (!list_empty(&(EXT3_I(inode)->i_orphan))) { | 491 | if (!list_empty(&(EXT3_I(inode)->i_orphan))) { |
@@ -490,7 +496,7 @@ static void ext3_destroy_inode(struct inode *inode) | |||
490 | false); | 496 | false); |
491 | dump_stack(); | 497 | dump_stack(); |
492 | } | 498 | } |
493 | kmem_cache_free(ext3_inode_cachep, EXT3_I(inode)); | 499 | call_rcu(&inode->i_rcu, ext3_i_callback); |
494 | } | 500 | } |
495 | 501 | ||
496 | static void init_once(void *foo) | 502 | static void init_once(void *foo) |