summaryrefslogtreecommitdiffstats
path: root/fs/ext4/super.c
diff options
context:
space:
mode:
authorJan Kara <jack@suse.cz>2023-03-08 15:25:28 +0100
committerTheodore Ts'o <tytso@mit.edu>2023-03-23 22:53:00 -0400
commite6c28a26b799c7640b77daff3e4a67808c74381c (patch)
treea1b6a6d1875437cc7eecae49456d881654ebacee /fs/ext4/super.c
parent3f079114bf522f27f3680238b6429f3dd45535b6 (diff)
downloadlinux-stable-e6c28a26b799c7640b77daff3e4a67808c74381c.tar.gz
linux-stable-e6c28a26b799c7640b77daff3e4a67808c74381c.tar.bz2
linux-stable-e6c28a26b799c7640b77daff3e4a67808c74381c.zip
ext4: Fix warnings when freezing filesystem with journaled data
Test generic/390 in data=journal mode often triggers a warning that ext4_do_writepages() tries to start a transaction on frozen filesystem. This happens because although all dirty data is properly written, jbd2 checkpointing code writes data through submit_bh() and as a result only buffer dirty bits are cleared but page dirty bits stay set. Later when the filesystem is frozen, writeback code comes, tries to write supposedly dirty pages and the warning triggers. Fix the problem by calling sync_filesystem() once more after flushing the whole journal to clear stray page dirty bits. [ Applied fixup patches to address crashes when running data=journal tests; see links for more details -- TYT ] Signed-off-by: Jan Kara <jack@suse.cz> Link: https://lore.kernel.org/r/20230308142528.12384-1-jack@suse.cz Reported-by: Eric Biggers <ebiggers@kernel.org> Link: https://lore.kernel.org/all/20230319183617.GA896@sol.localdomain Link: https://lore.kernel.org/r/20230323145404.21381-1-jack@suse.cz Link: https://lore.kernel.org/r/20230323145404.21381-2-jack@suse.cz Signed-off-by: Theodore Ts'o <tytso@mit.edu>
Diffstat (limited to 'fs/ext4/super.c')
-rw-r--r--fs/ext4/super.c11
1 files changed, 11 insertions, 0 deletions
diff --git a/fs/ext4/super.c b/fs/ext4/super.c
index f43e526112ae..f226f8ab469b 100644
--- a/fs/ext4/super.c
+++ b/fs/ext4/super.c
@@ -6293,6 +6293,17 @@ static int ext4_freeze(struct super_block *sb)
if (error < 0)
goto out;
+ /*
+ * Do another sync. We really should not have any dirty data
+ * anymore but our checkpointing code does not clear page dirty
+ * bits due to locking constraints so writeback still can get
+ * started for inodes with journalled data which triggers
+ * annoying warnings.
+ */
+ error = sync_filesystem(sb);
+ if (error < 0)
+ goto out;
+
/* Journal blocked and flushed, clear needs_recovery flag. */
ext4_clear_feature_journal_needs_recovery(sb);
if (ext4_orphan_file_empty(sb))