diff options
Diffstat (limited to 'fs/9p/vfs_inode.c')
-rw-r--r-- | fs/9p/vfs_inode.c | 40 |
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; | ||
836 | inst_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)) |
848 | error_iput: | 838 | v9fs_fid_add(res, fid); |
849 | iput(inode); | 839 | else |
850 | error: | 840 | p9_client_clunk(fid); |
851 | p9_client_clunk(fid); | 841 | return res; |
852 | |||
853 | return ERR_PTR(result); | ||
854 | } | 842 | } |
855 | 843 | ||
856 | static int | 844 | static int |