]> www.infradead.org Git - users/willy/linux.git/commitdiff
jbd2: jump to new copy_done tag when b_frozen_data is created concurrently
authorKemeng Shi <shikemeng@huaweicloud.com>
Tue, 14 May 2024 11:24:33 +0000 (19:24 +0800)
committerTheodore Ts'o <tytso@mit.edu>
Thu, 27 Jun 2024 14:20:26 +0000 (10:20 -0400)
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@huaweicloud.com>
Reviewed-by: Zhang Yi <yi.zhang@huawei.com>
Reviewed-by: Jan Kara <jack@suse.cz>
Link: https://patch.msgid.link/20240514112438.1269037-5-shikemeng@huaweicloud.com
Signed-off-by: Theodore Ts'o <tytso@mit.edu>
fs/jbd2/journal.c

index 3a7695bfb76f4c7fb7453e66bae249ad7ef6997d..7398020007394e0f7cf8b4fdfa6145207be52459 100644 (file)
@@ -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 @@ repeat:
                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;
        }
 
        /*