aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--fs/gfs2/ops_inode.c15
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
248out_brelse:
249 brelse(dibh);
239out_end_trans: 250out_end_trans:
240 gfs2_trans_end(sdp); 251 gfs2_trans_end(sdp);
241out_ipres: 252out_ipres: