On Tue 23-07-24 16:44:01, Luis Henriques (SUSE) wrote: > Function jbd2_journal_shrink_checkpoint_list() assumes that '0' is not a > valid value for transaction IDs, which is incorrect. Don't assume that and > use two extra boolean variables to control the loop iterations and keep > track of the first and last tid. > > Signed-off-by: Luis Henriques (SUSE) <luis.henriques@xxxxxxxxx> > --- > fs/jbd2/checkpoint.c | 8 ++++++-- > 1 file changed, 6 insertions(+), 2 deletions(-) > > diff --git a/fs/jbd2/checkpoint.c b/fs/jbd2/checkpoint.c > index 77bc522e6821..f5a594237b7a 100644 > --- a/fs/jbd2/checkpoint.c > +++ b/fs/jbd2/checkpoint.c > @@ -410,6 +410,7 @@ unsigned long jbd2_journal_shrink_checkpoint_list(journal_t *journal, > tid_t tid = 0; > unsigned long nr_freed = 0; > unsigned long freed; > + bool is_first = true, is_last = false; > > again: > spin_lock(&journal->j_list_lock); > @@ -429,8 +430,10 @@ unsigned long jbd2_journal_shrink_checkpoint_list(journal_t *journal, > else > transaction = journal->j_checkpoint_transactions; > > - if (!first_tid) > + if (is_first) { > first_tid = transaction->t_tid; > + is_first = false; > + } > last_transaction = journal->j_checkpoint_transactions->t_cpprev; > next_transaction = transaction; > last_tid = last_transaction->t_tid; > @@ -455,12 +458,13 @@ unsigned long jbd2_journal_shrink_checkpoint_list(journal_t *journal, > } else { > journal->j_shrink_transaction = NULL; > next_tid = 0; > + is_last = true; > } > > spin_unlock(&journal->j_list_lock); > cond_resched(); > > - if (*nr_to_scan && next_tid) > + if (*nr_to_scan && !is_last) I'd make this: if (*nr_to_scan && journal->j_shrink_transaction) goto again; and just remove is_last. Also we might rename is_first to first_set? At least to me it would be more comprehensible. Thanks! Honza > goto again; > out: > trace_jbd2_shrink_checkpoint_list(journal, first_tid, tid, last_tid, > -- Jan Kara <jack@xxxxxxxx> SUSE Labs, CR