diff options
Diffstat (limited to 'fs/9p/vfs_inode.c')
-rw-r--r-- | fs/9p/vfs_inode.c | 39 |
1 files changed, 23 insertions, 16 deletions
diff --git a/fs/9p/vfs_inode.c b/fs/9p/vfs_inode.c index 34bf71b56542..59782981b225 100644 --- a/fs/9p/vfs_inode.c +++ b/fs/9p/vfs_inode.c | |||
@@ -237,10 +237,17 @@ struct inode *v9fs_alloc_inode(struct super_block *sb) | |||
237 | * | 237 | * |
238 | */ | 238 | */ |
239 | 239 | ||
240 | void v9fs_destroy_inode(struct inode *inode) | 240 | static void v9fs_i_callback(struct rcu_head *head) |
241 | { | 241 | { |
242 | struct inode *inode = container_of(head, struct inode, i_rcu); | ||
243 | INIT_LIST_HEAD(&inode->i_dentry); | ||
242 | kmem_cache_free(vcookie_cache, v9fs_inode2cookie(inode)); | 244 | kmem_cache_free(vcookie_cache, v9fs_inode2cookie(inode)); |
243 | } | 245 | } |
246 | |||
247 | void v9fs_destroy_inode(struct inode *inode) | ||
248 | { | ||
249 | call_rcu(&inode->i_rcu, v9fs_i_callback); | ||
250 | } | ||
244 | #endif | 251 | #endif |
245 | 252 | ||
246 | /** | 253 | /** |
@@ -270,11 +277,11 @@ static struct dentry *v9fs_dentry_from_dir_inode(struct inode *inode) | |||
270 | { | 277 | { |
271 | struct dentry *dentry; | 278 | struct dentry *dentry; |
272 | 279 | ||
273 | spin_lock(&dcache_lock); | 280 | spin_lock(&inode->i_lock); |
274 | /* Directory should have only one entry. */ | 281 | /* Directory should have only one entry. */ |
275 | BUG_ON(S_ISDIR(inode->i_mode) && !list_is_singular(&inode->i_dentry)); | 282 | BUG_ON(S_ISDIR(inode->i_mode) && !list_is_singular(&inode->i_dentry)); |
276 | dentry = list_entry(inode->i_dentry.next, struct dentry, d_alias); | 283 | dentry = list_entry(inode->i_dentry.next, struct dentry, d_alias); |
277 | spin_unlock(&dcache_lock); | 284 | spin_unlock(&inode->i_lock); |
278 | return dentry; | 285 | return dentry; |
279 | } | 286 | } |
280 | 287 | ||
@@ -628,9 +635,9 @@ v9fs_create(struct v9fs_session_info *v9ses, struct inode *dir, | |||
628 | } | 635 | } |
629 | 636 | ||
630 | if (v9ses->cache) | 637 | if (v9ses->cache) |
631 | dentry->d_op = &v9fs_cached_dentry_operations; | 638 | d_set_d_op(dentry, &v9fs_cached_dentry_operations); |
632 | else | 639 | else |
633 | dentry->d_op = &v9fs_dentry_operations; | 640 | d_set_d_op(dentry, &v9fs_dentry_operations); |
634 | 641 | ||
635 | d_instantiate(dentry, inode); | 642 | d_instantiate(dentry, inode); |
636 | err = v9fs_fid_add(dentry, fid); | 643 | err = v9fs_fid_add(dentry, fid); |
@@ -742,7 +749,7 @@ v9fs_vfs_create_dotl(struct inode *dir, struct dentry *dentry, int omode, | |||
742 | err); | 749 | err); |
743 | goto error; | 750 | goto error; |
744 | } | 751 | } |
745 | dentry->d_op = &v9fs_cached_dentry_operations; | 752 | d_set_d_op(dentry, &v9fs_cached_dentry_operations); |
746 | d_instantiate(dentry, inode); | 753 | d_instantiate(dentry, inode); |
747 | err = v9fs_fid_add(dentry, fid); | 754 | err = v9fs_fid_add(dentry, fid); |
748 | if (err < 0) | 755 | if (err < 0) |
@@ -760,7 +767,7 @@ v9fs_vfs_create_dotl(struct inode *dir, struct dentry *dentry, int omode, | |||
760 | err = PTR_ERR(inode); | 767 | err = PTR_ERR(inode); |
761 | goto error; | 768 | goto error; |
762 | } | 769 | } |
763 | dentry->d_op = &v9fs_dentry_operations; | 770 | d_set_d_op(dentry, &v9fs_dentry_operations); |
764 | d_instantiate(dentry, inode); | 771 | d_instantiate(dentry, inode); |
765 | } | 772 | } |
766 | /* Now set the ACL based on the default value */ | 773 | /* Now set the ACL based on the default value */ |
@@ -949,7 +956,7 @@ static int v9fs_vfs_mkdir_dotl(struct inode *dir, | |||
949 | err); | 956 | err); |
950 | goto error; | 957 | goto error; |
951 | } | 958 | } |
952 | dentry->d_op = &v9fs_cached_dentry_operations; | 959 | d_set_d_op(dentry, &v9fs_cached_dentry_operations); |
953 | d_instantiate(dentry, inode); | 960 | d_instantiate(dentry, inode); |
954 | err = v9fs_fid_add(dentry, fid); | 961 | err = v9fs_fid_add(dentry, fid); |
955 | if (err < 0) | 962 | if (err < 0) |
@@ -966,7 +973,7 @@ static int v9fs_vfs_mkdir_dotl(struct inode *dir, | |||
966 | err = PTR_ERR(inode); | 973 | err = PTR_ERR(inode); |
967 | goto error; | 974 | goto error; |
968 | } | 975 | } |
969 | dentry->d_op = &v9fs_dentry_operations; | 976 | d_set_d_op(dentry, &v9fs_dentry_operations); |
970 | d_instantiate(dentry, inode); | 977 | d_instantiate(dentry, inode); |
971 | } | 978 | } |
972 | /* Now set the ACL based on the default value */ | 979 | /* Now set the ACL based on the default value */ |
@@ -1034,9 +1041,9 @@ static struct dentry *v9fs_vfs_lookup(struct inode *dir, struct dentry *dentry, | |||
1034 | 1041 | ||
1035 | inst_out: | 1042 | inst_out: |
1036 | if (v9ses->cache) | 1043 | if (v9ses->cache) |
1037 | dentry->d_op = &v9fs_cached_dentry_operations; | 1044 | d_set_d_op(dentry, &v9fs_cached_dentry_operations); |
1038 | else | 1045 | else |
1039 | dentry->d_op = &v9fs_dentry_operations; | 1046 | d_set_d_op(dentry, &v9fs_dentry_operations); |
1040 | 1047 | ||
1041 | d_add(dentry, inode); | 1048 | d_add(dentry, inode); |
1042 | return NULL; | 1049 | return NULL; |
@@ -1702,7 +1709,7 @@ v9fs_vfs_symlink_dotl(struct inode *dir, struct dentry *dentry, | |||
1702 | err); | 1709 | err); |
1703 | goto error; | 1710 | goto error; |
1704 | } | 1711 | } |
1705 | dentry->d_op = &v9fs_cached_dentry_operations; | 1712 | d_set_d_op(dentry, &v9fs_cached_dentry_operations); |
1706 | d_instantiate(dentry, inode); | 1713 | d_instantiate(dentry, inode); |
1707 | err = v9fs_fid_add(dentry, fid); | 1714 | err = v9fs_fid_add(dentry, fid); |
1708 | if (err < 0) | 1715 | if (err < 0) |
@@ -1715,7 +1722,7 @@ v9fs_vfs_symlink_dotl(struct inode *dir, struct dentry *dentry, | |||
1715 | err = PTR_ERR(inode); | 1722 | err = PTR_ERR(inode); |
1716 | goto error; | 1723 | goto error; |
1717 | } | 1724 | } |
1718 | dentry->d_op = &v9fs_dentry_operations; | 1725 | d_set_d_op(dentry, &v9fs_dentry_operations); |
1719 | d_instantiate(dentry, inode); | 1726 | d_instantiate(dentry, inode); |
1720 | } | 1727 | } |
1721 | 1728 | ||
@@ -1849,7 +1856,7 @@ v9fs_vfs_link_dotl(struct dentry *old_dentry, struct inode *dir, | |||
1849 | ihold(old_dentry->d_inode); | 1856 | ihold(old_dentry->d_inode); |
1850 | } | 1857 | } |
1851 | 1858 | ||
1852 | dentry->d_op = old_dentry->d_op; | 1859 | d_set_d_op(dentry, old_dentry->d_op); |
1853 | d_instantiate(dentry, old_dentry->d_inode); | 1860 | d_instantiate(dentry, old_dentry->d_inode); |
1854 | 1861 | ||
1855 | return err; | 1862 | return err; |
@@ -1973,7 +1980,7 @@ v9fs_vfs_mknod_dotl(struct inode *dir, struct dentry *dentry, int omode, | |||
1973 | err); | 1980 | err); |
1974 | goto error; | 1981 | goto error; |
1975 | } | 1982 | } |
1976 | dentry->d_op = &v9fs_cached_dentry_operations; | 1983 | d_set_d_op(dentry, &v9fs_cached_dentry_operations); |
1977 | d_instantiate(dentry, inode); | 1984 | d_instantiate(dentry, inode); |
1978 | err = v9fs_fid_add(dentry, fid); | 1985 | err = v9fs_fid_add(dentry, fid); |
1979 | if (err < 0) | 1986 | if (err < 0) |
@@ -1989,7 +1996,7 @@ v9fs_vfs_mknod_dotl(struct inode *dir, struct dentry *dentry, int omode, | |||
1989 | err = PTR_ERR(inode); | 1996 | err = PTR_ERR(inode); |
1990 | goto error; | 1997 | goto error; |
1991 | } | 1998 | } |
1992 | dentry->d_op = &v9fs_dentry_operations; | 1999 | d_set_d_op(dentry, &v9fs_dentry_operations); |
1993 | d_instantiate(dentry, inode); | 2000 | d_instantiate(dentry, inode); |
1994 | } | 2001 | } |
1995 | /* Now set the ACL based on the default value */ | 2002 | /* Now set the ACL based on the default value */ |