Skip to content

Commit

Permalink
[GFS2] Correct lock ordering in unlink
Browse files Browse the repository at this point in the history
This patch corrects the lock ordering in unlink to be the same as
that in the rest of GFS2, i.e. parent -> child -> rgrp.

Signed-off-by: Steven Whitehouse <swhiteho@redhat.com>
  • Loading branch information
Steven Whitehouse committed Oct 10, 2007
1 parent e9bd2b3 commit 8497a46
Showing 1 changed file with 20 additions and 9 deletions.
29 changes: 20 additions & 9 deletions fs/gfs2/ops_inode.c
Original file line number Diff line number Diff line change
Expand Up @@ -278,17 +278,25 @@ static int gfs2_unlink(struct inode *dir, struct dentry *dentry)
gfs2_holder_init(rgd->rd_gl, LM_ST_EXCLUSIVE, 0, ghs + 2);


error = gfs2_glock_nq_m(3, ghs);
error = gfs2_glock_nq(ghs); /* parent */
if (error)
goto out;
goto out_parent;

error = gfs2_glock_nq(ghs + 1); /* child */
if (error)
goto out_child;

error = gfs2_glock_nq(ghs + 2); /* rgrp */
if (error)
goto out_rgrp;

error = gfs2_unlink_ok(dip, &dentry->d_name, ip);
if (error)
goto out_gunlock;
goto out_rgrp;

error = gfs2_trans_begin(sdp, 2*RES_DINODE + RES_LEAF + RES_RG_BIT, 0);
if (error)
goto out_gunlock;
goto out_rgrp;

error = gfs2_dir_del(dip, &dentry->d_name);
if (error)
Expand All @@ -298,12 +306,15 @@ static int gfs2_unlink(struct inode *dir, struct dentry *dentry)

out_end_trans:
gfs2_trans_end(sdp);
out_gunlock:
gfs2_glock_dq_m(3, ghs);
out:
gfs2_holder_uninit(ghs);
gfs2_holder_uninit(ghs + 1);
gfs2_glock_dq(ghs + 2);
out_rgrp:
gfs2_holder_uninit(ghs + 2);
gfs2_glock_dq(ghs + 1);
out_child:
gfs2_holder_uninit(ghs + 1);
gfs2_glock_dq(ghs);
out_parent:
gfs2_holder_uninit(ghs);
gfs2_glock_dq_uninit(&ri_gh);
return error;
}
Expand Down

0 comments on commit 8497a46

Please sign in to comment.