|
@@ -200,10 +200,11 @@ static int make_mode(const unsigned int lmstate)
|
|
|
return -1;
|
|
|
}
|
|
|
|
|
|
-static u32 make_flags(const u32 lkid, const unsigned int gfs_flags,
|
|
|
+static u32 make_flags(struct gfs2_glock *gl, const unsigned int gfs_flags,
|
|
|
const int req)
|
|
|
{
|
|
|
u32 lkf = DLM_LKF_VALBLK;
|
|
|
+ u32 lkid = gl->gl_lksb.sb_lkid;
|
|
|
|
|
|
if (gfs_flags & LM_FLAG_TRY)
|
|
|
lkf |= DLM_LKF_NOQUEUE;
|
|
@@ -227,8 +228,11 @@ static u32 make_flags(const u32 lkid, const unsigned int gfs_flags,
|
|
|
BUG();
|
|
|
}
|
|
|
|
|
|
- if (lkid != 0)
|
|
|
+ if (lkid != 0) {
|
|
|
lkf |= DLM_LKF_CONVERT;
|
|
|
+ if (test_bit(GLF_BLOCKING, &gl->gl_flags))
|
|
|
+ lkf |= DLM_LKF_QUECVT;
|
|
|
+ }
|
|
|
|
|
|
return lkf;
|
|
|
}
|
|
@@ -250,7 +254,7 @@ static int gdlm_lock(struct gfs2_glock *gl, unsigned int req_state,
|
|
|
char strname[GDLM_STRNAME_BYTES] = "";
|
|
|
|
|
|
req = make_mode(req_state);
|
|
|
- lkf = make_flags(gl->gl_lksb.sb_lkid, flags, req);
|
|
|
+ lkf = make_flags(gl, flags, req);
|
|
|
gfs2_glstats_inc(gl, GFS2_LKS_DCOUNT);
|
|
|
gfs2_sbstats_inc(gl, GFS2_LKS_DCOUNT);
|
|
|
if (gl->gl_lksb.sb_lkid) {
|