ext4: fix incorrect tid assumption in ext4_wait_for_tail_page_commit()
authorLuis Henriques (SUSE) <luis.henriques@linux.dev>
Wed, 24 Jul 2024 16:11:15 +0000 (17:11 +0100)
committerTheodore Ts'o <tytso@mit.edu>
Tue, 27 Aug 2024 03:39:35 +0000 (23:39 -0400)
Function ext4_wait_for_tail_page_commit() assumes that '0' is not a valid
value for transaction IDs, which is incorrect.  Don't assume that and invoke
jbd2_log_wait_commit() if the journal had a committing transaction instead.

Signed-off-by: Luis Henriques (SUSE) <luis.henriques@linux.dev>
Reviewed-by: Jan Kara <jack@suse.cz>
Link: https://patch.msgid.link/20240724161119.13448-2-luis.henriques@linux.dev
Signed-off-by: Theodore Ts'o <tytso@mit.edu>
Cc: stable@kernel.org
fs/ext4/inode.c

index 941c1c0d5c6ed93f5ce3ba7b6cbdeb98e3167c75..a0fa5192db8ed33c2d090bfd78071f52e95b2c64 100644 (file)
@@ -5279,8 +5279,9 @@ static void ext4_wait_for_tail_page_commit(struct inode *inode)
 {
        unsigned offset;
        journal_t *journal = EXT4_SB(inode->i_sb)->s_journal;
-       tid_t commit_tid = 0;
+       tid_t commit_tid;
        int ret;
+       bool has_transaction;
 
        offset = inode->i_size & (PAGE_SIZE - 1);
        /*
@@ -5305,12 +5306,14 @@ static void ext4_wait_for_tail_page_commit(struct inode *inode)
                folio_put(folio);
                if (ret != -EBUSY)
                        return;
-               commit_tid = 0;
+               has_transaction = false;
                read_lock(&journal->j_state_lock);
-               if (journal->j_committing_transaction)
+               if (journal->j_committing_transaction) {
                        commit_tid = journal->j_committing_transaction->t_tid;
+                       has_transaction = true;
+               }
                read_unlock(&journal->j_state_lock);
-               if (commit_tid)
+               if (has_transaction)
                        jbd2_log_wait_commit(journal, commit_tid);
        }
 }