Skip to contentSkip to conversation

GFS2: Adjust lock reference count

PATCH New Bob Peterson 2 participants 2 messages Mar 12, 2014 1 message not in the archive GFS2 file system

lore
Share & tools
lore

A message that is not in the archive (sent off-list or not yet received): [email protected]

#1 lore raw

PATCH 1/1 GFS2: Adjust lock reference count

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

---
 fs/gfs2/glock.c | 8 ++++++--
 1 file changed, 6 insertions(+), 2 deletions(-)
fs/gfs2/glock.c +6 -2
index 52f7478..67ac456 100644
@@ -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);
 
#2 lore raw

PATCH 1/1 GFS2: Adjust lock reference count

Hi,

Quoted 8 lines · Bob Peterson

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.

Quoted 8 lines

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

I updated the description, and also converted the atomic_inc to lockref
- I guess that you didn't compile test this one. Anyway, that should sort it out I think, so I've added it to the tree now, since we know that the fix is needed,

Steve.

Quoted 26 lines
---
 fs/gfs2/glock.c | 8 ++++++--
 1 file changed, 6 insertions(+), 2 deletions(-)
fs/gfs2/glock.c +6 -2
index 52f7478..67ac456 100644
@@ -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);