summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndreas Gruenbacher <agruenba@redhat.com>2025-12-12 16:02:05 +0000
committerAndreas Gruenbacher <agruenba@redhat.com>2026-01-26 14:28:17 +0100
commitf8f04248c7e9f5d77a93857e3a5d28c0833056dc (patch)
tree54c023abff8aa4436fbebe4779ec54692f09c674
parentb54345928fa1dbde534e32ecaa138678fd5d2135 (diff)
gfs2: glock cancelation flag fix
When an asynchronous glock holder is dequeued that hasn't been granted yet (HIF_HOLDER not set) and no dlm operation is in progress on behalf of that holder (GLF_LOCK not set), the dequeuing takes place in __gfs2_glock_dq(). There, we are not clearing the HIF_WAIT flag and waking up waiters. Fix that. This bug prevents the same holder from being enqueued later (gfs2_glock_nq()) without first reinitializing it (gfs2_holder_reinit()). The code doesn't currently use this pattern, but this will change in the next commit. Signed-off-by: Andreas Gruenbacher <agruenba@redhat.com>
-rw-r--r--fs/gfs2/glock.c2
1 files changed, 2 insertions, 0 deletions
diff --git a/fs/gfs2/glock.c b/fs/gfs2/glock.c
index 92e029104d8a..47e8809575d5 100644
--- a/fs/gfs2/glock.c
+++ b/fs/gfs2/glock.c
@@ -1545,6 +1545,8 @@ static void __gfs2_glock_dq(struct gfs2_holder *gh)
list_del_init(&gh->gh_list);
clear_bit(HIF_HOLDER, &gh->gh_iflags);
trace_gfs2_glock_queue(gh, 0);
+ if (test_bit(HIF_WAIT, &gh->gh_iflags))
+ gfs2_holder_wake(gh);
/*
* If there hasn't been a demote request we are done.