On Fri, Mar 06, 2020 at 07:31:35AM -0700, Christoph Hellwig wrote: > Factor out the code to mark an iclog a active into a new helper. "mark as active" or just "mark active" > > Signed-off-by: Christoph Hellwig <hch@xxxxxx> > --- Otherwise looks fine: Reviewed-by: Brian Foster <bfoster@xxxxxxxxxx> > fs/xfs/xfs_log.c | 68 +++++++++++++++++++++++++----------------------- > 1 file changed, 36 insertions(+), 32 deletions(-) > > diff --git a/fs/xfs/xfs_log.c b/fs/xfs/xfs_log.c > index 45f7a6eaddea..d1accad13af4 100644 > --- a/fs/xfs/xfs_log.c > +++ b/fs/xfs/xfs_log.c > @@ -2536,6 +2536,38 @@ xlog_write( > ***************************************************************************** > */ > > +static void > +xlog_state_activate_iclog( > + struct xlog_in_core *iclog, > + int *changed) > +{ > + ASSERT(list_empty_careful(&iclog->ic_callbacks)); > + > + /* > + * If the number of ops in this iclog indicate it just contains the > + * dummy transaction, we can change state into IDLE (the second time > + * around). Otherwise we should change the state into NEED a dummy. > + * We don't need to cover the dummy. > + */ > + if (!*changed && > + iclog->ic_header.h_num_logops == cpu_to_be32(XLOG_COVER_OPS)) { > + *changed = 1; > + } else { > + /* > + * We have two dirty iclogs so start over. This could also be > + * num of ops indicating this is not the dummy going out. > + */ > + *changed = 2; > + } > + > + iclog->ic_state = XLOG_STATE_ACTIVE; > + iclog->ic_offset = 0; > + iclog->ic_header.h_num_logops = 0; > + memset(iclog->ic_header.h_cycle_data, 0, > + sizeof(iclog->ic_header.h_cycle_data)); > + iclog->ic_header.h_lsn = 0; > +} > + > /* > * An iclog has just finished IO completion processing, so we need to update > * the iclog state and propagate that up into the overall log state. Hence we > @@ -2567,38 +2599,10 @@ xlog_state_clean_iclog( > /* Walk all the iclogs to update the ordered active state. */ > iclog = log->l_iclog; > do { > - if (iclog->ic_state == XLOG_STATE_DIRTY) { > - iclog->ic_state = XLOG_STATE_ACTIVE; > - iclog->ic_offset = 0; > - ASSERT(list_empty_careful(&iclog->ic_callbacks)); > - /* > - * If the number of ops in this iclog indicate it just > - * contains the dummy transaction, we can > - * change state into IDLE (the second time around). > - * Otherwise we should change the state into > - * NEED a dummy. > - * We don't need to cover the dummy. > - */ > - if (!changed && > - (be32_to_cpu(iclog->ic_header.h_num_logops) == > - XLOG_COVER_OPS)) { > - changed = 1; > - } else { > - /* > - * We have two dirty iclogs so start over > - * This could also be num of ops indicates > - * this is not the dummy going out. > - */ > - changed = 2; > - } > - iclog->ic_header.h_num_logops = 0; > - memset(iclog->ic_header.h_cycle_data, 0, > - sizeof(iclog->ic_header.h_cycle_data)); > - iclog->ic_header.h_lsn = 0; > - } else if (iclog->ic_state == XLOG_STATE_ACTIVE) > - /* do nothing */; > - else > - break; /* stop cleaning */ > + if (iclog->ic_state == XLOG_STATE_DIRTY) > + xlog_state_activate_iclog(iclog, &changed); > + else if (iclog->ic_state != XLOG_STATE_ACTIVE) > + break; > iclog = iclog->ic_next; > } while (iclog != log->l_iclog); > > -- > 2.24.1 >