Commit 8bb92005 authored by Dave Chinner's avatar Dave Chinner Committed by Darrick J. Wong
Browse files

xfs: rework xlog_state_do_callback()



Clean it up a bit by factoring and rearranging some of the code.

Signed-off-by: default avatarDave Chinner <dchinner@redhat.com>
Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
Reviewed-by: default avatarDarrick J. Wong <djwong@kernel.org>
Signed-off-by: default avatarDarrick J. Wong <djwong@kernel.org>
parent b36d4651
Loading
Loading
Loading
Loading
+53 −43
Original line number Diff line number Diff line
@@ -2838,29 +2838,19 @@ xlog_state_iodone_process_iclog(
	}
}

STATIC void
xlog_state_do_callback(
	struct xlog		*log)
{
	struct xlog_in_core	*iclog;
	struct xlog_in_core	*first_iclog;
	bool			cycled_icloglock;
	int			flushcnt = 0;
	int			repeats = 0;

	spin_lock(&log->l_icloglock);
	do {
/*
		 * Scan all iclogs starting with the one pointed to by the
		 * log.  Reset this starting point each time the log is
		 * unlocked (during callbacks).
		 *
		 * Keep looping through iclogs until one full pass is made
		 * without running any callbacks.
 * Loop over all the iclogs, running attached callbacks on them. Return true if
 * we ran any callbacks, indicating that we dropped the icloglock.
 */
		cycled_icloglock = false;
		first_iclog = log->l_iclog;
		iclog = first_iclog;
static bool
xlog_state_do_iclog_callbacks(
	struct xlog		*log)
		__releases(&log->l_icloglock)
		__acquires(&log->l_icloglock)
{
	struct xlog_in_core	*first_iclog = log->l_iclog;
	struct xlog_in_core	*iclog = first_iclog;
	bool			ran_callback = false;

	do {
		LIST_HEAD(cb_list);
@@ -2879,7 +2869,7 @@ xlog_state_do_callback(
		trace_xlog_iclog_callbacks_start(iclog, _RET_IP_);
		xlog_cil_process_committed(&cb_list);
		trace_xlog_iclog_callbacks_done(iclog, _RET_IP_);
			cycled_icloglock = true;
		ran_callback = true;

		spin_lock(&log->l_icloglock);
		if (xlog_is_shutdown(log))
@@ -2889,6 +2879,26 @@ xlog_state_do_callback(
		iclog = iclog->ic_next;
	} while (iclog != first_iclog);

	return ran_callback;
}


/*
 * Loop running iclog completion callbacks until there are no more iclogs in a
 * state that can run callbacks.
 */
STATIC void
xlog_state_do_callback(
	struct xlog		*log)
{
	int			flushcnt = 0;
	int			repeats = 0;

	spin_lock(&log->l_icloglock);
	while (xlog_state_do_iclog_callbacks(log)) {
		if (xlog_is_shutdown(log))
			break;

		if (++repeats > 5000) {
			flushcnt += repeats;
			repeats = 0;
@@ -2896,7 +2906,7 @@ xlog_state_do_callback(
				"%s: possible infinite loop (%d iterations)",
				__func__, flushcnt);
		}
	} while (!xlog_is_shutdown(log) && cycled_icloglock);
	}

	if (log->l_iclog->ic_state == XLOG_STATE_ACTIVE ||
	    xlog_is_shutdown(log))