mirror of https://gitee.com/openkylin/linux.git
Revert "GFS2: Prevent delete work from occurring on glocks used for create"
Since commita0e3cc65fa
("gfs2: Turn gl_delete into a delayed work"), we're cancelling any pending delete work of an iopen glock before attaching a new inode to that glock in gfs2_create_inode. This means that delete_work_func can no longer be queued or running when attaching the iopen glock to the new inode, and we can revert commita4923865ea
("GFS2: Prevent delete work from occurring on glocks used for create"), which tried to achieve the same but in a racy way. Signed-off-by: Andreas Gruenbacher <agruenba@redhat.com>
This commit is contained in:
parent
e3a77eebfa
commit
a55a47a3bc
|
@ -857,12 +857,6 @@ static void delete_work_func(struct work_struct *work)
|
|||
clear_bit(GLF_PENDING_DELETE, &gl->gl_flags);
|
||||
spin_unlock(&gl->gl_lockref.lock);
|
||||
|
||||
/* If someone's using this glock to create a new dinode, the block must
|
||||
have been freed by another node, then re-used, in which case our
|
||||
iopen callback is too late after the fact. Ignore it. */
|
||||
if (test_bit(GLF_INODE_CREATING, &gl->gl_flags))
|
||||
goto out;
|
||||
|
||||
if (test_bit(GLF_DEMOTE, &gl->gl_flags)) {
|
||||
/*
|
||||
* If we can evict the inode, give the remote node trying to
|
||||
|
@ -2112,8 +2106,6 @@ static const char *gflags2str(char *buf, const struct gfs2_glock *gl)
|
|||
*p++ = 'o';
|
||||
if (test_bit(GLF_BLOCKING, gflags))
|
||||
*p++ = 'b';
|
||||
if (test_bit(GLF_INODE_CREATING, gflags))
|
||||
*p++ = 'c';
|
||||
if (test_bit(GLF_PENDING_DELETE, gflags))
|
||||
*p++ = 'P';
|
||||
if (test_bit(GLF_FREEING, gflags))
|
||||
|
|
|
@ -348,7 +348,6 @@ enum {
|
|||
GLF_LRU = 13,
|
||||
GLF_OBJECT = 14, /* Used only for tracing */
|
||||
GLF_BLOCKING = 15,
|
||||
GLF_INODE_CREATING = 16, /* Inode creation occurring */
|
||||
GLF_PENDING_DELETE = 17,
|
||||
GLF_FREEING = 18, /* Wait for glock to be freed */
|
||||
};
|
||||
|
|
|
@ -609,7 +609,7 @@ static int gfs2_create_inode(struct inode *dir, struct dentry *dentry,
|
|||
struct inode *inode = NULL;
|
||||
struct gfs2_inode *dip = GFS2_I(dir), *ip;
|
||||
struct gfs2_sbd *sdp = GFS2_SB(&dip->i_inode);
|
||||
struct gfs2_glock *io_gl = NULL;
|
||||
struct gfs2_glock *io_gl;
|
||||
int error, free_vfs_inode = 1;
|
||||
u32 aflags = 0;
|
||||
unsigned blocks = 1;
|
||||
|
@ -750,8 +750,6 @@ static int gfs2_create_inode(struct inode *dir, struct dentry *dentry,
|
|||
init_dinode(dip, ip, symname);
|
||||
gfs2_trans_end(sdp);
|
||||
|
||||
BUG_ON(test_and_set_bit(GLF_INODE_CREATING, &io_gl->gl_flags));
|
||||
|
||||
error = gfs2_glock_nq_init(io_gl, LM_ST_SHARED, GL_EXACT, &ip->i_iopen_gh);
|
||||
if (error)
|
||||
goto fail_gunlock2;
|
||||
|
@ -797,7 +795,6 @@ static int gfs2_create_inode(struct inode *dir, struct dentry *dentry,
|
|||
gfs2_glock_dq_uninit(ghs);
|
||||
gfs2_qa_put(ip);
|
||||
gfs2_glock_dq_uninit(ghs + 1);
|
||||
clear_bit(GLF_INODE_CREATING, &io_gl->gl_flags);
|
||||
gfs2_glock_put(io_gl);
|
||||
gfs2_qa_put(dip);
|
||||
return error;
|
||||
|
@ -806,7 +803,6 @@ static int gfs2_create_inode(struct inode *dir, struct dentry *dentry,
|
|||
glock_clear_object(io_gl, ip);
|
||||
gfs2_glock_dq_uninit(&ip->i_iopen_gh);
|
||||
fail_gunlock2:
|
||||
clear_bit(GLF_INODE_CREATING, &io_gl->gl_flags);
|
||||
glock_clear_object(io_gl, ip);
|
||||
gfs2_glock_put(io_gl);
|
||||
fail_free_inode:
|
||||
|
|
Loading…
Reference in New Issue