Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 82a25b02 authored by Jan Kara's avatar Jan Kara Committed by Theodore Ts'o
Browse files

ext4: wait for outstanding dio during truncate in nojournal mode



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: 1c9114f9 ("ext4: serialize unlocked dio reads with truncate")
Reviewed-by: default avatarIra Weiny <ira.weiny@intel.com>
Signed-off-by: default avatarJan Kara <jack@suse.cz>
Signed-off-by: default avatarTheodore Ts'o <tytso@mit.edu>
parent 0a944e8a
Loading
Loading
Loading
Loading
+9 −12
Original line number Diff line number Diff line
@@ -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);

		} else {
			/*
			 * Blocks are going to be removed from the inode. Wait
		 * for dio in flight.  Temporarily disable
		 * dioread_nolock to prevent livelock.
			 * for dio in flight.
			 */
		if (orphan) {
			if (!ext4_should_journal_data(inode)) {
			inode_dio_wait(inode);
			} else
				ext4_wait_for_tail_page_commit(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);