Jan Kara 31ca38
From 0a944e8a6c66ca04c7afbaa17e22bf208a8b37f0 Mon Sep 17 00:00:00 2001
Jan Kara 31ca38
From: Theodore Ts'o <tytso@mit.edu>
Jan Kara 31ca38
Date: Wed, 22 May 2019 10:27:01 -0400
Jan Kara 31ca38
Subject: [PATCH] ext4: don't perform block validity checks on the journal
Jan Kara 31ca38
 inode
Jan Kara 31ca38
Git-commit: 0a944e8a6c66ca04c7afbaa17e22bf208a8b37f0
Jan Kara 31ca38
Patch-mainline: v5.2-rc2
Jan Kara 31ca38
References: bsc#1158021 CVE-2019-19319
Jan Kara 31ca38
Jan Kara 31ca38
Since the journal inode is already checked when we added it to the
Jan Kara 31ca38
block validity's system zone, if we check it again, we'll just trigger
Jan Kara 31ca38
a failure.
Jan Kara 31ca38
Jan Kara 31ca38
This was causing failures like this:
Jan Kara 31ca38
Jan Kara 31ca38
[   53.897001] EXT4-fs error (device sda): ext4_find_extent:909: inode
Jan Kara 31ca38
#8: comm jbd2/sda-8: pblk 121667583 bad header/extent: invalid extent entries - magic f30a, entries 8, max 340(340), depth 0(0)
Jan Kara 31ca38
[   53.931430] jbd2_journal_bmap: journal block not found at offset 49 on sda-8
Jan Kara 31ca38
[   53.938480] Aborting journal on device sda-8.
Jan Kara 31ca38
Jan Kara 31ca38
... but only if the system was under enough memory pressure that
Jan Kara 31ca38
logical->physical mapping for the journal inode gets pushed out of the
Jan Kara 31ca38
extent cache.  (This is why it wasn't noticed earlier.)
Jan Kara 31ca38
Jan Kara 31ca38
Fixes: 345c0dbf3a30 ("ext4: protect journal inode's blocks using block_validity")
Jan Kara 31ca38
Reported-by: Dan Rue <dan.rue@linaro.org>
Jan Kara 31ca38
Signed-off-by: Theodore Ts'o <tytso@mit.edu>
Jan Kara 31ca38
Tested-by: Naresh Kamboju <naresh.kamboju@linaro.org>
Jan Kara 31ca38
Acked-by: Jan Kara <jack@suse.cz>
Jan Kara 31ca38
Jan Kara 31ca38
---
Jan Kara 31ca38
 fs/ext4/extents.c | 12 ++++++++----
Jan Kara 31ca38
 1 file changed, 8 insertions(+), 4 deletions(-)
Jan Kara 31ca38
Jan Kara 31ca38
diff --git a/fs/ext4/extents.c b/fs/ext4/extents.c
Jan Kara 31ca38
index f2c62e2a0c98..d40ed940001e 100644
Jan Kara 31ca38
--- a/fs/ext4/extents.c
Jan Kara 31ca38
+++ b/fs/ext4/extents.c
Jan Kara 31ca38
@@ -518,10 +518,14 @@ __read_extent_tree_block(const char *function, unsigned int line,
Jan Kara 31ca38
 	}
Jan Kara 31ca38
 	if (buffer_verified(bh) && !(flags & EXT4_EX_FORCE_CACHE))
Jan Kara 31ca38
 		return bh;
Jan Kara 31ca38
-	err = __ext4_ext_check(function, line, inode,
Jan Kara 31ca38
-			       ext_block_hdr(bh), depth, pblk);
Jan Kara 31ca38
-	if (err)
Jan Kara 31ca38
-		goto errout;
Jan Kara 31ca38
+	if (!ext4_has_feature_journal(inode->i_sb) ||
Jan Kara 31ca38
+	    (inode->i_ino !=
Jan Kara 31ca38
+	     le32_to_cpu(EXT4_SB(inode->i_sb)->s_es->s_journal_inum))) {
Jan Kara 31ca38
+		err = __ext4_ext_check(function, line, inode,
Jan Kara 31ca38
+				       ext_block_hdr(bh), depth, pblk);
Jan Kara 31ca38
+		if (err)
Jan Kara 31ca38
+			goto errout;
Jan Kara 31ca38
+	}
Jan Kara 31ca38
 	set_buffer_verified(bh);
Jan Kara 31ca38
 	/*
Jan Kara 31ca38
 	 * If this is a leaf block, cache all of its entries
Jan Kara 31ca38
-- 
Jan Kara 31ca38
2.16.4
Jan Kara 31ca38