diff options
-rw-r--r-- | fs/dcache.c | 10 | ||||
-rw-r--r-- | fs/efs/namei.c | 29 | ||||
-rw-r--r-- | fs/exportfs/expfs.c | 4 | ||||
-rw-r--r-- | fs/ext2/namei.c | 13 | ||||
-rw-r--r-- | fs/ext3/namei.c | 14 | ||||
-rw-r--r-- | fs/ext4/namei.c | 11 | ||||
-rw-r--r-- | fs/fat/inode.c | 52 | ||||
-rw-r--r-- | fs/fuse/inode.c | 23 | ||||
-rw-r--r-- | fs/gfs2/ops_export.c | 33 | ||||
-rw-r--r-- | fs/isofs/export.c | 33 | ||||
-rw-r--r-- | fs/jfs/namei.c | 15 | ||||
-rw-r--r-- | fs/nfs/getroot.c | 14 | ||||
-rw-r--r-- | fs/ntfs/namei.c | 22 | ||||
-rw-r--r-- | fs/ocfs2/export.c | 30 | ||||
-rw-r--r-- | fs/reiserfs/inode.c | 13 | ||||
-rw-r--r-- | fs/reiserfs/namei.c | 11 | ||||
-rw-r--r-- | fs/udf/namei.c | 17 | ||||
-rw-r--r-- | fs/xfs/linux-2.6/xfs_export.c | 32 | ||||
-rw-r--r-- | fs/xfs/linux-2.6/xfs_ioctl.c | 7 |
19 files changed, 78 insertions, 305 deletions
diff --git a/fs/dcache.c b/fs/dcache.c index 46fc78206782..d45ff7f5ecc2 100644 --- a/fs/dcache.c +++ b/fs/dcache.c | |||
@@ -1187,17 +1187,17 @@ struct dentry * d_alloc_anon(struct inode *inode) | |||
1187 | * allocating a new one. | 1187 | * allocating a new one. |
1188 | * | 1188 | * |
1189 | * On successful return, the reference to the inode has been transferred | 1189 | * On successful return, the reference to the inode has been transferred |
1190 | * to the dentry. If %NULL is returned (indicating kmalloc failure), | 1190 | * to the dentry. In case of an error the reference on the inode is released. |
1191 | * the reference on the inode has been released. To make it easier | 1191 | * To make it easier to use in export operations a %NULL or IS_ERR inode may |
1192 | * to use in export operations a NULL or IS_ERR inode may be passed in | 1192 | * be passed in and will be the error will be propagate to the return value, |
1193 | * and will be casted to the corresponding NULL or IS_ERR dentry. | 1193 | * with a %NULL @inode replaced by ERR_PTR(-ESTALE). |
1194 | */ | 1194 | */ |
1195 | struct dentry *d_obtain_alias(struct inode *inode) | 1195 | struct dentry *d_obtain_alias(struct inode *inode) |
1196 | { | 1196 | { |
1197 | struct dentry *dentry; | 1197 | struct dentry *dentry; |
1198 | 1198 | ||
1199 | if (!inode) | 1199 | if (!inode) |
1200 | return NULL; | 1200 | return ERR_PTR(-ESTALE); |
1201 | if (IS_ERR(inode)) | 1201 | if (IS_ERR(inode)) |
1202 | return ERR_CAST(inode); | 1202 | return ERR_CAST(inode); |
1203 | 1203 | ||
diff --git a/fs/efs/namei.c b/fs/efs/namei.c index 291abb11e20e..c3fb5f9c4a44 100644 --- a/fs/efs/namei.c +++ b/fs/efs/namei.c | |||
@@ -112,35 +112,14 @@ struct dentry *efs_fh_to_parent(struct super_block *sb, struct fid *fid, | |||
112 | 112 | ||
113 | struct dentry *efs_get_parent(struct dentry *child) | 113 | struct dentry *efs_get_parent(struct dentry *child) |
114 | { | 114 | { |
115 | struct dentry *parent; | 115 | struct dentry *parent = ERR_PTR(-ENOENT); |
116 | struct inode *inode; | ||
117 | efs_ino_t ino; | 116 | efs_ino_t ino; |
118 | long error; | ||
119 | 117 | ||
120 | lock_kernel(); | 118 | lock_kernel(); |
121 | |||
122 | error = -ENOENT; | ||
123 | ino = efs_find_entry(child->d_inode, "..", 2); | 119 | ino = efs_find_entry(child->d_inode, "..", 2); |
124 | if (!ino) | 120 | if (ino) |
125 | goto fail; | 121 | parent = d_obtain_alias(efs_iget(child->d_inode->i_sb, ino)); |
126 | |||
127 | inode = efs_iget(child->d_inode->i_sb, ino); | ||
128 | if (IS_ERR(inode)) { | ||
129 | error = PTR_ERR(inode); | ||
130 | goto fail; | ||
131 | } | ||
132 | |||
133 | error = -ENOMEM; | ||
134 | parent = d_alloc_anon(inode); | ||
135 | if (!parent) | ||
136 | goto fail_iput; | ||
137 | |||
138 | unlock_kernel(); | 122 | unlock_kernel(); |
139 | return parent; | ||
140 | 123 | ||
141 | fail_iput: | 124 | return parent; |
142 | iput(inode); | ||
143 | fail: | ||
144 | unlock_kernel(); | ||
145 | return ERR_PTR(error); | ||
146 | } | 125 | } |
diff --git a/fs/exportfs/expfs.c b/fs/exportfs/expfs.c index cc91227d3bb8..7b0f75dcf800 100644 --- a/fs/exportfs/expfs.c +++ b/fs/exportfs/expfs.c | |||
@@ -366,8 +366,6 @@ struct dentry *exportfs_decode_fh(struct vfsmount *mnt, struct fid *fid, | |||
366 | * Try to get any dentry for the given file handle from the filesystem. | 366 | * Try to get any dentry for the given file handle from the filesystem. |
367 | */ | 367 | */ |
368 | result = nop->fh_to_dentry(mnt->mnt_sb, fid, fh_len, fileid_type); | 368 | result = nop->fh_to_dentry(mnt->mnt_sb, fid, fh_len, fileid_type); |
369 | if (!result) | ||
370 | result = ERR_PTR(-ESTALE); | ||
371 | if (IS_ERR(result)) | 369 | if (IS_ERR(result)) |
372 | return result; | 370 | return result; |
373 | 371 | ||
@@ -422,8 +420,6 @@ struct dentry *exportfs_decode_fh(struct vfsmount *mnt, struct fid *fid, | |||
422 | 420 | ||
423 | target_dir = nop->fh_to_parent(mnt->mnt_sb, fid, | 421 | target_dir = nop->fh_to_parent(mnt->mnt_sb, fid, |
424 | fh_len, fileid_type); | 422 | fh_len, fileid_type); |
425 | if (!target_dir) | ||
426 | goto err_result; | ||
427 | err = PTR_ERR(target_dir); | 423 | err = PTR_ERR(target_dir); |
428 | if (IS_ERR(target_dir)) | 424 | if (IS_ERR(target_dir)) |
429 | goto err_result; | 425 | goto err_result; |
diff --git a/fs/ext2/namei.c b/fs/ext2/namei.c index 80c97fd8c571..a1b328ab1e55 100644 --- a/fs/ext2/namei.c +++ b/fs/ext2/namei.c | |||
@@ -73,8 +73,6 @@ static struct dentry *ext2_lookup(struct inode * dir, struct dentry *dentry, str | |||
73 | struct dentry *ext2_get_parent(struct dentry *child) | 73 | struct dentry *ext2_get_parent(struct dentry *child) |
74 | { | 74 | { |
75 | unsigned long ino; | 75 | unsigned long ino; |
76 | struct dentry *parent; | ||
77 | struct inode *inode; | ||
78 | struct dentry dotdot; | 76 | struct dentry dotdot; |
79 | 77 | ||
80 | dotdot.d_name.name = ".."; | 78 | dotdot.d_name.name = ".."; |
@@ -83,16 +81,7 @@ struct dentry *ext2_get_parent(struct dentry *child) | |||
83 | ino = ext2_inode_by_name(child->d_inode, &dotdot); | 81 | ino = ext2_inode_by_name(child->d_inode, &dotdot); |
84 | if (!ino) | 82 | if (!ino) |
85 | return ERR_PTR(-ENOENT); | 83 | return ERR_PTR(-ENOENT); |
86 | inode = ext2_iget(child->d_inode->i_sb, ino); | 84 | return d_obtain_alias(ext2_iget(child->d_inode->i_sb, ino)); |
87 | |||
88 | if (IS_ERR(inode)) | ||
89 | return ERR_CAST(inode); | ||
90 | parent = d_alloc_anon(inode); | ||
91 | if (!parent) { | ||
92 | iput(inode); | ||
93 | parent = ERR_PTR(-ENOMEM); | ||
94 | } | ||
95 | return parent; | ||
96 | } | 85 | } |
97 | 86 | ||
98 | /* | 87 | /* |
diff --git a/fs/ext3/namei.c b/fs/ext3/namei.c index de13e919cd81..880b54400ac0 100644 --- a/fs/ext3/namei.c +++ b/fs/ext3/namei.c | |||
@@ -1057,8 +1057,6 @@ static struct dentry *ext3_lookup(struct inode * dir, struct dentry *dentry, str | |||
1057 | struct dentry *ext3_get_parent(struct dentry *child) | 1057 | struct dentry *ext3_get_parent(struct dentry *child) |
1058 | { | 1058 | { |
1059 | unsigned long ino; | 1059 | unsigned long ino; |
1060 | struct dentry *parent; | ||
1061 | struct inode *inode; | ||
1062 | struct dentry dotdot; | 1060 | struct dentry dotdot; |
1063 | struct ext3_dir_entry_2 * de; | 1061 | struct ext3_dir_entry_2 * de; |
1064 | struct buffer_head *bh; | 1062 | struct buffer_head *bh; |
@@ -1068,7 +1066,6 @@ struct dentry *ext3_get_parent(struct dentry *child) | |||
1068 | dotdot.d_parent = child; /* confusing, isn't it! */ | 1066 | dotdot.d_parent = child; /* confusing, isn't it! */ |
1069 | 1067 | ||
1070 | bh = ext3_find_entry(&dotdot, &de); | 1068 | bh = ext3_find_entry(&dotdot, &de); |
1071 | inode = NULL; | ||
1072 | if (!bh) | 1069 | if (!bh) |
1073 | return ERR_PTR(-ENOENT); | 1070 | return ERR_PTR(-ENOENT); |
1074 | ino = le32_to_cpu(de->inode); | 1071 | ino = le32_to_cpu(de->inode); |
@@ -1080,16 +1077,7 @@ struct dentry *ext3_get_parent(struct dentry *child) | |||
1080 | return ERR_PTR(-EIO); | 1077 | return ERR_PTR(-EIO); |
1081 | } | 1078 | } |
1082 | 1079 | ||
1083 | inode = ext3_iget(child->d_inode->i_sb, ino); | 1080 | return d_obtain_alias(ext3_iget(child->d_inode->i_sb, ino)); |
1084 | if (IS_ERR(inode)) | ||
1085 | return ERR_CAST(inode); | ||
1086 | |||
1087 | parent = d_alloc_anon(inode); | ||
1088 | if (!parent) { | ||
1089 | iput(inode); | ||
1090 | parent = ERR_PTR(-ENOMEM); | ||
1091 | } | ||
1092 | return parent; | ||
1093 | } | 1081 | } |
1094 | 1082 | ||
1095 | #define S_SHIFT 12 | 1083 | #define S_SHIFT 12 |
diff --git a/fs/ext4/namei.c b/fs/ext4/namei.c index 92db9e945147..5b93a7d94d42 100644 --- a/fs/ext4/namei.c +++ b/fs/ext4/namei.c | |||
@@ -1083,16 +1083,7 @@ struct dentry *ext4_get_parent(struct dentry *child) | |||
1083 | return ERR_PTR(-EIO); | 1083 | return ERR_PTR(-EIO); |
1084 | } | 1084 | } |
1085 | 1085 | ||
1086 | inode = ext4_iget(child->d_inode->i_sb, ino); | 1086 | return d_obtain_alias(ext4_iget(child->d_inode->i_sb, ino)); |
1087 | if (IS_ERR(inode)) | ||
1088 | return ERR_CAST(inode); | ||
1089 | |||
1090 | parent = d_alloc_anon(inode); | ||
1091 | if (!parent) { | ||
1092 | iput(inode); | ||
1093 | parent = ERR_PTR(-ENOMEM); | ||
1094 | } | ||
1095 | return parent; | ||
1096 | } | 1087 | } |
1097 | 1088 | ||
1098 | #define S_SHIFT 12 | 1089 | #define S_SHIFT 12 |
diff --git a/fs/fat/inode.c b/fs/fat/inode.c index d12cdf2a0406..19eafbe3c379 100644 --- a/fs/fat/inode.c +++ b/fs/fat/inode.c | |||
@@ -681,33 +681,24 @@ static struct dentry *fat_fh_to_dentry(struct super_block *sb, | |||
681 | inode = NULL; | 681 | inode = NULL; |
682 | } | 682 | } |
683 | } | 683 | } |
684 | if (!inode) { | ||
685 | /* For now, do nothing | ||
686 | * What we could do is: | ||
687 | * follow the file starting at fh[4], and record | ||
688 | * the ".." entry, and the name of the fh[2] entry. | ||
689 | * The follow the ".." file finding the next step up. | ||
690 | * This way we build a path to the root of | ||
691 | * the tree. If this works, we lookup the path and so | ||
692 | * get this inode into the cache. | ||
693 | * Finally try the fat_iget lookup again | ||
694 | * If that fails, then weare totally out of luck | ||
695 | * But all that is for another day | ||
696 | */ | ||
697 | } | ||
698 | if (!inode) | ||
699 | return ERR_PTR(-ESTALE); | ||
700 | |||
701 | 684 | ||
702 | /* now to find a dentry. | 685 | /* |
703 | * If possible, get a well-connected one | 686 | * For now, do nothing if the inode is not found. |
687 | * | ||
688 | * What we could do is: | ||
689 | * | ||
690 | * - follow the file starting at fh[4], and record the ".." entry, | ||
691 | * and the name of the fh[2] entry. | ||
692 | * - then follow the ".." file finding the next step up. | ||
693 | * | ||
694 | * This way we build a path to the root of the tree. If this works, we | ||
695 | * lookup the path and so get this inode into the cache. Finally try | ||
696 | * the fat_iget lookup again. If that fails, then we are totally out | ||
697 | * of luck. But all that is for another day | ||
704 | */ | 698 | */ |
705 | result = d_alloc_anon(inode); | 699 | result = d_obtain_alias(inode); |
706 | if (result == NULL) { | 700 | if (!IS_ERR(result)) |
707 | iput(inode); | 701 | result->d_op = sb->s_root->d_op; |
708 | return ERR_PTR(-ENOMEM); | ||
709 | } | ||
710 | result->d_op = sb->s_root->d_op; | ||
711 | return result; | 702 | return result; |
712 | } | 703 | } |
713 | 704 | ||
@@ -754,15 +745,8 @@ static struct dentry *fat_get_parent(struct dentry *child) | |||
754 | } | 745 | } |
755 | inode = fat_build_inode(sb, de, i_pos); | 746 | inode = fat_build_inode(sb, de, i_pos); |
756 | brelse(bh); | 747 | brelse(bh); |
757 | if (IS_ERR(inode)) { | 748 | |
758 | parent = ERR_CAST(inode); | 749 | parent = d_obtain_alias(inode); |
759 | goto out; | ||
760 | } | ||
761 | parent = d_alloc_anon(inode); | ||
762 | if (!parent) { | ||
763 | iput(inode); | ||
764 | parent = ERR_PTR(-ENOMEM); | ||
765 | } | ||
766 | out: | 750 | out: |
767 | unlock_super(sb); | 751 | unlock_super(sb); |
768 | 752 | ||
diff --git a/fs/fuse/inode.c b/fs/fuse/inode.c index 54b1f0e1ef58..2e99f34b4435 100644 --- a/fs/fuse/inode.c +++ b/fs/fuse/inode.c | |||
@@ -596,12 +596,8 @@ static struct dentry *fuse_get_dentry(struct super_block *sb, | |||
596 | if (inode->i_generation != handle->generation) | 596 | if (inode->i_generation != handle->generation) |
597 | goto out_iput; | 597 | goto out_iput; |
598 | 598 | ||
599 | entry = d_alloc_anon(inode); | 599 | entry = d_obtain_alias(inode); |
600 | err = -ENOMEM; | 600 | if (!IS_ERR(entry) && get_node_id(inode) != FUSE_ROOT_ID) { |
601 | if (!entry) | ||
602 | goto out_iput; | ||
603 | |||
604 | if (get_node_id(inode) != FUSE_ROOT_ID) { | ||
605 | entry->d_op = &fuse_dentry_operations; | 601 | entry->d_op = &fuse_dentry_operations; |
606 | fuse_invalidate_entry_cache(entry); | 602 | fuse_invalidate_entry_cache(entry); |
607 | } | 603 | } |
@@ -696,17 +692,14 @@ static struct dentry *fuse_get_parent(struct dentry *child) | |||
696 | name.name = ".."; | 692 | name.name = ".."; |
697 | err = fuse_lookup_name(child_inode->i_sb, get_node_id(child_inode), | 693 | err = fuse_lookup_name(child_inode->i_sb, get_node_id(child_inode), |
698 | &name, &outarg, &inode); | 694 | &name, &outarg, &inode); |
699 | if (err && err != -ENOENT) | 695 | if (err) { |
696 | if (err == -ENOENT) | ||
697 | return ERR_PTR(-ESTALE); | ||
700 | return ERR_PTR(err); | 698 | return ERR_PTR(err); |
701 | if (err || !inode) | ||
702 | return ERR_PTR(-ESTALE); | ||
703 | |||
704 | parent = d_alloc_anon(inode); | ||
705 | if (!parent) { | ||
706 | iput(inode); | ||
707 | return ERR_PTR(-ENOMEM); | ||
708 | } | 699 | } |
709 | if (get_node_id(inode) != FUSE_ROOT_ID) { | 700 | |
701 | parent = d_obtain_alias(inode); | ||
702 | if (!IS_ERR(parent) && get_node_id(inode) != FUSE_ROOT_ID) { | ||
710 | parent->d_op = &fuse_dentry_operations; | 703 | parent->d_op = &fuse_dentry_operations; |
711 | fuse_invalidate_entry_cache(parent); | 704 | fuse_invalidate_entry_cache(parent); |
712 | } | 705 | } |
diff --git a/fs/gfs2/ops_export.c b/fs/gfs2/ops_export.c index 9cda8536530c..bbb8c36403a9 100644 --- a/fs/gfs2/ops_export.c +++ b/fs/gfs2/ops_export.c | |||
@@ -130,28 +130,17 @@ static int gfs2_get_name(struct dentry *parent, char *name, | |||
130 | static struct dentry *gfs2_get_parent(struct dentry *child) | 130 | static struct dentry *gfs2_get_parent(struct dentry *child) |
131 | { | 131 | { |
132 | struct qstr dotdot; | 132 | struct qstr dotdot; |
133 | struct inode *inode; | ||
134 | struct dentry *dentry; | 133 | struct dentry *dentry; |
135 | 134 | ||
136 | gfs2_str2qstr(&dotdot, ".."); | ||
137 | inode = gfs2_lookupi(child->d_inode, &dotdot, 1); | ||
138 | |||
139 | if (!inode) | ||
140 | return ERR_PTR(-ENOENT); | ||
141 | /* | 135 | /* |
142 | * In case of an error, @inode carries the error value, and we | 136 | * XXX(hch): it would be a good idea to keep this around as a |
143 | * have to return that as a(n invalid) pointer to dentry. | 137 | * static variable. |
144 | */ | 138 | */ |
145 | if (IS_ERR(inode)) | 139 | gfs2_str2qstr(&dotdot, ".."); |
146 | return ERR_CAST(inode); | ||
147 | |||
148 | dentry = d_alloc_anon(inode); | ||
149 | if (!dentry) { | ||
150 | iput(inode); | ||
151 | return ERR_PTR(-ENOMEM); | ||
152 | } | ||
153 | 140 | ||
154 | dentry->d_op = &gfs2_dops; | 141 | dentry = d_obtain_alias(gfs2_lookupi(child->d_inode, &dotdot, 1)); |
142 | if (!IS_ERR(dentry)) | ||
143 | dentry->d_op = &gfs2_dops; | ||
155 | return dentry; | 144 | return dentry; |
156 | } | 145 | } |
157 | 146 | ||
@@ -233,13 +222,9 @@ static struct dentry *gfs2_get_dentry(struct super_block *sb, | |||
233 | gfs2_glock_dq_uninit(&i_gh); | 222 | gfs2_glock_dq_uninit(&i_gh); |
234 | 223 | ||
235 | out_inode: | 224 | out_inode: |
236 | dentry = d_alloc_anon(inode); | 225 | dentry = d_obtain_alias(inode); |
237 | if (!dentry) { | 226 | if (!IS_ERR(dentry)) |
238 | iput(inode); | 227 | dentry->d_op = &gfs2_dops; |
239 | return ERR_PTR(-ENOMEM); | ||
240 | } | ||
241 | |||
242 | dentry->d_op = &gfs2_dops; | ||
243 | return dentry; | 228 | return dentry; |
244 | 229 | ||
245 | fail_rgd: | 230 | fail_rgd: |
diff --git a/fs/isofs/export.c b/fs/isofs/export.c index bb219138331a..e81a30593ba9 100644 --- a/fs/isofs/export.c +++ b/fs/isofs/export.c | |||
@@ -22,7 +22,7 @@ isofs_export_iget(struct super_block *sb, | |||
22 | __u32 generation) | 22 | __u32 generation) |
23 | { | 23 | { |
24 | struct inode *inode; | 24 | struct inode *inode; |
25 | struct dentry *result; | 25 | |
26 | if (block == 0) | 26 | if (block == 0) |
27 | return ERR_PTR(-ESTALE); | 27 | return ERR_PTR(-ESTALE); |
28 | inode = isofs_iget(sb, block, offset); | 28 | inode = isofs_iget(sb, block, offset); |
@@ -32,12 +32,7 @@ isofs_export_iget(struct super_block *sb, | |||
32 | iput(inode); | 32 | iput(inode); |
33 | return ERR_PTR(-ESTALE); | 33 | return ERR_PTR(-ESTALE); |
34 | } | 34 | } |
35 | result = d_alloc_anon(inode); | 35 | return d_obtain_alias(inode); |
36 | if (!result) { | ||
37 | iput(inode); | ||
38 | return ERR_PTR(-ENOMEM); | ||
39 | } | ||
40 | return result; | ||
41 | } | 36 | } |
42 | 37 | ||
43 | /* This function is surprisingly simple. The trick is understanding | 38 | /* This function is surprisingly simple. The trick is understanding |
@@ -51,7 +46,6 @@ static struct dentry *isofs_export_get_parent(struct dentry *child) | |||
51 | unsigned long parent_offset = 0; | 46 | unsigned long parent_offset = 0; |
52 | struct inode *child_inode = child->d_inode; | 47 | struct inode *child_inode = child->d_inode; |
53 | struct iso_inode_info *e_child_inode = ISOFS_I(child_inode); | 48 | struct iso_inode_info *e_child_inode = ISOFS_I(child_inode); |
54 | struct inode *parent_inode = NULL; | ||
55 | struct iso_directory_record *de = NULL; | 49 | struct iso_directory_record *de = NULL; |
56 | struct buffer_head * bh = NULL; | 50 | struct buffer_head * bh = NULL; |
57 | struct dentry *rv = NULL; | 51 | struct dentry *rv = NULL; |
@@ -104,28 +98,11 @@ static struct dentry *isofs_export_get_parent(struct dentry *child) | |||
104 | /* Normalize */ | 98 | /* Normalize */ |
105 | isofs_normalize_block_and_offset(de, &parent_block, &parent_offset); | 99 | isofs_normalize_block_and_offset(de, &parent_block, &parent_offset); |
106 | 100 | ||
107 | /* Get the inode. */ | 101 | rv = d_obtain_alias(isofs_iget(child_inode->i_sb, parent_block, |
108 | parent_inode = isofs_iget(child_inode->i_sb, | 102 | parent_offset)); |
109 | parent_block, | ||
110 | parent_offset); | ||
111 | if (IS_ERR(parent_inode)) { | ||
112 | rv = ERR_CAST(parent_inode); | ||
113 | if (rv != ERR_PTR(-ENOMEM)) | ||
114 | rv = ERR_PTR(-EACCES); | ||
115 | goto out; | ||
116 | } | ||
117 | |||
118 | /* Allocate the dentry. */ | ||
119 | rv = d_alloc_anon(parent_inode); | ||
120 | if (rv == NULL) { | ||
121 | rv = ERR_PTR(-ENOMEM); | ||
122 | goto out; | ||
123 | } | ||
124 | |||
125 | out: | 103 | out: |
126 | if (bh) { | 104 | if (bh) |
127 | brelse(bh); | 105 | brelse(bh); |
128 | } | ||
129 | return rv; | 106 | return rv; |
130 | } | 107 | } |
131 | 108 | ||
diff --git a/fs/jfs/namei.c b/fs/jfs/namei.c index 2aba82386810..e199dde7b83c 100644 --- a/fs/jfs/namei.c +++ b/fs/jfs/namei.c | |||
@@ -1511,25 +1511,12 @@ struct dentry *jfs_fh_to_parent(struct super_block *sb, struct fid *fid, | |||
1511 | 1511 | ||
1512 | struct dentry *jfs_get_parent(struct dentry *dentry) | 1512 | struct dentry *jfs_get_parent(struct dentry *dentry) |
1513 | { | 1513 | { |
1514 | struct super_block *sb = dentry->d_inode->i_sb; | ||
1515 | struct dentry *parent = ERR_PTR(-ENOENT); | ||
1516 | struct inode *inode; | ||
1517 | unsigned long parent_ino; | 1514 | unsigned long parent_ino; |
1518 | 1515 | ||
1519 | parent_ino = | 1516 | parent_ino = |
1520 | le32_to_cpu(JFS_IP(dentry->d_inode)->i_dtroot.header.idotdot); | 1517 | le32_to_cpu(JFS_IP(dentry->d_inode)->i_dtroot.header.idotdot); |
1521 | inode = jfs_iget(sb, parent_ino); | ||
1522 | if (IS_ERR(inode)) { | ||
1523 | parent = ERR_CAST(inode); | ||
1524 | } else { | ||
1525 | parent = d_alloc_anon(inode); | ||
1526 | if (!parent) { | ||
1527 | parent = ERR_PTR(-ENOMEM); | ||
1528 | iput(inode); | ||
1529 | } | ||
1530 | } | ||
1531 | 1518 | ||
1532 | return parent; | 1519 | return d_obtain_alias(jfs_iget(dentry->d_inode->i_sb, parent_ino)); |
1533 | } | 1520 | } |
1534 | 1521 | ||
1535 | const struct inode_operations jfs_dir_inode_operations = { | 1522 | const struct inode_operations jfs_dir_inode_operations = { |
diff --git a/fs/nfs/getroot.c b/fs/nfs/getroot.c index fae97196daad..b7c9b2df1f29 100644 --- a/fs/nfs/getroot.c +++ b/fs/nfs/getroot.c | |||
@@ -107,11 +107,10 @@ struct dentry *nfs_get_root(struct super_block *sb, struct nfs_fh *mntfh) | |||
107 | * if the dentry tree reaches them; however if the dentry already | 107 | * if the dentry tree reaches them; however if the dentry already |
108 | * exists, we'll pick it up at this point and use it as the root | 108 | * exists, we'll pick it up at this point and use it as the root |
109 | */ | 109 | */ |
110 | mntroot = d_alloc_anon(inode); | 110 | mntroot = d_obtain_alias(inode); |
111 | if (!mntroot) { | 111 | if (IS_ERR(mntroot)) { |
112 | iput(inode); | ||
113 | dprintk("nfs_get_root: get root dentry failed\n"); | 112 | dprintk("nfs_get_root: get root dentry failed\n"); |
114 | return ERR_PTR(-ENOMEM); | 113 | return mntroot; |
115 | } | 114 | } |
116 | 115 | ||
117 | security_d_instantiate(mntroot, inode); | 116 | security_d_instantiate(mntroot, inode); |
@@ -277,11 +276,10 @@ struct dentry *nfs4_get_root(struct super_block *sb, struct nfs_fh *mntfh) | |||
277 | * if the dentry tree reaches them; however if the dentry already | 276 | * if the dentry tree reaches them; however if the dentry already |
278 | * exists, we'll pick it up at this point and use it as the root | 277 | * exists, we'll pick it up at this point and use it as the root |
279 | */ | 278 | */ |
280 | mntroot = d_alloc_anon(inode); | 279 | mntroot = d_obtain_alias(inode); |
281 | if (!mntroot) { | 280 | if (IS_ERR(mntroot)) { |
282 | iput(inode); | ||
283 | dprintk("nfs_get_root: get root dentry failed\n"); | 281 | dprintk("nfs_get_root: get root dentry failed\n"); |
284 | return ERR_PTR(-ENOMEM); | 282 | return mntroot; |
285 | } | 283 | } |
286 | 284 | ||
287 | security_d_instantiate(mntroot, inode); | 285 | security_d_instantiate(mntroot, inode); |
diff --git a/fs/ntfs/namei.c b/fs/ntfs/namei.c index 9e8a95be7a1e..2ca00153b6ec 100644 --- a/fs/ntfs/namei.c +++ b/fs/ntfs/namei.c | |||
@@ -304,8 +304,6 @@ static struct dentry *ntfs_get_parent(struct dentry *child_dent) | |||
304 | ntfs_attr_search_ctx *ctx; | 304 | ntfs_attr_search_ctx *ctx; |
305 | ATTR_RECORD *attr; | 305 | ATTR_RECORD *attr; |
306 | FILE_NAME_ATTR *fn; | 306 | FILE_NAME_ATTR *fn; |
307 | struct inode *parent_vi; | ||
308 | struct dentry *parent_dent; | ||
309 | unsigned long parent_ino; | 307 | unsigned long parent_ino; |
310 | int err; | 308 | int err; |
311 | 309 | ||
@@ -345,24 +343,8 @@ try_next: | |||
345 | /* Release the search context and the mft record of the child. */ | 343 | /* Release the search context and the mft record of the child. */ |
346 | ntfs_attr_put_search_ctx(ctx); | 344 | ntfs_attr_put_search_ctx(ctx); |
347 | unmap_mft_record(ni); | 345 | unmap_mft_record(ni); |
348 | /* Get the inode of the parent directory. */ | 346 | |
349 | parent_vi = ntfs_iget(vi->i_sb, parent_ino); | 347 | return d_obtain_alias(ntfs_iget(vi->i_sb, parent_ino)); |
350 | if (IS_ERR(parent_vi) || unlikely(is_bad_inode(parent_vi))) { | ||
351 | if (!IS_ERR(parent_vi)) | ||
352 | iput(parent_vi); | ||
353 | ntfs_error(vi->i_sb, "Failed to get parent directory inode " | ||
354 | "0x%lx of child inode 0x%lx.", parent_ino, | ||
355 | vi->i_ino); | ||
356 | return ERR_PTR(-EACCES); | ||
357 | } | ||
358 | /* Finally get a dentry for the parent directory and return it. */ | ||
359 | parent_dent = d_alloc_anon(parent_vi); | ||
360 | if (unlikely(!parent_dent)) { | ||
361 | iput(parent_vi); | ||
362 | return ERR_PTR(-ENOMEM); | ||
363 | } | ||
364 | ntfs_debug("Done for inode 0x%lx.", vi->i_ino); | ||
365 | return parent_dent; | ||
366 | } | 348 | } |
367 | 349 | ||
368 | static struct inode *ntfs_nfs_get_inode(struct super_block *sb, | 350 | static struct inode *ntfs_nfs_get_inode(struct super_block *sb, |
diff --git a/fs/ocfs2/export.c b/fs/ocfs2/export.c index 67527cebf214..2f27b332d8b3 100644 --- a/fs/ocfs2/export.c +++ b/fs/ocfs2/export.c | |||
@@ -68,14 +68,9 @@ static struct dentry *ocfs2_get_dentry(struct super_block *sb, | |||
68 | return ERR_PTR(-ESTALE); | 68 | return ERR_PTR(-ESTALE); |
69 | } | 69 | } |
70 | 70 | ||
71 | result = d_alloc_anon(inode); | 71 | result = d_obtain_alias(inode); |
72 | 72 | if (!IS_ERR(result)) | |
73 | if (!result) { | 73 | result->d_op = &ocfs2_dentry_ops; |
74 | iput(inode); | ||
75 | mlog_errno(-ENOMEM); | ||
76 | return ERR_PTR(-ENOMEM); | ||
77 | } | ||
78 | result->d_op = &ocfs2_dentry_ops; | ||
79 | 74 | ||
80 | mlog_exit_ptr(result); | 75 | mlog_exit_ptr(result); |
81 | return result; | 76 | return result; |
@@ -86,7 +81,6 @@ static struct dentry *ocfs2_get_parent(struct dentry *child) | |||
86 | int status; | 81 | int status; |
87 | u64 blkno; | 82 | u64 blkno; |
88 | struct dentry *parent; | 83 | struct dentry *parent; |
89 | struct inode *inode; | ||
90 | struct inode *dir = child->d_inode; | 84 | struct inode *dir = child->d_inode; |
91 | 85 | ||
92 | mlog_entry("(0x%p, '%.*s')\n", child, | 86 | mlog_entry("(0x%p, '%.*s')\n", child, |
@@ -109,21 +103,9 @@ static struct dentry *ocfs2_get_parent(struct dentry *child) | |||
109 | goto bail_unlock; | 103 | goto bail_unlock; |
110 | } | 104 | } |
111 | 105 | ||
112 | inode = ocfs2_iget(OCFS2_SB(dir->i_sb), blkno, 0, 0); | 106 | parent = d_obtain_alias(ocfs2_iget(OCFS2_SB(dir->i_sb), blkno, 0, 0)); |
113 | if (IS_ERR(inode)) { | 107 | if (!IS_ERR(parent)) |
114 | mlog(ML_ERROR, "Unable to create inode %llu\n", | 108 | parent->d_op = &ocfs2_dentry_ops; |
115 | (unsigned long long)blkno); | ||
116 | parent = ERR_PTR(-EACCES); | ||
117 | goto bail_unlock; | ||
118 | } | ||
119 | |||
120 | parent = d_alloc_anon(inode); | ||
121 | if (!parent) { | ||
122 | iput(inode); | ||
123 | parent = ERR_PTR(-ENOMEM); | ||
124 | } | ||
125 | |||
126 | parent->d_op = &ocfs2_dentry_ops; | ||
127 | 109 | ||
128 | bail_unlock: | 110 | bail_unlock: |
129 | ocfs2_inode_unlock(dir, 0); | 111 | ocfs2_inode_unlock(dir, 0); |
diff --git a/fs/reiserfs/inode.c b/fs/reiserfs/inode.c index 5699171212ae..6c4c2c69449f 100644 --- a/fs/reiserfs/inode.c +++ b/fs/reiserfs/inode.c | |||
@@ -1522,7 +1522,6 @@ static struct dentry *reiserfs_get_dentry(struct super_block *sb, | |||
1522 | 1522 | ||
1523 | { | 1523 | { |
1524 | struct cpu_key key; | 1524 | struct cpu_key key; |
1525 | struct dentry *result; | ||
1526 | struct inode *inode; | 1525 | struct inode *inode; |
1527 | 1526 | ||
1528 | key.on_disk_key.k_objectid = objectid; | 1527 | key.on_disk_key.k_objectid = objectid; |
@@ -1535,16 +1534,8 @@ static struct dentry *reiserfs_get_dentry(struct super_block *sb, | |||
1535 | inode = NULL; | 1534 | inode = NULL; |
1536 | } | 1535 | } |
1537 | reiserfs_write_unlock(sb); | 1536 | reiserfs_write_unlock(sb); |
1538 | if (!inode) | 1537 | |
1539 | inode = ERR_PTR(-ESTALE); | 1538 | return d_obtain_alias(inode); |
1540 | if (IS_ERR(inode)) | ||
1541 | return ERR_CAST(inode); | ||
1542 | result = d_alloc_anon(inode); | ||
1543 | if (!result) { | ||
1544 | iput(inode); | ||
1545 | return ERR_PTR(-ENOMEM); | ||
1546 | } | ||
1547 | return result; | ||
1548 | } | 1539 | } |
1549 | 1540 | ||
1550 | struct dentry *reiserfs_fh_to_dentry(struct super_block *sb, struct fid *fid, | 1541 | struct dentry *reiserfs_fh_to_dentry(struct super_block *sb, struct fid *fid, |
diff --git a/fs/reiserfs/namei.c b/fs/reiserfs/namei.c index c1add28dd45e..f89ebb943f3f 100644 --- a/fs/reiserfs/namei.c +++ b/fs/reiserfs/namei.c | |||
@@ -383,7 +383,6 @@ struct dentry *reiserfs_get_parent(struct dentry *child) | |||
383 | struct inode *inode = NULL; | 383 | struct inode *inode = NULL; |
384 | struct reiserfs_dir_entry de; | 384 | struct reiserfs_dir_entry de; |
385 | INITIALIZE_PATH(path_to_entry); | 385 | INITIALIZE_PATH(path_to_entry); |
386 | struct dentry *parent; | ||
387 | struct inode *dir = child->d_inode; | 386 | struct inode *dir = child->d_inode; |
388 | 387 | ||
389 | if (dir->i_nlink == 0) { | 388 | if (dir->i_nlink == 0) { |
@@ -401,15 +400,7 @@ struct dentry *reiserfs_get_parent(struct dentry *child) | |||
401 | inode = reiserfs_iget(dir->i_sb, (struct cpu_key *)&(de.de_dir_id)); | 400 | inode = reiserfs_iget(dir->i_sb, (struct cpu_key *)&(de.de_dir_id)); |
402 | reiserfs_write_unlock(dir->i_sb); | 401 | reiserfs_write_unlock(dir->i_sb); |
403 | 402 | ||
404 | if (!inode || IS_ERR(inode)) { | 403 | return d_obtain_alias(inode); |
405 | return ERR_PTR(-EACCES); | ||
406 | } | ||
407 | parent = d_alloc_anon(inode); | ||
408 | if (!parent) { | ||
409 | iput(inode); | ||
410 | parent = ERR_PTR(-ENOMEM); | ||
411 | } | ||
412 | return parent; | ||
413 | } | 404 | } |
414 | 405 | ||
415 | /* add entry to the directory (entry can be hidden). | 406 | /* add entry to the directory (entry can be hidden). |
diff --git a/fs/udf/namei.c b/fs/udf/namei.c index d3231947db19..7578fae12d3c 100644 --- a/fs/udf/namei.c +++ b/fs/udf/namei.c | |||
@@ -1243,7 +1243,6 @@ end_rename: | |||
1243 | 1243 | ||
1244 | static struct dentry *udf_get_parent(struct dentry *child) | 1244 | static struct dentry *udf_get_parent(struct dentry *child) |
1245 | { | 1245 | { |
1246 | struct dentry *parent; | ||
1247 | struct inode *inode = NULL; | 1246 | struct inode *inode = NULL; |
1248 | struct dentry dotdot; | 1247 | struct dentry dotdot; |
1249 | struct fileIdentDesc cfi; | 1248 | struct fileIdentDesc cfi; |
@@ -1266,13 +1265,7 @@ static struct dentry *udf_get_parent(struct dentry *child) | |||
1266 | goto out_unlock; | 1265 | goto out_unlock; |
1267 | unlock_kernel(); | 1266 | unlock_kernel(); |
1268 | 1267 | ||
1269 | parent = d_alloc_anon(inode); | 1268 | return d_obtain_alias(inode); |
1270 | if (!parent) { | ||
1271 | iput(inode); | ||
1272 | parent = ERR_PTR(-ENOMEM); | ||
1273 | } | ||
1274 | |||
1275 | return parent; | ||
1276 | out_unlock: | 1269 | out_unlock: |
1277 | unlock_kernel(); | 1270 | unlock_kernel(); |
1278 | return ERR_PTR(-EACCES); | 1271 | return ERR_PTR(-EACCES); |
@@ -1283,7 +1276,6 @@ static struct dentry *udf_nfs_get_inode(struct super_block *sb, u32 block, | |||
1283 | u16 partref, __u32 generation) | 1276 | u16 partref, __u32 generation) |
1284 | { | 1277 | { |
1285 | struct inode *inode; | 1278 | struct inode *inode; |
1286 | struct dentry *result; | ||
1287 | kernel_lb_addr loc; | 1279 | kernel_lb_addr loc; |
1288 | 1280 | ||
1289 | if (block == 0) | 1281 | if (block == 0) |
@@ -1300,12 +1292,7 @@ static struct dentry *udf_nfs_get_inode(struct super_block *sb, u32 block, | |||
1300 | iput(inode); | 1292 | iput(inode); |
1301 | return ERR_PTR(-ESTALE); | 1293 | return ERR_PTR(-ESTALE); |
1302 | } | 1294 | } |
1303 | result = d_alloc_anon(inode); | 1295 | return d_obtain_alias(inode); |
1304 | if (!result) { | ||
1305 | iput(inode); | ||
1306 | return ERR_PTR(-ENOMEM); | ||
1307 | } | ||
1308 | return result; | ||
1309 | } | 1296 | } |
1310 | 1297 | ||
1311 | static struct dentry *udf_fh_to_dentry(struct super_block *sb, | 1298 | static struct dentry *udf_fh_to_dentry(struct super_block *sb, |
diff --git a/fs/xfs/linux-2.6/xfs_export.c b/fs/xfs/linux-2.6/xfs_export.c index 24fd598af846..7f7abec25e14 100644 --- a/fs/xfs/linux-2.6/xfs_export.c +++ b/fs/xfs/linux-2.6/xfs_export.c | |||
@@ -148,7 +148,6 @@ xfs_fs_fh_to_dentry(struct super_block *sb, struct fid *fid, | |||
148 | { | 148 | { |
149 | struct xfs_fid64 *fid64 = (struct xfs_fid64 *)fid; | 149 | struct xfs_fid64 *fid64 = (struct xfs_fid64 *)fid; |
150 | struct inode *inode = NULL; | 150 | struct inode *inode = NULL; |
151 | struct dentry *result; | ||
152 | 151 | ||
153 | if (fh_len < xfs_fileid_length(fileid_type)) | 152 | if (fh_len < xfs_fileid_length(fileid_type)) |
154 | return NULL; | 153 | return NULL; |
@@ -164,16 +163,7 @@ xfs_fs_fh_to_dentry(struct super_block *sb, struct fid *fid, | |||
164 | break; | 163 | break; |
165 | } | 164 | } |
166 | 165 | ||
167 | if (!inode) | 166 | return d_obtain_alias(inode); |
168 | return NULL; | ||
169 | if (IS_ERR(inode)) | ||
170 | return ERR_CAST(inode); | ||
171 | result = d_alloc_anon(inode); | ||
172 | if (!result) { | ||
173 | iput(inode); | ||
174 | return ERR_PTR(-ENOMEM); | ||
175 | } | ||
176 | return result; | ||
177 | } | 167 | } |
178 | 168 | ||
179 | STATIC struct dentry * | 169 | STATIC struct dentry * |
@@ -182,7 +172,6 @@ xfs_fs_fh_to_parent(struct super_block *sb, struct fid *fid, | |||
182 | { | 172 | { |
183 | struct xfs_fid64 *fid64 = (struct xfs_fid64 *)fid; | 173 | struct xfs_fid64 *fid64 = (struct xfs_fid64 *)fid; |
184 | struct inode *inode = NULL; | 174 | struct inode *inode = NULL; |
185 | struct dentry *result; | ||
186 | 175 | ||
187 | switch (fileid_type) { | 176 | switch (fileid_type) { |
188 | case FILEID_INO32_GEN_PARENT: | 177 | case FILEID_INO32_GEN_PARENT: |
@@ -195,16 +184,7 @@ xfs_fs_fh_to_parent(struct super_block *sb, struct fid *fid, | |||
195 | break; | 184 | break; |
196 | } | 185 | } |
197 | 186 | ||
198 | if (!inode) | 187 | return d_obtain_alias(inode); |
199 | return NULL; | ||
200 | if (IS_ERR(inode)) | ||
201 | return ERR_CAST(inode); | ||
202 | result = d_alloc_anon(inode); | ||
203 | if (!result) { | ||
204 | iput(inode); | ||
205 | return ERR_PTR(-ENOMEM); | ||
206 | } | ||
207 | return result; | ||
208 | } | 188 | } |
209 | 189 | ||
210 | STATIC struct dentry * | 190 | STATIC struct dentry * |
@@ -213,18 +193,12 @@ xfs_fs_get_parent( | |||
213 | { | 193 | { |
214 | int error; | 194 | int error; |
215 | struct xfs_inode *cip; | 195 | struct xfs_inode *cip; |
216 | struct dentry *parent; | ||
217 | 196 | ||
218 | error = xfs_lookup(XFS_I(child->d_inode), &xfs_name_dotdot, &cip, NULL); | 197 | error = xfs_lookup(XFS_I(child->d_inode), &xfs_name_dotdot, &cip, NULL); |
219 | if (unlikely(error)) | 198 | if (unlikely(error)) |
220 | return ERR_PTR(-error); | 199 | return ERR_PTR(-error); |
221 | 200 | ||
222 | parent = d_alloc_anon(VFS_I(cip)); | 201 | return d_obtain_alias(VFS_I(cip)); |
223 | if (unlikely(!parent)) { | ||
224 | iput(VFS_I(cip)); | ||
225 | return ERR_PTR(-ENOMEM); | ||
226 | } | ||
227 | return parent; | ||
228 | } | 202 | } |
229 | 203 | ||
230 | const struct export_operations xfs_export_operations = { | 204 | const struct export_operations xfs_export_operations = { |
diff --git a/fs/xfs/linux-2.6/xfs_ioctl.c b/fs/xfs/linux-2.6/xfs_ioctl.c index 48799ba7e3e6..d3438c72dcaf 100644 --- a/fs/xfs/linux-2.6/xfs_ioctl.c +++ b/fs/xfs/linux-2.6/xfs_ioctl.c | |||
@@ -311,11 +311,10 @@ xfs_open_by_handle( | |||
311 | return new_fd; | 311 | return new_fd; |
312 | } | 312 | } |
313 | 313 | ||
314 | dentry = d_alloc_anon(inode); | 314 | dentry = d_obtain_alias(inode); |
315 | if (dentry == NULL) { | 315 | if (IS_ERR(dentry)) { |
316 | iput(inode); | ||
317 | put_unused_fd(new_fd); | 316 | put_unused_fd(new_fd); |
318 | return -XFS_ERROR(ENOMEM); | 317 | return PTR_ERR(dentry); |
319 | } | 318 | } |
320 | 319 | ||
321 | /* Ensure umount returns EBUSY on umounts while this file is open. */ | 320 | /* Ensure umount returns EBUSY on umounts while this file is open. */ |