On Wed 24-07-24 17:11:17, 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> Looks good. Feel free to add: Reviewed-by: Jan Kara <jack@xxxxxxx> Honza > --- > fs/jbd2/checkpoint.c | 7 +++++-- > 1 file changed, 5 insertions(+), 2 deletions(-) > > diff --git a/fs/jbd2/checkpoint.c b/fs/jbd2/checkpoint.c > index 77bc522e6821..98a0b2eb84f5 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 first_set = 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 (!first_set) { > first_tid = transaction->t_tid; > + first_set = true; > + } > last_transaction = journal->j_checkpoint_transactions->t_cpprev; > next_transaction = transaction; > last_tid = last_transaction->t_tid; > @@ -460,7 +463,7 @@ unsigned long jbd2_journal_shrink_checkpoint_list(journal_t *journal, > spin_unlock(&journal->j_list_lock); > cond_resched(); > > - if (*nr_to_scan && next_tid) > + if (*nr_to_scan && journal->j_shrink_transaction) > goto again; > out: > trace_jbd2_shrink_checkpoint_list(journal, first_tid, tid, last_tid, > -- Jan Kara <jack@xxxxxxxx> SUSE Labs, CR