On Tue 14-05-24 19:24:33, Kemeng Shi wrote: > If b_frozen_data is created concurrently, we can update new_folio and > new_offset with b_frozen_data and then move forward > > Signed-off-by: Kemeng Shi <shikemeng@xxxxxxxxxxxxxxx> Looks good. Feel free to add: Reviewed-by: Jan Kara <jack@xxxxxxx> Honza > --- > fs/jbd2/journal.c | 13 ++++++------- > 1 file changed, 6 insertions(+), 7 deletions(-) > > diff --git a/fs/jbd2/journal.c b/fs/jbd2/journal.c > index 714e2ef0115a..5fb5062cf7ae 100644 > --- a/fs/jbd2/journal.c > +++ b/fs/jbd2/journal.c > @@ -351,7 +351,6 @@ int jbd2_journal_write_metadata_buffer(transaction_t *transaction, > atomic_set(&new_bh->b_count, 1); > > spin_lock(&jh_in->b_state_lock); > -repeat: > /* > * If a new transaction has already done a buffer copy-out, then > * we use that version of the data for the commit. > @@ -399,22 +398,22 @@ int jbd2_journal_write_metadata_buffer(transaction_t *transaction, > spin_lock(&jh_in->b_state_lock); > if (jh_in->b_frozen_data) { > jbd2_free(tmp, bh_in->b_size); > - goto repeat; > + goto copy_done; > } > > jh_in->b_frozen_data = tmp; > memcpy_from_folio(tmp, new_folio, new_offset, bh_in->b_size); > - > - new_folio = virt_to_folio(tmp); > - new_offset = offset_in_folio(new_folio, tmp); > - done_copy_out = 1; > - > /* > * This isn't strictly necessary, as we're using frozen > * data for the escaping, but it keeps consistency with > * b_frozen_data usage. > */ > jh_in->b_frozen_triggers = jh_in->b_triggers; > + > +copy_done: > + new_folio = virt_to_folio(jh_in->b_frozen_data); > + new_offset = offset_in_folio(new_folio, jh_in->b_frozen_data); > + done_copy_out = 1; > } > > /* > -- > 2.30.0 > -- Jan Kara <jack@xxxxxxxx> SUSE Labs, CR