]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
gfs2: Minor run_queue fixes
authorAndreas Gruenbacher <agruenba@redhat.com>
Mon, 11 Aug 2025 19:38:23 +0000 (21:38 +0200)
committerAndreas Gruenbacher <agruenba@redhat.com>
Fri, 12 Sep 2025 10:02:53 +0000 (12:02 +0200)
Provide a better description of why the GLF_DEMOTE_IN_PROGRESS flag
cannot be set.

Function do_xmote() may block, so make sure it isn't called when
nonblock is true.

Signed-off-by: Andreas Gruenbacher <agruenba@redhat.com>
Reviewed-by: Andrew Price <anprice@redhat.com>
fs/gfs2/glock.c

index 1eba27bb5f3cf754f2b736230ec2b9bd094d36fa..747ee7ca44e2fe38961c42f1687f919433b48730 100644 (file)
@@ -832,7 +832,12 @@ __acquires(&gl->gl_lockref.lock)
                return;
        set_bit(GLF_LOCK, &gl->gl_flags);
 
-       /* While a demote is in progress, the GLF_LOCK flag must be set. */
+       /*
+        * The GLF_DEMOTE_IN_PROGRESS flag is only set intermittently during
+        * locking operations.  We have just started a locking operation by
+        * setting the GLF_LOCK flag, so the GLF_DEMOTE_IN_PROGRESS flag must
+        * be cleared.
+        */
        GLOCK_BUG_ON(gl, test_bit(GLF_DEMOTE_IN_PROGRESS, &gl->gl_flags));
 
        if (test_bit(GLF_DEMOTE, &gl->gl_flags)) {
@@ -859,6 +864,8 @@ promote:
        gh = find_first_waiter(gl);
        if (!gh)
                goto out_unlock;
+       if (nonblock)
+               goto out_sched;
        gl->gl_target = gh->gh_state;
        if (!(gh->gh_flags & (LM_FLAG_TRY | LM_FLAG_TRY_1CB)))
                do_error(gl, 0); /* Fail queued try locks */