Commit a55a47a3 authored by Andreas Gruenbacher's avatar Andreas Gruenbacher
Browse files

Revert "GFS2: Prevent delete work from occurring on glocks used for create"



Since commit a0e3cc65 ("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 commit a4923865 ("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: default avatarAndreas Gruenbacher <agruenba@redhat.com>
parent e3a77eeb
Loading
Loading
Loading
Loading
+0 −8
Original line number Diff line number Diff line
@@ -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))
+0 −1
Original line number Diff line number Diff line
@@ -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 */
};
+1 −5
Original line number Diff line number Diff line
@@ -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 @@ fail_gunlock3:
	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: