]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
jbd2: flush filesystem device before updating tail sequence
authorZhang Yi <yi.zhang@huawei.com>
Tue, 3 Dec 2024 01:44:07 +0000 (09:44 +0800)
committerChristian Brauner <brauner@kernel.org>
Wed, 4 Dec 2024 11:00:05 +0000 (12:00 +0100)
When committing transaction in jbd2_journal_commit_transaction(), the
disk caches for the filesystem device should be flushed before updating
the journal tail sequence. However, this step is missed if the journal
is not located on the filesystem device. As a result, the filesystem may
become inconsistent following a power failure or system crash. Fix it by
ensuring that the filesystem device is flushed appropriately.

Fixes: 3339578f0578 ("jbd2: cleanup journal tail after transaction commit")
Signed-off-by: Zhang Yi <yi.zhang@huawei.com>
Link: https://lore.kernel.org/r/20241203014407.805916-3-yi.zhang@huaweicloud.com
Reviewed-by: Jan Kara <jack@suse.cz>
Signed-off-by: Christian Brauner <brauner@kernel.org>
fs/jbd2/commit.c

index 9153ff3a08e76c8b8fce12c90e25a4acc99139f5..e8e80761ac730a0a44db2a679f92969433b5435a 100644 (file)
@@ -772,9 +772,9 @@ start_journal_io:
        /*
         * If the journal is not located on the file system device,
         * then we must flush the file system device before we issue
-        * the commit record
+        * the commit record and update the journal tail sequence.
         */
-       if (commit_transaction->t_need_data_flush &&
+       if ((commit_transaction->t_need_data_flush || update_tail) &&
            (journal->j_fs_dev != journal->j_dev) &&
            (journal->j_flags & JBD2_BARRIER))
                blkdev_issue_flush(journal->j_fs_dev);