gfs2: Initialize gl_no_formal_ino earlier
authorAndreas Gruenbacher <agruenba@redhat.com>
Mon, 16 Sep 2024 13:42:57 +0000 (15:42 +0200)
committerAndreas Gruenbacher <agruenba@redhat.com>
Tue, 24 Sep 2024 17:03:33 +0000 (19:03 +0200)
Set gl_no_formal_ino of the iopen glock to the generation of the
associated inode (ip->i_no_formal_ino) as soon as that value is known.
This saves us from setting it later, possibly repeatedly, when queuing
GLF_VERIFY_DELETE work.

Signed-off-by: Andreas Gruenbacher <agruenba@redhat.com>
fs/gfs2/glock.c
fs/gfs2/glops.c
fs/gfs2/inode.c

index 5addf4e..9689424 100644 (file)
@@ -980,7 +980,6 @@ static bool gfs2_try_evict(struct gfs2_glock *gl)
                ip = NULL;
        spin_unlock(&gl->gl_lockref.lock);
        if (ip) {
-               gl->gl_no_formal_ino = ip->i_no_formal_ino;
                set_bit(GIF_DEFERRED_DELETE, &ip->i_flags);
                d_prune_aliases(&ip->i_inode);
                iput(&ip->i_inode);
index 95d8081..dbc444b 100644 (file)
@@ -494,11 +494,18 @@ int gfs2_inode_refresh(struct gfs2_inode *ip)
 static int inode_go_instantiate(struct gfs2_glock *gl)
 {
        struct gfs2_inode *ip = gl->gl_object;
+       struct gfs2_glock *io_gl;
+       int error;
 
        if (!ip) /* no inode to populate - read it in later */
                return 0;
 
-       return gfs2_inode_refresh(ip);
+       error = gfs2_inode_refresh(ip);
+       if (error)
+               return error;
+       io_gl = ip->i_iopen_gh.gh_gl;
+       io_gl->gl_no_formal_ino = ip->i_no_formal_ino;
+       return 0;
 }
 
 static int inode_go_held(struct gfs2_holder *gh)
index 1b95db2..6fbbaaa 100644 (file)
@@ -750,6 +750,7 @@ static int gfs2_create_inode(struct inode *dir, struct dentry *dentry,
        if (error)
                goto fail_free_inode;
        gfs2_cancel_delete_work(io_gl);
+       io_gl->gl_no_formal_ino = ip->i_no_formal_ino;
 
 retry:
        error = insert_inode_locked4(inode, ip->i_no_addr, iget_test, &ip->i_no_addr);