diff options
Diffstat (limited to 'fs/gfs2/export.c')
| -rw-r--r-- | fs/gfs2/export.c | 36 |
1 files changed, 4 insertions, 32 deletions
diff --git a/fs/gfs2/export.c b/fs/gfs2/export.c index 9200ef221716..d15876e9aa26 100644 --- a/fs/gfs2/export.c +++ b/fs/gfs2/export.c | |||
| @@ -143,17 +143,14 @@ static struct dentry *gfs2_get_parent(struct dentry *child) | |||
| 143 | } | 143 | } |
| 144 | 144 | ||
| 145 | static struct dentry *gfs2_get_dentry(struct super_block *sb, | 145 | static struct dentry *gfs2_get_dentry(struct super_block *sb, |
| 146 | struct gfs2_inum_host *inum) | 146 | struct gfs2_inum_host *inum) |
| 147 | { | 147 | { |
| 148 | struct gfs2_sbd *sdp = sb->s_fs_info; | 148 | struct gfs2_sbd *sdp = sb->s_fs_info; |
| 149 | struct gfs2_holder i_gh, ri_gh, rgd_gh; | 149 | struct gfs2_holder i_gh; |
| 150 | struct gfs2_rgrpd *rgd; | ||
| 151 | struct inode *inode; | 150 | struct inode *inode; |
| 152 | struct dentry *dentry; | 151 | struct dentry *dentry; |
| 153 | int error; | 152 | int error; |
| 154 | 153 | ||
| 155 | /* System files? */ | ||
| 156 | |||
| 157 | inode = gfs2_ilookup(sb, inum->no_addr); | 154 | inode = gfs2_ilookup(sb, inum->no_addr); |
| 158 | if (inode) { | 155 | if (inode) { |
| 159 | if (GFS2_I(inode)->i_no_formal_ino != inum->no_formal_ino) { | 156 | if (GFS2_I(inode)->i_no_formal_ino != inum->no_formal_ino) { |
| @@ -168,29 +165,11 @@ static struct dentry *gfs2_get_dentry(struct super_block *sb, | |||
| 168 | if (error) | 165 | if (error) |
| 169 | return ERR_PTR(error); | 166 | return ERR_PTR(error); |
| 170 | 167 | ||
| 171 | error = gfs2_rindex_hold(sdp, &ri_gh); | 168 | error = gfs2_check_blk_type(sdp, inum->no_addr, GFS2_BLKST_DINODE); |
| 172 | if (error) | 169 | if (error) |
| 173 | goto fail; | 170 | goto fail; |
| 174 | 171 | ||
| 175 | error = -EINVAL; | 172 | inode = gfs2_inode_lookup(sb, DT_UNKNOWN, inum->no_addr, 0, 0); |
| 176 | rgd = gfs2_blk2rgrpd(sdp, inum->no_addr); | ||
| 177 | if (!rgd) | ||
| 178 | goto fail_rindex; | ||
| 179 | |||
| 180 | error = gfs2_glock_nq_init(rgd->rd_gl, LM_ST_SHARED, 0, &rgd_gh); | ||
| 181 | if (error) | ||
| 182 | goto fail_rindex; | ||
| 183 | |||
| 184 | error = -ESTALE; | ||
| 185 | if (gfs2_get_block_type(rgd, inum->no_addr) != GFS2_BLKST_DINODE) | ||
| 186 | goto fail_rgd; | ||
| 187 | |||
| 188 | gfs2_glock_dq_uninit(&rgd_gh); | ||
| 189 | gfs2_glock_dq_uninit(&ri_gh); | ||
| 190 | |||
| 191 | inode = gfs2_inode_lookup(sb, DT_UNKNOWN, | ||
| 192 | inum->no_addr, | ||
| 193 | 0, 0); | ||
| 194 | if (IS_ERR(inode)) { | 173 | if (IS_ERR(inode)) { |
| 195 | error = PTR_ERR(inode); | 174 | error = PTR_ERR(inode); |
| 196 | goto fail; | 175 | goto fail; |
| @@ -224,13 +203,6 @@ out_inode: | |||
| 224 | if (!IS_ERR(dentry)) | 203 | if (!IS_ERR(dentry)) |
| 225 | dentry->d_op = &gfs2_dops; | 204 | dentry->d_op = &gfs2_dops; |
| 226 | return dentry; | 205 | return dentry; |
| 227 | |||
| 228 | fail_rgd: | ||
| 229 | gfs2_glock_dq_uninit(&rgd_gh); | ||
| 230 | |||
| 231 | fail_rindex: | ||
| 232 | gfs2_glock_dq_uninit(&ri_gh); | ||
| 233 | |||
| 234 | fail: | 206 | fail: |
| 235 | gfs2_glock_dq_uninit(&i_gh); | 207 | gfs2_glock_dq_uninit(&i_gh); |
| 236 | return ERR_PTR(error); | 208 | return ERR_PTR(error); |
