Skip to content

Commit

Permalink
[GFS2] Fix glock ordering on inode creation
Browse files Browse the repository at this point in the history
The lock order here should be parent -> child rather than
numeric order.

Signed-off-by: Steven Whitehouse <swhiteho@redhat.com>
  • Loading branch information
Steven Whitehouse committed Nov 30, 2006
1 parent 1a14d3a commit 28626e2
Showing 1 changed file with 4 additions and 27 deletions.
31 changes: 4 additions & 27 deletions fs/gfs2/inode.c
Original file line number Diff line number Diff line change
Expand Up @@ -870,33 +870,10 @@ struct inode *gfs2_createi(struct gfs2_holder *ghs, const struct qstr *name,
if (error)
goto fail_gunlock;

if (inum.no_addr < dip->i_num.no_addr) {
gfs2_glock_dq(ghs);

error = gfs2_glock_nq_num(sdp, inum.no_addr,
&gfs2_inode_glops, LM_ST_EXCLUSIVE,
GL_SKIP, ghs + 1);
if (error) {
return ERR_PTR(error);
}

gfs2_holder_reinit(LM_ST_EXCLUSIVE, 0, ghs);
error = gfs2_glock_nq(ghs);
if (error) {
gfs2_glock_dq_uninit(ghs + 1);
return ERR_PTR(error);
}

error = create_ok(dip, name, mode);
if (error)
goto fail_gunlock2;
} else {
error = gfs2_glock_nq_num(sdp, inum.no_addr,
&gfs2_inode_glops, LM_ST_EXCLUSIVE,
GL_SKIP, ghs + 1);
if (error)
goto fail_gunlock;
}
error = gfs2_glock_nq_num(sdp, inum.no_addr, &gfs2_inode_glops,
LM_ST_EXCLUSIVE, GL_SKIP, ghs + 1);
if (error)
goto fail_gunlock;

error = make_dinode(dip, ghs[1].gh_gl, mode, &inum, &generation, dev);
if (error)
Expand Down

0 comments on commit 28626e2

Please sign in to comment.