]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
4.9-stable patches
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 20 Apr 2020 09:15:48 +0000 (11:15 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 20 Apr 2020 09:15:48 +0000 (11:15 +0200)
added patches:
ext4-do-not-zeroout-extents-beyond-i_disksize.patch

queue-4.9/ext4-do-not-zeroout-extents-beyond-i_disksize.patch [new file with mode: 0644]
queue-4.9/series

diff --git a/queue-4.9/ext4-do-not-zeroout-extents-beyond-i_disksize.patch b/queue-4.9/ext4-do-not-zeroout-extents-beyond-i_disksize.patch
new file mode 100644 (file)
index 0000000..d62f377
--- /dev/null
@@ -0,0 +1,63 @@
+From 801674f34ecfed033b062a0f217506b93c8d5e8a Mon Sep 17 00:00:00 2001
+From: Jan Kara <jack@suse.cz>
+Date: Tue, 31 Mar 2020 12:50:16 +0200
+Subject: ext4: do not zeroout extents beyond i_disksize
+
+From: Jan Kara <jack@suse.cz>
+
+commit 801674f34ecfed033b062a0f217506b93c8d5e8a upstream.
+
+We do not want to create initialized extents beyond end of file because
+for e2fsck it is impossible to distinguish them from a case of corrupted
+file size / extent tree and so it complains like:
+
+Inode 12, i_size is 147456, should be 163840.  Fix? no
+
+Code in ext4_ext_convert_to_initialized() and
+ext4_split_convert_extents() try to make sure it does not create
+initialized extents beyond inode size however they check against
+inode->i_size which is wrong. They should instead check against
+EXT4_I(inode)->i_disksize which is the current inode size on disk.
+That's what e2fsck is going to see in case of crash before all dirty
+data is written. This bug manifests as generic/456 test failure (with
+recent enough fstests where fsx got fixed to properly pass
+FALLOC_KEEP_SIZE_FL flags to the kernel) when run with dioread_lock
+mount option.
+
+CC: stable@vger.kernel.org
+Fixes: 21ca087a3891 ("ext4: Do not zero out uninitialized extents beyond i_size")
+Reviewed-by: Lukas Czerner <lczerner@redhat.com>
+Signed-off-by: Jan Kara <jack@suse.cz>
+Signed-off-by: Theodore Ts'o <tytso@mit.edu>
+Link: https://lore.kernel.org/r/20200331105016.8674-1-jack@suse.cz
+Signed-off-by: Theodore Ts'o <tytso@mit.edu>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ fs/ext4/extents.c |    8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+--- a/fs/ext4/extents.c
++++ b/fs/ext4/extents.c
+@@ -3445,8 +3445,8 @@ static int ext4_ext_convert_to_initializ
+               (unsigned long long)map->m_lblk, map_len);
+       sbi = EXT4_SB(inode->i_sb);
+-      eof_block = (inode->i_size + inode->i_sb->s_blocksize - 1) >>
+-              inode->i_sb->s_blocksize_bits;
++      eof_block = (EXT4_I(inode)->i_disksize + inode->i_sb->s_blocksize - 1)
++                      >> inode->i_sb->s_blocksize_bits;
+       if (eof_block < map->m_lblk + map_len)
+               eof_block = map->m_lblk + map_len;
+@@ -3701,8 +3701,8 @@ static int ext4_split_convert_extents(ha
+                 __func__, inode->i_ino,
+                 (unsigned long long)map->m_lblk, map->m_len);
+-      eof_block = (inode->i_size + inode->i_sb->s_blocksize - 1) >>
+-              inode->i_sb->s_blocksize_bits;
++      eof_block = (EXT4_I(inode)->i_disksize + inode->i_sb->s_blocksize - 1)
++                      >> inode->i_sb->s_blocksize_bits;
+       if (eof_block < map->m_lblk + map->m_len)
+               eof_block = map->m_lblk + map->m_len;
+       /*
index b32efb6e06613674f2629ac03d5e9df202475131..a1a571750f9f5e59a5125c8271f7dc8eefcab028 100644 (file)
@@ -76,3 +76,4 @@ asoc-intel-mrfld-return-error-codes-when-an-error-occurs.patch
 alsa-usb-audio-don-t-override-ignore_ctl_error-value-from-the-map.patch
 btrfs-check-commit-root-generation-in-should_ignore_root.patch
 mac80211_hwsim-use-kstrndup-in-place-of-kasprintf.patch
+ext4-do-not-zeroout-extents-beyond-i_disksize.patch