From mboxrd@z Thu Jan 1 00:00:00 1970 From: Bob Peterson Date: Wed, 12 Mar 2014 10:32:20 -0400 (EDT) Subject: [Cluster-devel] [GFS2 PATCH] GFS2: Adjust lock reference count In-Reply-To: <1359995163.13170063.1394634617177.JavaMail.zimbra@redhat.com> Message-ID: <1205189675.13171627.1394634740946.JavaMail.zimbra@redhat.com> List-Id: To: cluster-devel.redhat.com MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Hi, This patch closes a small timing window whereby a request to hold the transaction glock can get stuck. The problem is that after the DLM has granted the lock, it can get into a state whereby it doesn't transition the glock to a held state, due to not having requeued the glock state machine to finish the transition. Steve: Feel free to adjust the patch description as you see fit. I'm not feeling very creative at the moment. Regards, Bob Peterson Red Hat File Systems Signed-off-by: Bob Peterson --- fs/gfs2/glock.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/fs/gfs2/glock.c b/fs/gfs2/glock.c index 52f7478..67ac456 100644 --- a/fs/gfs2/glock.c +++ b/fs/gfs2/glock.c @@ -1047,9 +1047,13 @@ int gfs2_glock_nq(struct gfs2_holder *gh) spin_lock(&gl->gl_spin); add_to_queue(gh); - if ((LM_FLAG_NOEXP & gh->gh_flags) && - test_and_clear_bit(GLF_FROZEN, &gl->gl_flags)) + if (unlikely((LM_FLAG_NOEXP & gh->gh_flags) && + test_and_clear_bit(GLF_FROZEN, &gl->gl_flags))) { set_bit(GLF_REPLY_PENDING, &gl->gl_flags); + atomic_inc(&gl->gl_ref); + if (queue_delayed_work(glock_workqueue, &gl->gl_work, 0) == 0) + atomic_dec(&gl->gl_ref); + } run_queue(gl, 1); spin_unlock(&gl->gl_spin);