Commit 5e331993 authored by Andreas Gruenbacher's avatar Andreas Gruenbacher
Browse files

gfs2: run_queue cleanup



In run_queue(), instead of always setting the GLF_LOCK flag, only set it
when the flag is actually needed.  This avoids having to undo the flag
setting later.

Signed-off-by: default avatarAndreas Gruenbacher <agruenba@redhat.com>
parent 11d763f0
Loading
Loading
Loading
Loading
+7 −13
Original line number Diff line number Diff line
@@ -753,13 +753,10 @@ __acquires(&gl->gl_lockref.lock)

	if (test_bit(GLF_LOCK, &gl->gl_flags))
		return;
	set_bit(GLF_LOCK, &gl->gl_flags);

	/*
	 * The GLF_DEMOTE_IN_PROGRESS flag is only set intermittently during
	 * locking operations.  We have just started a locking operation by
	 * setting the GLF_LOCK flag, so the GLF_DEMOTE_IN_PROGRESS flag must
	 * be cleared.
	 * The GLF_DEMOTE_IN_PROGRESS flag must only be set when the GLF_LOCK
	 * flag is set as well.
	 */
	GLOCK_BUG_ON(gl, test_bit(GLF_DEMOTE_IN_PROGRESS, &gl->gl_flags));

@@ -770,12 +767,13 @@ __acquires(&gl->gl_lockref.lock)
		}

		if (find_first_holder(gl))
			goto out_unlock;
			return;
		if (nonblock)
			goto out_sched;
		set_bit(GLF_DEMOTE_IN_PROGRESS, &gl->gl_flags);
		GLOCK_BUG_ON(gl, gl->gl_demote_state == LM_ST_EXCLUSIVE);
		gl->gl_target = gl->gl_demote_state;
		set_bit(GLF_LOCK, &gl->gl_flags);
		do_xmote(gl, NULL, gl->gl_target);
		return;
	}
@@ -783,26 +781,22 @@ __acquires(&gl->gl_lockref.lock)
promote:
	do_promote(gl);
	if (find_first_holder(gl))
		goto out_unlock;
		return;
	gh = find_first_waiter(gl);
	if (!gh)
		goto out_unlock;
		return;
	if (nonblock)
		goto out_sched;
	gl->gl_target = gh->gh_state;
	if (!(gh->gh_flags & (LM_FLAG_TRY | LM_FLAG_TRY_1CB)))
		do_error(gl, 0); /* Fail queued try locks */
	set_bit(GLF_LOCK, &gl->gl_flags);
	do_xmote(gl, gh, gl->gl_target);
	return;

out_sched:
	clear_bit(GLF_LOCK, &gl->gl_flags);
	gl->gl_lockref.count++;
	gfs2_glock_queue_work(gl, 0);
	return;

out_unlock:
	clear_bit(GLF_LOCK, &gl->gl_flags);
}

/**