gfs2: Fix remote demote of weak glock holders
When we mock up a temporary holder in gfs2_glock_cb to demote weak holders in response to a remote locking conflict, we don't set the HIF_HOLDER flag. This causes function may_grant to BUG. Fix by setting the missing HIF_HOLDER flag in the mock glock holder. In addition, define the mock glock holder where it is used. Signed-off-by: Andreas Gruenbacher <agruenba@redhat.com>
This commit is contained in:
parent
42eb8fdac2
commit
e11b02df60
|
@ -1857,7 +1857,6 @@ void gfs2_glock_dq_m(unsigned int num_gh, struct gfs2_holder *ghs)
|
|||
|
||||
void gfs2_glock_cb(struct gfs2_glock *gl, unsigned int state)
|
||||
{
|
||||
struct gfs2_holder mock_gh = { .gh_gl = gl, .gh_state = state, };
|
||||
unsigned long delay = 0;
|
||||
unsigned long holdtime;
|
||||
unsigned long now = jiffies;
|
||||
|
@ -1890,8 +1889,13 @@ void gfs2_glock_cb(struct gfs2_glock *gl, unsigned int state)
|
|||
* keep the glock until the last strong holder is done with it.
|
||||
*/
|
||||
if (!find_first_strong_holder(gl)) {
|
||||
if (state == LM_ST_UNLOCKED)
|
||||
mock_gh.gh_state = LM_ST_EXCLUSIVE;
|
||||
struct gfs2_holder mock_gh = {
|
||||
.gh_gl = gl,
|
||||
.gh_state = (state == LM_ST_UNLOCKED) ?
|
||||
LM_ST_EXCLUSIVE : state,
|
||||
.gh_iflags = BIT(HIF_HOLDER)
|
||||
};
|
||||
|
||||
demote_incompat_holders(gl, &mock_gh);
|
||||
}
|
||||
handle_callback(gl, state, delay, true);
|
||||
|
|
Loading…
Reference in New Issue