xfs: rework xlog_state_do_callback()
Clean it up a bit by factoring and rearranging some of the code. Signed-off-by: Dave Chinner <dchinner@redhat.com> Reviewed-by: Christoph Hellwig <hch@lst.de> Reviewed-by: Darrick J. Wong <djwong@kernel.org> Signed-off-by: Darrick J. Wong <djwong@kernel.org>
This commit is contained in:
committed by
Darrick J. Wong
parent
b36d4651e1
commit
8bb92005b0
@@ -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
|
* Loop over all the iclogs, running attached callbacks on them. Return true if
|
||||||
* log. Reset this starting point each time the log is
|
* we ran any callbacks, indicating that we dropped the icloglock.
|
||||||
* unlocked (during callbacks).
|
|
||||||
*
|
|
||||||
* Keep looping through iclogs until one full pass is made
|
|
||||||
* without running any callbacks.
|
|
||||||
*/
|
*/
|
||||||
cycled_icloglock = false;
|
static bool
|
||||||
first_iclog = log->l_iclog;
|
xlog_state_do_iclog_callbacks(
|
||||||
iclog = first_iclog;
|
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 {
|
do {
|
||||||
LIST_HEAD(cb_list);
|
LIST_HEAD(cb_list);
|
||||||
@@ -2879,7 +2869,7 @@ xlog_state_do_callback(
|
|||||||
trace_xlog_iclog_callbacks_start(iclog, _RET_IP_);
|
trace_xlog_iclog_callbacks_start(iclog, _RET_IP_);
|
||||||
xlog_cil_process_committed(&cb_list);
|
xlog_cil_process_committed(&cb_list);
|
||||||
trace_xlog_iclog_callbacks_done(iclog, _RET_IP_);
|
trace_xlog_iclog_callbacks_done(iclog, _RET_IP_);
|
||||||
cycled_icloglock = true;
|
ran_callback = true;
|
||||||
|
|
||||||
spin_lock(&log->l_icloglock);
|
spin_lock(&log->l_icloglock);
|
||||||
if (xlog_is_shutdown(log))
|
if (xlog_is_shutdown(log))
|
||||||
@@ -2889,6 +2879,26 @@ xlog_state_do_callback(
|
|||||||
iclog = iclog->ic_next;
|
iclog = iclog->ic_next;
|
||||||
} while (iclog != first_iclog);
|
} 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) {
|
if (++repeats > 5000) {
|
||||||
flushcnt += repeats;
|
flushcnt += repeats;
|
||||||
repeats = 0;
|
repeats = 0;
|
||||||
@@ -2896,7 +2906,7 @@ xlog_state_do_callback(
|
|||||||
"%s: possible infinite loop (%d iterations)",
|
"%s: possible infinite loop (%d iterations)",
|
||||||
__func__, flushcnt);
|
__func__, flushcnt);
|
||||||
}
|
}
|
||||||
} while (!xlog_is_shutdown(log) && cycled_icloglock);
|
}
|
||||||
|
|
||||||
if (log->l_iclog->ic_state == XLOG_STATE_ACTIVE ||
|
if (log->l_iclog->ic_state == XLOG_STATE_ACTIVE ||
|
||||||
xlog_is_shutdown(log))
|
xlog_is_shutdown(log))
|
||||||
|
|||||||
Reference in New Issue
Block a user