diff options
| author | Andreas Gruenbacher <agruenba@redhat.com> | 2025-12-17 21:00:26 +0000 |
|---|---|---|
| committer | Andreas Gruenbacher <agruenba@redhat.com> | 2026-01-26 14:28:17 +0100 |
| commit | 5e3319932a22cefd42e6bab2d60d2a17b2e1a6fa (patch) | |
| tree | cef540941502bb8ad605a6af8b836197ec0f5a3d | |
| parent | 11d763f0b0afc2cf5f92f4adae5dbbbbef712f8f (diff) | |
gfs2: run_queue cleanup
In run_queue(), instead of always setting the GLF_LOCK flag, only set it
when the flag is actually needed. This avoids having to undo the flag
setting later.
Signed-off-by: Andreas Gruenbacher <agruenba@redhat.com>
| -rw-r--r-- | fs/gfs2/glock.c | 20 |
1 files changed, 7 insertions, 13 deletions
diff --git a/fs/gfs2/glock.c b/fs/gfs2/glock.c index f358448d7b3d..776179933315 100644 --- a/fs/gfs2/glock.c +++ b/fs/gfs2/glock.c @@ -753,13 +753,10 @@ __acquires(&gl->gl_lockref.lock) if (test_bit(GLF_LOCK, &gl->gl_flags)) return; - set_bit(GLF_LOCK, &gl->gl_flags); /* - * 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. + * The GLF_DEMOTE_IN_PROGRESS flag must only be set when the GLF_LOCK + * flag is set as well. */ GLOCK_BUG_ON(gl, test_bit(GLF_DEMOTE_IN_PROGRESS, &gl->gl_flags)); @@ -770,12 +767,13 @@ __acquires(&gl->gl_lockref.lock) } if (find_first_holder(gl)) - goto out_unlock; + return; if (nonblock) goto out_sched; set_bit(GLF_DEMOTE_IN_PROGRESS, &gl->gl_flags); GLOCK_BUG_ON(gl, gl->gl_demote_state == LM_ST_EXCLUSIVE); gl->gl_target = gl->gl_demote_state; + set_bit(GLF_LOCK, &gl->gl_flags); do_xmote(gl, NULL, gl->gl_target); return; } @@ -783,26 +781,22 @@ __acquires(&gl->gl_lockref.lock) promote: do_promote(gl); if (find_first_holder(gl)) - goto out_unlock; + return; gh = find_first_waiter(gl); if (!gh) - goto out_unlock; + return; 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 */ + set_bit(GLF_LOCK, &gl->gl_flags); do_xmote(gl, gh, gl->gl_target); return; out_sched: - clear_bit(GLF_LOCK, &gl->gl_flags); gl->gl_lockref.count++; gfs2_glock_queue_work(gl, 0); - return; - -out_unlock: - clear_bit(GLF_LOCK, &gl->gl_flags); } /** |
