]> git.proxmox.com Git - mirror_ubuntu-hirsute-kernel.git/commitdiff
ext4: annotate data race in start_this_handle()
authorJan Kara <jack@suse.cz>
Tue, 6 Apr 2021 16:17:59 +0000 (18:17 +0200)
committerStefan Bader <stefan.bader@canonical.com>
Wed, 19 May 2021 08:32:25 +0000 (10:32 +0200)
BugLink: https://bugs.launchpad.net/bugs/1928857
commit 3b1833e92baba135923af4a07e73fe6e54be5a2f upstream.

Access to journal->j_running_transaction is not protected by appropriate
lock and thus is racy. We are well aware of that and the code handles
the race properly. Just add a comment and data_race() annotation.

Cc: stable@kernel.org
Reported-by: syzbot+30774a6acf6a2cf6d535@syzkaller.appspotmail.com
Signed-off-by: Jan Kara <jack@suse.cz>
Link: https://lore.kernel.org/r/20210406161804.20150-1-jack@suse.cz
Signed-off-by: Theodore Ts'o <tytso@mit.edu>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: Kamal Mostafa <kamal@canonical.com>
Signed-off-by: Stefan Bader <stefan.bader@canonical.com>
fs/jbd2/transaction.c

index 9396666b731452e523798b2e96b9a94e9d802825..398d1d9209e2426ee0a0c1e135598ac8134ddbcb 100644 (file)
@@ -349,7 +349,12 @@ static int start_this_handle(journal_t *journal, handle_t *handle,
        }
 
 alloc_transaction:
-       if (!journal->j_running_transaction) {
+       /*
+        * This check is racy but it is just an optimization of allocating new
+        * transaction early if there are high chances we'll need it. If we
+        * guess wrong, we'll retry or free unused transaction.
+        */
+       if (!data_race(journal->j_running_transaction)) {
                /*
                 * If __GFP_FS is not present, then we may be being called from
                 * inside the fs writeback layer, so we MUST NOT fail.