Commit ff22e5da authored by Alexander Aring's avatar Alexander Aring Committed by Andreas Gruenbacher
Browse files

gfs2: only apply DLM_LKF_VALBLK if sb_lvbptr is not NULL



Currently, gfs2 always sets the DLM_LKF_VALBLK flag to enable lvb
handling even when sb_lvbptr is NULL.  This currently causes no problems
because DLM ignores the DLM_LKF_VALBLK flag when sb_lvbptr is NULL, but
it does violate the DLM API.  Fix that by only setting DLM_LKF_VALBLK
when sb_lvbptr is not NULL.

Signed-off-by: default avatarAlexander Aring <aahringo@redhat.com>
Signed-off-by: default avatarAndreas Gruenbacher <agruenba@redhat.com>
parent ac5ee087
Loading
Loading
Loading
Loading
+6 −2
Original line number Diff line number Diff line
@@ -328,6 +328,7 @@ static void gdlm_put_lock(struct gfs2_glock *gl)
{
	struct gfs2_sbd *sdp = gl->gl_name.ln_sbd;
	struct lm_lockstruct *ls = &sdp->sd_lockstruct;
	uint32_t flags = 0;
	int error;

	BUG_ON(!__lockref_is_dead(&gl->gl_lockref));
@@ -352,7 +353,7 @@ static void gdlm_put_lock(struct gfs2_glock *gl)
	 * When the lockspace is released, all remaining glocks will be
	 * unlocked automatically.  This is more efficient than unlocking them
	 * individually, but when the lock is held in DLM_LOCK_EX or
	 * DLM_LOCK_PW mode, the lock value block (LVB) will be lost.
	 * DLM_LOCK_PW mode, the lock value block (LVB) would be lost.
	 */

	if (test_bit(SDF_SKIP_DLM_UNLOCK, &sdp->sd_flags) &&
@@ -361,8 +362,11 @@ static void gdlm_put_lock(struct gfs2_glock *gl)
		return;
	}

	if (gl->gl_lksb.sb_lvbptr)
		flags |= DLM_LKF_VALBLK;

again:
	error = dlm_unlock(ls->ls_dlm, gl->gl_lksb.sb_lkid, DLM_LKF_VALBLK,
	error = dlm_unlock(ls->ls_dlm, gl->gl_lksb.sb_lkid, flags,
			   NULL, gl);
	if (error == -EBUSY) {
		msleep(20);