gfs2: move GL_SKIP check from glops to do_promote
authorBob Peterson <rpeterso@redhat.com>
Mon, 13 Sep 2021 17:54:16 +0000 (12:54 -0500)
committerAndreas Gruenbacher <agruenba@redhat.com>
Mon, 25 Oct 2021 06:42:17 +0000 (08:42 +0200)
Before this patch, each individual "go_lock" glock operation (glop)
checked the GL_SKIP flag, and if set, would skip further processing.

This patch changes the logic so the go_lock caller, function go_promote,
checks the GL_SKIP flag before calling the go_lock op in the first place.
This avoids having to unnecessarily unlock gl_lockref.lock only to
re-lock it again.

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

index ff12272..5d6b253 100644 (file)
@@ -502,18 +502,20 @@ restart:
                        }
                        if (gh->gh_list.prev == &gl->gl_holders &&
                            glops->go_lock) {
-                               spin_unlock(&gl->gl_lockref.lock);
-                               /* FIXME: eliminate this eventually */
-                               ret = glops->go_lock(gh);
-                               spin_lock(&gl->gl_lockref.lock);
-                               if (ret) {
-                                       if (ret == 1)
-                                               return 2;
-                                       gh->gh_error = ret;
-                                       list_del_init(&gh->gh_list);
-                                       trace_gfs2_glock_queue(gh, 0);
-                                       gfs2_holder_wake(gh);
-                                       goto restart;
+                               if (!(gh->gh_flags & GL_SKIP)) {
+                                       spin_unlock(&gl->gl_lockref.lock);
+                                       /* FIXME: eliminate this eventually */
+                                       ret = glops->go_lock(gh);
+                                       spin_lock(&gl->gl_lockref.lock);
+                                       if (ret) {
+                                               if (ret == 1)
+                                                       return 2;
+                                               gh->gh_error = ret;
+                                               list_del_init(&gh->gh_list);
+                                               trace_gfs2_glock_queue(gh, 0);
+                                               gfs2_holder_wake(gh);
+                                               goto restart;
+                                       }
                                }
                                set_bit(HIF_HOLDER, &gh->gh_iflags);
                                trace_gfs2_promote(gh, 1);
index 79c621c..4b19f51 100644 (file)
@@ -495,7 +495,7 @@ static int inode_go_lock(struct gfs2_holder *gh)
        struct gfs2_inode *ip = gl->gl_object;
        int error = 0;
 
-       if (!ip || (gh->gh_flags & GL_SKIP))
+       if (!ip)
                return 0;
 
        if (test_bit(GIF_INVALID, &ip->i_flags)) {
index 7a13a68..1fb66f6 100644 (file)
@@ -1292,8 +1292,6 @@ int gfs2_rgrp_go_lock(struct gfs2_holder *gh)
 {
        struct gfs2_rgrpd *rgd = gh->gh_gl->gl_object;
 
-       if (gh->gh_flags & GL_SKIP)
-               return 0;
        return gfs2_rgrp_bh_get(rgd);
 }