Commit 8fb8f70e authored by Andreas Gruenbacher's avatar Andreas Gruenbacher
Browse files

gfs2: Clean up gfs2_scan_glock_lru



Switch to list_for_each_entry_safe() and eliminate the "skipped" list in
gfs2_scan_glock_lru().

At the same time, scan the requested number of items to scan, not one
more than that number.

Signed-off-by: default avatarAndreas Gruenbacher <agruenba@redhat.com>
parent 2d143955
Loading
Loading
Loading
Loading
+4 −9
Original line number Diff line number Diff line
@@ -1985,26 +1985,21 @@ __acquires(&lru_lock)

static long gfs2_scan_glock_lru(int nr)
{
	struct gfs2_glock *gl;
	LIST_HEAD(skipped);
	struct gfs2_glock *gl, *next;
	LIST_HEAD(dispose);
	long freed = 0;

	spin_lock(&lru_lock);
	while ((nr-- >= 0) && !list_empty(&lru_list)) {
		gl = list_first_entry(&lru_list, struct gfs2_glock, gl_lru);

	list_for_each_entry_safe(gl, next, &lru_list, gl_lru) {
		if (nr-- <= 0)
			break;
		/* Test for being demotable */
		if (!test_bit(GLF_LOCK, &gl->gl_flags)) {
			list_move(&gl->gl_lru, &dispose);
			atomic_dec(&lru_count);
			freed++;
			continue;
		}

		list_move(&gl->gl_lru, &skipped);
	}
	list_splice(&skipped, &lru_list);
	if (!list_empty(&dispose))
		gfs2_dispose_glock_lru(&dispose);
	spin_unlock(&lru_lock);