]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
Revert "GFS2: Prevent delete work from occurring on glocks used for create"
authorAndreas Gruenbacher <agruenba@redhat.com>
Fri, 27 Nov 2020 13:23:04 +0000 (14:23 +0100)
committerAndreas Gruenbacher <agruenba@redhat.com>
Mon, 30 Nov 2020 23:25:21 +0000 (00:25 +0100)
Since commit a0e3cc65fa29 ("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 a4923865ea07 ("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>
fs/gfs2/glock.c
fs/gfs2/incore.h
fs/gfs2/inode.c

index 35a6fd103761b5fcd3f06ede79091e656153b306..d87a5bc3607b75280a270a97cc309dce2fbb8443 100644 (file)
@@ -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))
index f8858d995b241093063f676165aee5441b014a7a..8e1ab8ed4abc7891e5301cce4b7a1dbea538bcd9 100644 (file)
@@ -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 */
 };
index 3d77f29703491abd2a0256323778fe3b5daa1bfe..c1b77e8d6b1c30735c5f2c6a974bc7cd81d6c82f 100644 (file)
@@ -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: