diff options
Diffstat (limited to 'mm/shmem.c')
-rw-r--r-- | mm/shmem.c | 13 |
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); |
1888 | out: | 1890 | out: |
@@ -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 | ||
2400 | static 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 | |||
2398 | static void shmem_destroy_inode(struct inode *inode) | 2407 | static 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 | ||
2407 | static void init_once(void *foo) | 2416 | static void init_once(void *foo) |