Commit 6be00102 authored by Dave Chinner's avatar Dave Chinner Committed by Darrick J. Wong
Browse files

xfs: don't nest icloglock inside ic_callback_lock



It's completely unnecessary because callbacks are added to iclogs
without holding the icloglock, hence no amount of ordering between
the icloglock and ic_callback_lock will order the removal of
callbacks from the iclog.

Signed-off-by: default avatarDave Chinner <dchinner@redhat.com>
Reviewed-by: default avatarBrian Foster <bfoster@redhat.com>
Reviewed-by: default avatarDarrick J. Wong <djwong@kernel.org>
Signed-off-by: default avatarDarrick J. Wong <djwong@kernel.org>
parent d3a3340b
Loading
Loading
Loading
Loading
+4 −14
Original line number Diff line number Diff line
@@ -2773,11 +2773,8 @@ static void
xlog_state_do_iclog_callbacks(
	struct xlog		*log,
	struct xlog_in_core	*iclog)
		__releases(&log->l_icloglock)
		__acquires(&log->l_icloglock)
{
	trace_xlog_iclog_callbacks_start(iclog, _RET_IP_);
	spin_unlock(&log->l_icloglock);
	spin_lock(&iclog->ic_callback_lock);
	while (!list_empty(&iclog->ic_callbacks)) {
		LIST_HEAD(tmp);
@@ -2789,12 +2786,6 @@ xlog_state_do_iclog_callbacks(
		spin_lock(&iclog->ic_callback_lock);
	}

	/*
	 * Pick up the icloglock while still holding the callback lock so we
	 * serialise against anyone trying to add more callbacks to this iclog
	 * now we've finished processing.
	 */
	spin_lock(&log->l_icloglock);
	spin_unlock(&iclog->ic_callback_lock);
	trace_xlog_iclog_callbacks_done(iclog, _RET_IP_);
}
@@ -2836,13 +2827,12 @@ xlog_state_do_callback(
				iclog = iclog->ic_next;
				continue;
			}
			spin_unlock(&log->l_icloglock);

			/*
			 * Running callbacks will drop the icloglock which means
			 * we'll have to run at least one more complete loop.
			 */
			cycled_icloglock = true;
			xlog_state_do_iclog_callbacks(log, iclog);
			cycled_icloglock = true;

			spin_lock(&log->l_icloglock);
			if (XLOG_FORCED_SHUTDOWN(log))
				wake_up_all(&iclog->ic_force_wait);
			else