From: Greg Kroah-Hartman Date: Mon, 27 May 2019 11:28:13 +0000 (+0200) Subject: 5.1-stable patches X-Git-Tag: v5.1.6~45 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=71a463e7109152afa5ecafabd0b24804a24aa1b4;p=thirdparty%2Fkernel%2Fstable-queue.git 5.1-stable patches added patches: ext4-do-not-delete-unlinked-inode-from-orphan-list-on-failed-truncate.patch ext4-wait-for-outstanding-dio-during-truncate-in-nojournal-mode.patch --- diff --git a/queue-5.1/ext4-do-not-delete-unlinked-inode-from-orphan-list-on-failed-truncate.patch b/queue-5.1/ext4-do-not-delete-unlinked-inode-from-orphan-list-on-failed-truncate.patch new file mode 100644 index 00000000000..31b5b423a0b --- /dev/null +++ b/queue-5.1/ext4-do-not-delete-unlinked-inode-from-orphan-list-on-failed-truncate.patch @@ -0,0 +1,37 @@ +From ee0ed02ca93ef1ecf8963ad96638795d55af2c14 Mon Sep 17 00:00:00 2001 +From: Jan Kara +Date: Thu, 23 May 2019 23:35:28 -0400 +Subject: ext4: do not delete unlinked inode from orphan list on failed truncate + +From: Jan Kara + +commit ee0ed02ca93ef1ecf8963ad96638795d55af2c14 upstream. + +It is possible that unlinked inode enters ext4_setattr() (e.g. if +somebody calls ftruncate(2) on unlinked but still open file). In such +case we should not delete the inode from the orphan list if truncate +fails. Note that this is mostly a theoretical concern as filesystem is +corrupted if we reach this path anyway but let's be consistent in our +orphan handling. + +Reviewed-by: Ira Weiny +Signed-off-by: Jan Kara +Signed-off-by: Theodore Ts'o +Cc: stable@kernel.org +Signed-off-by: Greg Kroah-Hartman + +--- + fs/ext4/inode.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/fs/ext4/inode.c ++++ b/fs/ext4/inode.c +@@ -5619,7 +5619,7 @@ int ext4_setattr(struct dentry *dentry, + up_write(&EXT4_I(inode)->i_data_sem); + ext4_journal_stop(handle); + if (error) { +- if (orphan) ++ if (orphan && inode->i_nlink) + ext4_orphan_del(NULL, inode); + goto err_out; + } diff --git a/queue-5.1/ext4-wait-for-outstanding-dio-during-truncate-in-nojournal-mode.patch b/queue-5.1/ext4-wait-for-outstanding-dio-during-truncate-in-nojournal-mode.patch new file mode 100644 index 00000000000..239b4a42536 --- /dev/null +++ b/queue-5.1/ext4-wait-for-outstanding-dio-during-truncate-in-nojournal-mode.patch @@ -0,0 +1,58 @@ +From 82a25b027ca48d7ef197295846b352345853dfa8 Mon Sep 17 00:00:00 2001 +From: Jan Kara +Date: Thu, 23 May 2019 23:07:08 -0400 +Subject: ext4: wait for outstanding dio during truncate in nojournal mode + +From: Jan Kara + +commit 82a25b027ca48d7ef197295846b352345853dfa8 upstream. + +We didn't wait for outstanding direct IO during truncate in nojournal +mode (as we skip orphan handling in that case). This can lead to fs +corruption or stale data exposure if truncate ends up freeing blocks +and these get reallocated before direct IO finishes. Fix the condition +determining whether the wait is necessary. + +CC: stable@vger.kernel.org +Fixes: 1c9114f9c0f1 ("ext4: serialize unlocked dio reads with truncate") +Reviewed-by: Ira Weiny +Signed-off-by: Jan Kara +Signed-off-by: Theodore Ts'o +Signed-off-by: Greg Kroah-Hartman + +--- + fs/ext4/inode.c | 21 +++++++++------------ + 1 file changed, 9 insertions(+), 12 deletions(-) + +--- a/fs/ext4/inode.c ++++ b/fs/ext4/inode.c +@@ -5624,20 +5624,17 @@ int ext4_setattr(struct dentry *dentry, + goto err_out; + } + } +- if (!shrink) ++ if (!shrink) { + pagecache_isize_extended(inode, oldsize, inode->i_size); +- +- /* +- * Blocks are going to be removed from the inode. Wait +- * for dio in flight. Temporarily disable +- * dioread_nolock to prevent livelock. +- */ +- if (orphan) { +- if (!ext4_should_journal_data(inode)) { +- inode_dio_wait(inode); +- } else +- ext4_wait_for_tail_page_commit(inode); ++ } else { ++ /* ++ * Blocks are going to be removed from the inode. Wait ++ * for dio in flight. ++ */ ++ inode_dio_wait(inode); + } ++ if (orphan && ext4_should_journal_data(inode)) ++ ext4_wait_for_tail_page_commit(inode); + down_write(&EXT4_I(inode)->i_mmap_sem); + + rc = ext4_break_layouts(inode); diff --git a/queue-5.1/series b/queue-5.1/series index 159e638f5b4..00ad7fd0f9e 100644 --- a/queue-5.1/series +++ b/queue-5.1/series @@ -1 +1,3 @@ x86-hide-the-int3_emulate_call-jmp-functions-from-uml.patch +ext4-do-not-delete-unlinked-inode-from-orphan-list-on-failed-truncate.patch +ext4-wait-for-outstanding-dio-during-truncate-in-nojournal-mode.patch