]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
gfs2: Call gfs2_queue_verify_delete from gfs2_evict_inode
authorAndreas Gruenbacher <agruenba@redhat.com>
Thu, 12 Sep 2024 20:32:46 +0000 (22:32 +0200)
committerAndreas Gruenbacher <agruenba@redhat.com>
Tue, 5 Nov 2024 11:39:29 +0000 (12:39 +0100)
Move calls to gfs2_queue_verify_delete() into gfs2_evict_inode().

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

index 95f082f13a8c5390e74b918760f025f49c4febfd..3736e7f3b381c9a1a8583d2b514b06f7b272ba16 100644 (file)
@@ -959,10 +959,9 @@ static void gfs2_glock_poke(struct gfs2_glock *gl)
        gfs2_holder_uninit(&gh);
 }
 
-static bool gfs2_try_evict(struct gfs2_glock *gl)
+static void gfs2_try_evict(struct gfs2_glock *gl)
 {
        struct gfs2_inode *ip;
-       bool evicted = false;
 
        /*
         * If there is contention on the iopen glock and we have an inode, try
@@ -997,9 +996,7 @@ static bool gfs2_try_evict(struct gfs2_glock *gl)
                        gfs2_glock_poke(ip->i_gl);
                        iput(&ip->i_inode);
                }
-               evicted = !ip;
        }
-       return evicted;
 }
 
 bool gfs2_queue_try_to_evict(struct gfs2_glock *gl)
@@ -1048,13 +1045,7 @@ static void delete_work_func(struct work_struct *work)
                 * care about compatibility with such nodes, we can skip this
                 * step entirely.
                 */
-               if (gfs2_try_evict(gl)) {
-                       if (!test_bit(SDF_KILL, &sdp->sd_flags)) {
-                               gfs2_glock_hold(gl);
-                               if (!gfs2_queue_verify_delete(gl, true))
-                                       gfs2_glock_put(gl);
-                       }
-               }
+               gfs2_try_evict(gl);
        }
 
        if (verify_delete) {
index 46d325c2ab88068fc9659c1592ee249ba5e5b9f5..340bc21de21837abac9df62d150b82722ad3576e 100644 (file)
@@ -1499,8 +1499,15 @@ static void gfs2_evict_inode(struct inode *inode)
 
        gfs2_holder_mark_uninitialized(&gh);
        behavior = evict_should_delete(inode, &gh);
-       if (behavior == EVICT_SHOULD_DEFER_DELETE)
+       if (behavior == EVICT_SHOULD_DEFER_DELETE &&
+           !test_bit(SDF_KILL, &sdp->sd_flags)) {
+               struct gfs2_glock *io_gl = ip->i_iopen_gh.gh_gl;
+
+               gfs2_glock_hold(io_gl);
+               if (!gfs2_queue_verify_delete(io_gl, true))
+                       gfs2_glock_put(io_gl);
                goto out;
+       }
        if (behavior == EVICT_SHOULD_DELETE)
                ret = evict_unlinked_inode(inode);
        else