aboutsummaryrefslogtreecommitdiffstats
path: root/mm/shmem.c
diff options
context:
space:
mode:
Diffstat (limited to 'mm/shmem.c')
-rw-r--r--mm/shmem.c13
1 files changed, 11 insertions, 2 deletions
diff --git a/mm/shmem.c b/mm/shmem.c
index eef4ebea5158..d7905296c2d3 100644
--- a/mm/shmem.c
+++ b/mm/shmem.c
@@ -1882,7 +1882,9 @@ static int shmem_link(struct dentry *old_dentry, struct inode *dir, struct dentr
1882 dir->i_size += BOGO_DIRENT_SIZE; 1882 dir->i_size += BOGO_DIRENT_SIZE;
1883 inode->i_ctime = dir->i_ctime = dir->i_mtime = CURRENT_TIME; 1883 inode->i_ctime = dir->i_ctime = dir->i_mtime = CURRENT_TIME;
1884 inc_nlink(inode); 1884 inc_nlink(inode);
1885 atomic_inc(&inode->i_count); /* New dentry reference */ 1885 spin_lock(&inode->i_lock);
1886 inode->i_count++; /* New dentry reference */
1887 spin_unlock(&inode->i_lock);
1886 dget(dentry); /* Extra pinning count for the created dentry */ 1888 dget(dentry); /* Extra pinning count for the created dentry */
1887 d_instantiate(dentry, inode); 1889 d_instantiate(dentry, inode);
1888out: 1890out:
@@ -2395,13 +2397,20 @@ static struct inode *shmem_alloc_inode(struct super_block *sb)
2395 return &p->vfs_inode; 2397 return &p->vfs_inode;
2396} 2398}
2397 2399
2400static void shmem_i_callback(struct rcu_head *head)
2401{
2402 struct inode *inode = container_of(head, struct inode, i_rcu);
2403 INIT_LIST_HEAD(&inode->i_dentry);
2404 kmem_cache_free(shmem_inode_cachep, SHMEM_I(inode));
2405}
2406
2398static void shmem_destroy_inode(struct inode *inode) 2407static void shmem_destroy_inode(struct inode *inode)
2399{ 2408{
2400 if ((inode->i_mode & S_IFMT) == S_IFREG) { 2409 if ((inode->i_mode & S_IFMT) == S_IFREG) {
2401 /* only struct inode is valid if it's an inline symlink */ 2410 /* only struct inode is valid if it's an inline symlink */
2402 mpol_free_shared_policy(&SHMEM_I(inode)->policy); 2411 mpol_free_shared_policy(&SHMEM_I(inode)->policy);
2403 } 2412 }
2404 kmem_cache_free(shmem_inode_cachep, SHMEM_I(inode)); 2413 call_rcu(&inode->i_rcu, shmem_i_callback);
2405} 2414}
2406 2415
2407static void init_once(void *foo) 2416static void init_once(void *foo)