summaryrefslogtreecommitdiffstats
path: root/fs
diff options
context:
space:
mode:
authorJan Kara <jack@suse.cz>2019-05-23 23:07:08 -0400
committerTheodore Ts'o <tytso@mit.edu>2019-05-23 23:07:08 -0400
commit82a25b027ca48d7ef197295846b352345853dfa8 (patch)
tree3966300c54590f2562ce3c9453ad22bf75db62e7 /fs
parent0a944e8a6c66ca04c7afbaa17e22bf208a8b37f0 (diff)
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: 1c9114f9c0f1 ("ext4: serialize unlocked dio reads with truncate") Reviewed-by: Ira Weiny <ira.weiny@intel.com> Signed-off-by: Jan Kara <jack@suse.cz> Signed-off-by: Theodore Ts'o <tytso@mit.edu>
Diffstat (limited to 'fs')
-rw-r--r--fs/ext4/inode.c21
1 files 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)
5630 goto err_out; 5630 goto err_out;
5631 } 5631 }
5632 } 5632 }
5633 if (!shrink) 5633 if (!shrink) {
5634 pagecache_isize_extended(inode, oldsize, inode->i_size); 5634 pagecache_isize_extended(inode, oldsize, inode->i_size);
5635 5635 } else {
5636 /* 5636 /*
5637 * Blocks are going to be removed from the inode. Wait 5637 * Blocks are going to be removed from the inode. Wait
5638 * for dio in flight. Temporarily disable 5638 * for dio in flight.
5639 * dioread_nolock to prevent livelock. 5639 */
5640 */ 5640 inode_dio_wait(inode);
5641 if (orphan) {
5642 if (!ext4_should_journal_data(inode)) {
5643 inode_dio_wait(inode);
5644 } else
5645 ext4_wait_for_tail_page_commit(inode);
5646 } 5641 }
5642 if (orphan && ext4_should_journal_data(inode))
5643 ext4_wait_for_tail_page_commit(inode);
5647 down_write(&EXT4_I(inode)->i_mmap_sem); 5644 down_write(&EXT4_I(inode)->i_mmap_sem);
5648 5645
5649 rc = ext4_break_layouts(inode); 5646 rc = ext4_break_layouts(inode);