Commit 28626e20 authored by Steven Whitehouse's avatar Steven Whitehouse

[GFS2] Fix glock ordering on inode creation

The lock order here should be parent -> child rather than
numeric order.
Signed-off-by: default avatarSteven Whitehouse <swhiteho@redhat.com>
parent 1a14d3a6
...@@ -870,33 +870,10 @@ struct inode *gfs2_createi(struct gfs2_holder *ghs, const struct qstr *name, ...@@ -870,33 +870,10 @@ struct inode *gfs2_createi(struct gfs2_holder *ghs, const struct qstr *name,
if (error) if (error)
goto fail_gunlock; goto fail_gunlock;
if (inum.no_addr < dip->i_num.no_addr) { error = gfs2_glock_nq_num(sdp, inum.no_addr, &gfs2_inode_glops,
gfs2_glock_dq(ghs); LM_ST_EXCLUSIVE, GL_SKIP, ghs + 1);
if (error)
error = gfs2_glock_nq_num(sdp, inum.no_addr, goto fail_gunlock;
&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 = make_dinode(dip, ghs[1].gh_gl, mode, &inum, &generation, dev); error = make_dinode(dip, ghs[1].gh_gl, mode, &inum, &generation, dev);
if (error) if (error)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment