On Tue, May 21, 2019 at 09:43:56AM +0200, Jan Kara wrote:
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") Signed-off-by: Jan Kara jack@suse.cz
Reviewed-by: Ira Weiny ira.weiny@intel.com
fs/ext4/inode.c | 21 +++++++++------------ 1 file changed, 9 insertions(+), 12 deletions(-)
diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c index 82298c63ea6d..9bcb7f2b86dd 100644 --- a/fs/ext4/inode.c +++ b/fs/ext4/inode.c @@ -5630,20 +5630,17 @@ int ext4_setattr(struct dentry *dentry, struct iattr *attr) 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))
down_write(&EXT4_I(inode)->i_mmap_sem);ext4_wait_for_tail_page_commit(inode);
rc = ext4_break_layouts(inode); -- 2.16.4