diff options
Diffstat (limited to 'fs/gfs2/ops_export.c')
-rw-r--r-- | fs/gfs2/ops_export.c | 60 |
1 files changed, 24 insertions, 36 deletions
diff --git a/fs/gfs2/ops_export.c b/fs/gfs2/ops_export.c index a376ead7d0cd..eacc1c092f91 100644 --- a/fs/gfs2/ops_export.c +++ b/fs/gfs2/ops_export.c | |||
@@ -66,7 +66,7 @@ static int gfs2_encode_fh(struct dentry *dentry, __u32 *fh, int *len, | |||
66 | { | 66 | { |
67 | struct inode *inode = dentry->d_inode; | 67 | struct inode *inode = dentry->d_inode; |
68 | struct super_block *sb = inode->i_sb; | 68 | struct super_block *sb = inode->i_sb; |
69 | struct gfs2_inode *ip = inode->u.generic_ip; | 69 | struct gfs2_inode *ip = GFS2_I(inode); |
70 | 70 | ||
71 | if (*len < 4 || (connectable && *len < 8)) | 71 | if (*len < 4 || (connectable && *len < 8)) |
72 | return 255; | 72 | return 255; |
@@ -86,8 +86,8 @@ static int gfs2_encode_fh(struct dentry *dentry, __u32 *fh, int *len, | |||
86 | 86 | ||
87 | spin_lock(&dentry->d_lock); | 87 | spin_lock(&dentry->d_lock); |
88 | inode = dentry->d_parent->d_inode; | 88 | inode = dentry->d_parent->d_inode; |
89 | ip = inode->u.generic_ip; | 89 | ip = GFS2_I(inode); |
90 | gfs2_inode_hold(ip); | 90 | igrab(inode); |
91 | spin_unlock(&dentry->d_lock); | 91 | spin_unlock(&dentry->d_lock); |
92 | 92 | ||
93 | fh[4] = ip->i_num.no_formal_ino >> 32; | 93 | fh[4] = ip->i_num.no_formal_ino >> 32; |
@@ -100,7 +100,7 @@ static int gfs2_encode_fh(struct dentry *dentry, __u32 *fh, int *len, | |||
100 | fh[7] = cpu_to_be32(fh[7]); | 100 | fh[7] = cpu_to_be32(fh[7]); |
101 | *len = 8; | 101 | *len = 8; |
102 | 102 | ||
103 | gfs2_inode_put(ip); | 103 | iput(inode); |
104 | 104 | ||
105 | return *len; | 105 | return *len; |
106 | } | 106 | } |
@@ -142,8 +142,8 @@ static int gfs2_get_name(struct dentry *parent, char *name, | |||
142 | if (!S_ISDIR(dir->i_mode) || !inode) | 142 | if (!S_ISDIR(dir->i_mode) || !inode) |
143 | return -EINVAL; | 143 | return -EINVAL; |
144 | 144 | ||
145 | dip = dir->u.generic_ip; | 145 | dip = GFS2_I(dir); |
146 | ip = inode->u.generic_ip; | 146 | ip = GFS2_I(inode); |
147 | 147 | ||
148 | *name = 0; | 148 | *name = 0; |
149 | gnfd.inum = ip->i_num; | 149 | gnfd.inum = ip->i_num; |
@@ -189,39 +189,30 @@ static struct dentry *gfs2_get_parent(struct dentry *child) | |||
189 | static struct dentry *gfs2_get_dentry(struct super_block *sb, void *inum_p) | 189 | static struct dentry *gfs2_get_dentry(struct super_block *sb, void *inum_p) |
190 | { | 190 | { |
191 | struct gfs2_sbd *sdp = sb->s_fs_info; | 191 | struct gfs2_sbd *sdp = sb->s_fs_info; |
192 | struct gfs2_inum *inum = (struct gfs2_inum *)inum_p; | 192 | struct gfs2_inum *inum = inum_p; |
193 | struct gfs2_holder i_gh, ri_gh, rgd_gh; | 193 | struct gfs2_holder i_gh, ri_gh, rgd_gh; |
194 | struct gfs2_rgrpd *rgd; | 194 | struct gfs2_rgrpd *rgd; |
195 | struct gfs2_inode *ip; | ||
196 | struct inode *inode; | 195 | struct inode *inode; |
197 | struct dentry *dentry; | 196 | struct dentry *dentry; |
198 | int error; | 197 | int error; |
199 | 198 | ||
200 | /* System files? */ | 199 | /* System files? */ |
201 | 200 | ||
202 | inode = gfs2_iget(sb, inum); | 201 | inode = gfs2_ilookup(sb, inum); |
203 | if (inode) { | 202 | if (inode) { |
204 | ip = inode->u.generic_ip; | 203 | if (GFS2_I(inode)->i_num.no_formal_ino != inum->no_formal_ino) { |
205 | if (ip->i_num.no_formal_ino != inum->no_formal_ino) { | ||
206 | iput(inode); | 204 | iput(inode); |
207 | return ERR_PTR(-ESTALE); | 205 | return ERR_PTR(-ESTALE); |
208 | } | 206 | } |
209 | goto out_inode; | 207 | goto out_inode; |
210 | } | 208 | } |
211 | 209 | ||
212 | error = gfs2_glock_nq_num(sdp, | 210 | error = gfs2_glock_nq_num(sdp, inum->no_addr, &gfs2_inode_glops, |
213 | inum->no_addr, &gfs2_inode_glops, | ||
214 | LM_ST_SHARED, LM_FLAG_ANY | GL_LOCAL_EXCL, | 211 | LM_ST_SHARED, LM_FLAG_ANY | GL_LOCAL_EXCL, |
215 | &i_gh); | 212 | &i_gh); |
216 | if (error) | 213 | if (error) |
217 | return ERR_PTR(error); | 214 | return ERR_PTR(error); |
218 | 215 | ||
219 | error = gfs2_inode_get(i_gh.gh_gl, inum, NO_CREATE, &ip); | ||
220 | if (error) | ||
221 | goto fail; | ||
222 | if (ip) | ||
223 | goto out_ip; | ||
224 | |||
225 | error = gfs2_rindex_hold(sdp, &ri_gh); | 216 | error = gfs2_rindex_hold(sdp, &ri_gh); |
226 | if (error) | 217 | if (error) |
227 | goto fail; | 218 | goto fail; |
@@ -242,32 +233,29 @@ static struct dentry *gfs2_get_dentry(struct super_block *sb, void *inum_p) | |||
242 | gfs2_glock_dq_uninit(&rgd_gh); | 233 | gfs2_glock_dq_uninit(&rgd_gh); |
243 | gfs2_glock_dq_uninit(&ri_gh); | 234 | gfs2_glock_dq_uninit(&ri_gh); |
244 | 235 | ||
245 | error = gfs2_inode_get(i_gh.gh_gl, inum, CREATE, &ip); | 236 | inode = gfs2_inode_lookup(sb, inum, DT_UNKNOWN); |
246 | if (error) | 237 | if (!inode) |
238 | goto fail; | ||
239 | if (IS_ERR(inode)) { | ||
240 | error = PTR_ERR(inode); | ||
247 | goto fail; | 241 | goto fail; |
242 | } | ||
248 | 243 | ||
249 | error = gfs2_inode_refresh(ip); | 244 | error = gfs2_inode_refresh(GFS2_I(inode)); |
250 | if (error) { | 245 | if (error) { |
251 | gfs2_inode_put(ip); | 246 | iput(inode); |
252 | goto fail; | 247 | goto fail; |
253 | } | 248 | } |
254 | 249 | ||
255 | out_ip: | ||
256 | error = -EIO; | 250 | error = -EIO; |
257 | if (ip->i_di.di_flags & GFS2_DIF_SYSTEM) { | 251 | if (GFS2_I(inode)->i_di.di_flags & GFS2_DIF_SYSTEM) { |
258 | gfs2_inode_put(ip); | 252 | iput(inode); |
259 | goto fail; | 253 | goto fail; |
260 | } | 254 | } |
261 | 255 | ||
262 | gfs2_glock_dq_uninit(&i_gh); | 256 | gfs2_glock_dq_uninit(&i_gh); |
263 | 257 | ||
264 | inode = gfs2_ip2v(ip); | 258 | out_inode: |
265 | gfs2_inode_put(ip); | ||
266 | |||
267 | if (!inode) | ||
268 | return ERR_PTR(-ENOMEM); | ||
269 | |||
270 | out_inode: | ||
271 | dentry = d_alloc_anon(inode); | 259 | dentry = d_alloc_anon(inode); |
272 | if (!dentry) { | 260 | if (!dentry) { |
273 | iput(inode); | 261 | iput(inode); |
@@ -276,13 +264,13 @@ static struct dentry *gfs2_get_dentry(struct super_block *sb, void *inum_p) | |||
276 | 264 | ||
277 | return dentry; | 265 | return dentry; |
278 | 266 | ||
279 | fail_rgd: | 267 | fail_rgd: |
280 | gfs2_glock_dq_uninit(&rgd_gh); | 268 | gfs2_glock_dq_uninit(&rgd_gh); |
281 | 269 | ||
282 | fail_rindex: | 270 | fail_rindex: |
283 | gfs2_glock_dq_uninit(&ri_gh); | 271 | gfs2_glock_dq_uninit(&ri_gh); |
284 | 272 | ||
285 | fail: | 273 | fail: |
286 | gfs2_glock_dq_uninit(&i_gh); | 274 | gfs2_glock_dq_uninit(&i_gh); |
287 | return ERR_PTR(error); | 275 | return ERR_PTR(error); |
288 | } | 276 | } |