|
@@ -441,6 +441,8 @@ static void state_change(struct gfs2_glock *gl, unsigned int new_state)
|
|
|
else
|
|
|
gfs2_glock_put_nolock(gl);
|
|
|
}
|
|
|
+ if (held1 && held2 && list_empty(&gl->gl_holders))
|
|
|
+ clear_bit(GLF_QUEUED, &gl->gl_flags);
|
|
|
|
|
|
gl->gl_state = new_state;
|
|
|
gl->gl_tchange = jiffies;
|
|
@@ -1012,6 +1014,7 @@ fail:
|
|
|
if (unlikely((gh->gh_flags & LM_FLAG_PRIORITY) && !insert_pt))
|
|
|
insert_pt = &gh2->gh_list;
|
|
|
}
|
|
|
+ set_bit(GLF_QUEUED, &gl->gl_flags);
|
|
|
if (likely(insert_pt == NULL)) {
|
|
|
list_add_tail(&gh->gh_list, &gl->gl_holders);
|
|
|
if (unlikely(gh->gh_flags & LM_FLAG_PRIORITY))
|
|
@@ -1310,10 +1313,12 @@ void gfs2_glock_cb(struct gfs2_glock *gl, unsigned int state)
|
|
|
|
|
|
gfs2_glock_hold(gl);
|
|
|
holdtime = gl->gl_tchange + gl->gl_ops->go_min_hold_time;
|
|
|
- if (time_before(now, holdtime))
|
|
|
- delay = holdtime - now;
|
|
|
- if (test_bit(GLF_REPLY_PENDING, &gl->gl_flags))
|
|
|
- delay = gl->gl_ops->go_min_hold_time;
|
|
|
+ if (test_bit(GLF_QUEUED, &gl->gl_flags)) {
|
|
|
+ if (time_before(now, holdtime))
|
|
|
+ delay = holdtime - now;
|
|
|
+ if (test_bit(GLF_REPLY_PENDING, &gl->gl_flags))
|
|
|
+ delay = gl->gl_ops->go_min_hold_time;
|
|
|
+ }
|
|
|
|
|
|
spin_lock(&gl->gl_spin);
|
|
|
handle_callback(gl, state, delay);
|
|
@@ -1660,6 +1665,8 @@ static const char *gflags2str(char *buf, const unsigned long *gflags)
|
|
|
*p++ = 'I';
|
|
|
if (test_bit(GLF_FROZEN, gflags))
|
|
|
*p++ = 'F';
|
|
|
+ if (test_bit(GLF_QUEUED, gflags))
|
|
|
+ *p++ = 'q';
|
|
|
*p = 0;
|
|
|
return buf;
|
|
|
}
|