projects
/
deliverable
/
linux.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
fs: icache RCU free inodes
[deliverable/linux.git]
/
mm
/
shmem.c
diff --git
a/mm/shmem.c
b/mm/shmem.c
index 47fdeeb9d63685e708d2775216768dfc49f735dc..5ee67c9906022a15b566711da17b8c78e65fa16d 100644
(file)
--- a/
mm/shmem.c
+++ b/
mm/shmem.c
@@
-2415,13
+2415,20
@@
static struct inode *shmem_alloc_inode(struct super_block *sb)
return &p->vfs_inode;
}
return &p->vfs_inode;
}
+static void shmem_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(shmem_inode_cachep, SHMEM_I(inode));
+}
+
static void shmem_destroy_inode(struct inode *inode)
{
if ((inode->i_mode & S_IFMT) == S_IFREG) {
/* only struct inode is valid if it's an inline symlink */
mpol_free_shared_policy(&SHMEM_I(inode)->policy);
}
static void shmem_destroy_inode(struct inode *inode)
{
if ((inode->i_mode & S_IFMT) == S_IFREG) {
/* only struct inode is valid if it's an inline symlink */
mpol_free_shared_policy(&SHMEM_I(inode)->policy);
}
-
kmem_cache_free(shmem_inode_cachep, SHMEM_I(inode)
);
+
call_rcu(&inode->i_rcu, shmem_i_callback
);
}
static void init_once(void *foo)
}
static void init_once(void *foo)
This page took
0.029112 seconds
and
5
git commands to generate.