diff options
-rw-r--r-- | fs/gfs2/ops_inode.c | 15 |
1 files changed, 13 insertions, 2 deletions
diff --git a/fs/gfs2/ops_inode.c b/fs/gfs2/ops_inode.c index 1005f9eb456e..acb6f69b02ed 100644 --- a/fs/gfs2/ops_inode.c +++ b/fs/gfs2/ops_inode.c | |||
@@ -145,6 +145,7 @@ static int gfs2_link(struct dentry *old_dentry, struct inode *dir, | |||
145 | struct inode *inode = old_dentry->d_inode; | 145 | struct inode *inode = old_dentry->d_inode; |
146 | struct gfs2_inode *ip = GFS2_I(inode); | 146 | struct gfs2_inode *ip = GFS2_I(inode); |
147 | struct gfs2_holder ghs[2]; | 147 | struct gfs2_holder ghs[2]; |
148 | struct buffer_head *dibh; | ||
148 | int alloc_required; | 149 | int alloc_required; |
149 | int error; | 150 | int error; |
150 | 151 | ||
@@ -230,12 +231,22 @@ static int gfs2_link(struct dentry *old_dentry, struct inode *dir, | |||
230 | goto out_ipres; | 231 | goto out_ipres; |
231 | } | 232 | } |
232 | 233 | ||
233 | error = gfs2_dir_add(dir, &dentry->d_name, ip, IF2DT(inode->i_mode)); | 234 | error = gfs2_meta_inode_buffer(ip, &dibh); |
234 | if (error) | 235 | if (error) |
235 | goto out_end_trans; | 236 | goto out_end_trans; |
236 | 237 | ||
237 | error = gfs2_change_nlink(ip, +1); | 238 | error = gfs2_dir_add(dir, &dentry->d_name, ip, IF2DT(inode->i_mode)); |
239 | if (error) | ||
240 | goto out_brelse; | ||
241 | |||
242 | gfs2_trans_add_bh(ip->i_gl, dibh, 1); | ||
243 | inc_nlink(&ip->i_inode); | ||
244 | ip->i_inode.i_ctime = CURRENT_TIME; | ||
245 | gfs2_dinode_out(ip, dibh->b_data); | ||
246 | mark_inode_dirty(&ip->i_inode); | ||
238 | 247 | ||
248 | out_brelse: | ||
249 | brelse(dibh); | ||
239 | out_end_trans: | 250 | out_end_trans: |
240 | gfs2_trans_end(sdp); | 251 | gfs2_trans_end(sdp); |
241 | out_ipres: | 252 | out_ipres: |