This is a note to let you know that I've just added the patch titled ext4: annotate data race in jbd2_journal_dirty_metadata() to the 5.10-stable tree which can be found at: http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary The filename of the patch is: ext4-annotate-data-race-in-jbd2_journal_dirty_metadata.patch and it can be found in the queue-5.10 subdirectory. If you, or anyone else, feels it should not be added to the stable tree, please let <stable@xxxxxxxxxxxxxxx> know about it. >From 83fe6b18b8d04c6c849379005e1679bac9752466 Mon Sep 17 00:00:00 2001 From: Jan Kara <jack@xxxxxxx> Date: Tue, 6 Apr 2021 18:18:00 +0200 Subject: ext4: annotate data race in jbd2_journal_dirty_metadata() From: Jan Kara <jack@xxxxxxx> commit 83fe6b18b8d04c6c849379005e1679bac9752466 upstream. Assertion checks in jbd2_journal_dirty_metadata() are known to be racy but we don't want to be grabbing locks just for them. We thus recheck them under b_state_lock only if it looks like they would fail. Annotate the checks with data_race(). Cc: stable@xxxxxxxxxx Reported-by: Hao Sun <sunhao.th@xxxxxxxxx> Signed-off-by: Jan Kara <jack@xxxxxxx> Link: https://lore.kernel.org/r/20210406161804.20150-2-jack@xxxxxxx Signed-off-by: Theodore Ts'o <tytso@xxxxxxx> Signed-off-by: Greg Kroah-Hartman <gregkh@xxxxxxxxxxxxxxxxxxx> --- fs/jbd2/transaction.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) --- a/fs/jbd2/transaction.c +++ b/fs/jbd2/transaction.c @@ -1479,8 +1479,8 @@ int jbd2_journal_dirty_metadata(handle_t * crucial to catch bugs so let's do a reliable check until the * lockless handling is fully proven. */ - if (jh->b_transaction != transaction && - jh->b_next_transaction != transaction) { + if (data_race(jh->b_transaction != transaction && + jh->b_next_transaction != transaction)) { spin_lock(&jh->b_state_lock); J_ASSERT_JH(jh, jh->b_transaction == transaction || jh->b_next_transaction == transaction); @@ -1488,8 +1488,8 @@ int jbd2_journal_dirty_metadata(handle_t } if (jh->b_modified == 1) { /* If it's in our transaction it must be in BJ_Metadata list. */ - if (jh->b_transaction == transaction && - jh->b_jlist != BJ_Metadata) { + if (data_race(jh->b_transaction == transaction && + jh->b_jlist != BJ_Metadata)) { spin_lock(&jh->b_state_lock); if (jh->b_transaction == transaction && jh->b_jlist != BJ_Metadata) Patches currently in stable-queue which might be from jack@xxxxxxx are queue-5.10/ext4-fix-occasional-generic-418-failure.patch queue-5.10/ext4-do-not-set-sb_active-in-ext4_orphan_cleanup.patch queue-5.10/ext4-annotate-data-race-in-start_this_handle.patch queue-5.10/ext4-fix-check-to-prevent-false-positive-report-of-incorrect-used-inodes.patch queue-5.10/ext4-annotate-data-race-in-jbd2_journal_dirty_metadata.patch