diff options
Diffstat (limited to 'fs/gfs2/export.c')
| -rw-r--r-- | fs/gfs2/export.c | 46 |
1 files changed, 4 insertions, 42 deletions
diff --git a/fs/gfs2/export.c b/fs/gfs2/export.c index 06d582732d34..5ab3839dfcb9 100644 --- a/fs/gfs2/export.c +++ b/fs/gfs2/export.c | |||
| @@ -138,10 +138,8 @@ static struct dentry *gfs2_get_dentry(struct super_block *sb, | |||
| 138 | struct gfs2_inum_host *inum) | 138 | struct gfs2_inum_host *inum) |
| 139 | { | 139 | { |
| 140 | struct gfs2_sbd *sdp = sb->s_fs_info; | 140 | struct gfs2_sbd *sdp = sb->s_fs_info; |
| 141 | struct gfs2_holder i_gh; | ||
| 142 | struct inode *inode; | 141 | struct inode *inode; |
| 143 | struct dentry *dentry; | 142 | struct dentry *dentry; |
| 144 | int error; | ||
| 145 | 143 | ||
| 146 | inode = gfs2_ilookup(sb, inum->no_addr); | 144 | inode = gfs2_ilookup(sb, inum->no_addr); |
| 147 | if (inode) { | 145 | if (inode) { |
| @@ -152,52 +150,16 @@ static struct dentry *gfs2_get_dentry(struct super_block *sb, | |||
| 152 | goto out_inode; | 150 | goto out_inode; |
| 153 | } | 151 | } |
| 154 | 152 | ||
| 155 | error = gfs2_glock_nq_num(sdp, inum->no_addr, &gfs2_inode_glops, | 153 | inode = gfs2_lookup_by_inum(sdp, inum->no_addr, &inum->no_formal_ino, |
| 156 | LM_ST_SHARED, LM_FLAG_ANY, &i_gh); | 154 | GFS2_BLKST_DINODE); |
| 157 | if (error) | 155 | if (IS_ERR(inode)) |
| 158 | return ERR_PTR(error); | 156 | return ERR_CAST(inode); |
| 159 | |||
| 160 | error = gfs2_check_blk_type(sdp, inum->no_addr, GFS2_BLKST_DINODE); | ||
| 161 | if (error) | ||
| 162 | goto fail; | ||
| 163 | |||
| 164 | inode = gfs2_inode_lookup(sb, DT_UNKNOWN, inum->no_addr, 0); | ||
| 165 | if (IS_ERR(inode)) { | ||
| 166 | error = PTR_ERR(inode); | ||
| 167 | goto fail; | ||
| 168 | } | ||
| 169 | |||
| 170 | error = gfs2_inode_refresh(GFS2_I(inode)); | ||
| 171 | if (error) { | ||
| 172 | iput(inode); | ||
| 173 | goto fail; | ||
| 174 | } | ||
| 175 | |||
| 176 | /* Pick up the works we bypass in gfs2_inode_lookup */ | ||
| 177 | if (inode->i_state & I_NEW) | ||
| 178 | gfs2_set_iop(inode); | ||
| 179 | |||
| 180 | if (GFS2_I(inode)->i_no_formal_ino != inum->no_formal_ino) { | ||
| 181 | iput(inode); | ||
| 182 | goto fail; | ||
| 183 | } | ||
| 184 | |||
| 185 | error = -EIO; | ||
| 186 | if (GFS2_I(inode)->i_diskflags & GFS2_DIF_SYSTEM) { | ||
| 187 | iput(inode); | ||
| 188 | goto fail; | ||
| 189 | } | ||
| 190 | |||
| 191 | gfs2_glock_dq_uninit(&i_gh); | ||
| 192 | 157 | ||
| 193 | out_inode: | 158 | out_inode: |
| 194 | dentry = d_obtain_alias(inode); | 159 | dentry = d_obtain_alias(inode); |
| 195 | if (!IS_ERR(dentry)) | 160 | if (!IS_ERR(dentry)) |
| 196 | dentry->d_op = &gfs2_dops; | 161 | dentry->d_op = &gfs2_dops; |
| 197 | return dentry; | 162 | return dentry; |
| 198 | fail: | ||
| 199 | gfs2_glock_dq_uninit(&i_gh); | ||
| 200 | return ERR_PTR(error); | ||
| 201 | } | 163 | } |
| 202 | 164 | ||
| 203 | static struct dentry *gfs2_fh_to_dentry(struct super_block *sb, struct fid *fid, | 165 | static struct dentry *gfs2_fh_to_dentry(struct super_block *sb, struct fid *fid, |
