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.c40
1 files changed, 14 insertions, 26 deletions
diff --git a/fs/9p/vfs_inode.c b/fs/9p/vfs_inode.c
index b5340c829de1..d86edc8d3fd0 100644
--- a/fs/9p/vfs_inode.c
+++ b/fs/9p/vfs_inode.c
@@ -692,9 +692,7 @@ v9fs_create(struct v9fs_session_info *v9ses, struct inode *dir,
692 "inode creation failed %d\n", err); 692 "inode creation failed %d\n", err);
693 goto error; 693 goto error;
694 } 694 }
695 err = v9fs_fid_add(dentry, fid); 695 v9fs_fid_add(dentry, fid);
696 if (err < 0)
697 goto error;
698 d_instantiate(dentry, inode); 696 d_instantiate(dentry, inode);
699 } 697 }
700 return ofid; 698 return ofid;
@@ -790,7 +788,6 @@ struct dentry *v9fs_vfs_lookup(struct inode *dir, struct dentry *dentry,
790 struct p9_fid *dfid, *fid; 788 struct p9_fid *dfid, *fid;
791 struct inode *inode; 789 struct inode *inode;
792 char *name; 790 char *name;
793 int result = 0;
794 791
795 p9_debug(P9_DEBUG_VFS, "dir: %p dentry: (%s) %p flags: %x\n", 792 p9_debug(P9_DEBUG_VFS, "dir: %p dentry: (%s) %p flags: %x\n",
796 dir, dentry->d_name.name, dentry, flags); 793 dir, dentry->d_name.name, dentry, flags);
@@ -808,13 +805,11 @@ struct dentry *v9fs_vfs_lookup(struct inode *dir, struct dentry *dentry,
808 name = (char *) dentry->d_name.name; 805 name = (char *) dentry->d_name.name;
809 fid = p9_client_walk(dfid, 1, &name, 1); 806 fid = p9_client_walk(dfid, 1, &name, 1);
810 if (IS_ERR(fid)) { 807 if (IS_ERR(fid)) {
811 result = PTR_ERR(fid); 808 if (fid == ERR_PTR(-ENOENT)) {
812 if (result == -ENOENT) { 809 d_add(dentry, NULL);
813 inode = NULL; 810 return NULL;
814 goto inst_out;
815 } 811 }
816 812 return ERR_CAST(fid);
817 return ERR_PTR(result);
818 } 813 }
819 /* 814 /*
820 * Make sure we don't use a wrong inode due to parallel 815 * Make sure we don't use a wrong inode due to parallel
@@ -826,14 +821,9 @@ struct dentry *v9fs_vfs_lookup(struct inode *dir, struct dentry *dentry,
826 else 821 else
827 inode = v9fs_get_new_inode_from_fid(v9ses, fid, dir->i_sb); 822 inode = v9fs_get_new_inode_from_fid(v9ses, fid, dir->i_sb);
828 if (IS_ERR(inode)) { 823 if (IS_ERR(inode)) {
829 result = PTR_ERR(inode); 824 p9_client_clunk(fid);
830 inode = NULL; 825 return ERR_CAST(inode);
831 goto error;
832 } 826 }
833 result = v9fs_fid_add(dentry, fid);
834 if (result < 0)
835 goto error_iput;
836inst_out:
837 /* 827 /*
838 * If we had a rename on the server and a parallel lookup 828 * If we had a rename on the server and a parallel lookup
839 * for the new name, then make sure we instantiate with 829 * for the new name, then make sure we instantiate with
@@ -842,15 +832,13 @@ inst_out:
842 * k/b. 832 * k/b.
843 */ 833 */
844 res = d_materialise_unique(dentry, inode); 834 res = d_materialise_unique(dentry, inode);
845 if (!IS_ERR(res)) 835 if (!res)
846 return res; 836 v9fs_fid_add(dentry, fid);
847 result = PTR_ERR(res); 837 else if (!IS_ERR(res))
848error_iput: 838 v9fs_fid_add(res, fid);
849 iput(inode); 839 else
850error: 840 p9_client_clunk(fid);
851 p9_client_clunk(fid); 841 return res;
852
853 return ERR_PTR(result);
854} 842}
855 843
856static int 844static int