Commit b6903358 authored by Dave Chinner's avatar Dave Chinner Committed by Darrick J. Wong

xfs: remove callback dequeue loop from xlog_state_do_iclog_callbacks

If we are processing callbacks on an iclog, nothing can be
concurrently adding callbacks to the loop. We only add callbacks to
the iclog when they are in ACTIVE or WANT_SYNC state, and we
explicitly do not add callbacks if the iclog is already in IOERROR
state.

The only way to have a dequeue racing with an enqueue is to be
processing a shutdown without a direct reference to an iclog in
ACTIVE or WANT_SYNC state. As the enqueue avoids this race
condition, we only ever need a single dequeue operation in
xlog_state_do_iclog_callbacks(). Hence we can remove the loop.
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 6be00102
......@@ -2774,19 +2774,15 @@ xlog_state_do_iclog_callbacks(
struct xlog *log,
struct xlog_in_core *iclog)
{
trace_xlog_iclog_callbacks_start(iclog, _RET_IP_);
spin_lock(&iclog->ic_callback_lock);
while (!list_empty(&iclog->ic_callbacks)) {
LIST_HEAD(tmp);
LIST_HEAD(tmp);
list_splice_init(&iclog->ic_callbacks, &tmp);
spin_unlock(&iclog->ic_callback_lock);
xlog_cil_process_committed(&tmp);
spin_lock(&iclog->ic_callback_lock);
}
trace_xlog_iclog_callbacks_start(iclog, _RET_IP_);
spin_lock(&iclog->ic_callback_lock);
list_splice_init(&iclog->ic_callbacks, &tmp);
spin_unlock(&iclog->ic_callback_lock);
xlog_cil_process_committed(&tmp);
trace_xlog_iclog_callbacks_done(iclog, _RET_IP_);
}
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment