Commit 655531c9 authored by Andreas Gruenbacher's avatar Andreas Gruenbacher
Browse files

Revert "gfs2: fix infinite loop when checking ail item count before go_inval"



The current withdraw code duplicates the journal recovery code gfs2
already has for dealing with node failures, and it does so poorly.  That
code was added because when releasing a lockspace, we didn't have a way
to indicate that the lockspace needs recovery.  We now do have this
feature, so the current withdraw code can be removed almost entirely.
This is one of several steps towards that.

Reverts commit 33dbd1e4 ("gfs2: fix infinite loop when checking ail
item count before go_inval").

Signed-off-by: default avatarAndreas Gruenbacher <agruenba@redhat.com>
parent af572efe
Loading
Loading
Loading
Loading
+1 −16
Original line number Diff line number Diff line
@@ -678,23 +678,8 @@ __acquires(&gl->gl_lockref.lock)
		goto skip_inval;
	}

	if (target == LM_ST_UNLOCKED || target == LM_ST_DEFERRED) {
		/*
		 * The call to go_sync should have cleared out the ail list.
		 * If there are still items, we have a problem. We ought to
		 * withdraw, but we can't because the withdraw code also uses
		 * glocks. Warn about the error, dump the glock, then fall
		 * through and wait for logd to do the withdraw for us.
		 */
		if ((atomic_read(&gl->gl_ail_count) != 0) &&
		    (!cmpxchg(&sdp->sd_log_error, 0, -EIO))) {
			gfs2_glock_assert_warn(gl,
					       !atomic_read(&gl->gl_ail_count));
			gfs2_dump_glock(NULL, gl, true);
			gfs2_withdraw(sdp);
		}
	if (target == LM_ST_UNLOCKED || target == LM_ST_DEFERRED)
		glops->go_inval(gl, target == LM_ST_DEFERRED ? 0 : DIO_METADATA);
	}
	spin_lock(&gl->gl_lockref.lock);

skip_inval:
+3 −0
Original line number Diff line number Diff line
@@ -232,6 +232,7 @@ static void rgrp_go_inval(struct gfs2_glock *gl, int flags)
	end = PAGE_ALIGN((rgd->rd_addr + rgd->rd_length) * bsize) - 1;
	gfs2_rgrp_brelse(rgd);
	WARN_ON_ONCE(!(flags & DIO_METADATA));
	gfs2_assert_withdraw(sdp, !atomic_read(&gl->gl_ail_count));
	truncate_inode_pages_range(mapping, start, end);
}

@@ -358,6 +359,8 @@ static void inode_go_inval(struct gfs2_glock *gl, int flags)
{
	struct gfs2_inode *ip = gfs2_glock2inode(gl);

	gfs2_assert_withdraw(gl->gl_name.ln_sbd, !atomic_read(&gl->gl_ail_count));

	if (flags & DIO_METADATA) {
		struct address_space *mapping = gfs2_glock2aspace(gl);
		truncate_inode_pages(mapping, 0);