aboutsummaryrefslogtreecommitdiffstats
path: root/fs/9p/vfs_inode.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/9p/vfs_inode.c')
-rw-r--r--fs/9p/vfs_inode.c39
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
240void v9fs_destroy_inode(struct inode *inode) 240static 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
247void 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
1035inst_out: 1042inst_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 */