Commit 4c15129a authored by Kemeng Shi's avatar Kemeng Shi Committed by Theodore Ts'o

jbd2: jump to new copy_done tag when b_frozen_data is created concurrently

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: default avatarKemeng Shi <shikemeng@huaweicloud.com>
Reviewed-by: default avatarZhang Yi <yi.zhang@huawei.com>
Reviewed-by: default avatarJan Kara <jack@suse.cz>
Link: https://patch.msgid.link/20240514112438.1269037-5-shikemeng@huaweicloud.comSigned-off-by: default avatarTheodore Ts'o <tytso@mit.edu>
parent 5dd3e8c0
...@@ -351,7 +351,6 @@ int jbd2_journal_write_metadata_buffer(transaction_t *transaction, ...@@ -351,7 +351,6 @@ int jbd2_journal_write_metadata_buffer(transaction_t *transaction,
atomic_set(&new_bh->b_count, 1); atomic_set(&new_bh->b_count, 1);
spin_lock(&jh_in->b_state_lock); spin_lock(&jh_in->b_state_lock);
repeat:
/* /*
* If a new transaction has already done a buffer copy-out, then * If a new transaction has already done a buffer copy-out, then
* we use that version of the data for the commit. * we use that version of the data for the commit.
...@@ -399,22 +398,22 @@ int jbd2_journal_write_metadata_buffer(transaction_t *transaction, ...@@ -399,22 +398,22 @@ int jbd2_journal_write_metadata_buffer(transaction_t *transaction,
spin_lock(&jh_in->b_state_lock); spin_lock(&jh_in->b_state_lock);
if (jh_in->b_frozen_data) { if (jh_in->b_frozen_data) {
jbd2_free(tmp, bh_in->b_size); jbd2_free(tmp, bh_in->b_size);
goto repeat; goto copy_done;
} }
jh_in->b_frozen_data = tmp; jh_in->b_frozen_data = tmp;
memcpy_from_folio(tmp, new_folio, new_offset, bh_in->b_size); 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 * This isn't strictly necessary, as we're using frozen
* data for the escaping, but it keeps consistency with * data for the escaping, but it keeps consistency with
* b_frozen_data usage. * b_frozen_data usage.
*/ */
jh_in->b_frozen_triggers = jh_in->b_triggers; 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;
} }
/* /*
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment