提交 b33d034a 编写于 作者: J Jan Kara 提交者: Xie XiuQi

ext4: wait for outstanding dio during truncate in nojournal mode

commit 82a25b02 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: 1c9114f9 ("ext4: serialize unlocked dio reads with truncate")
Reviewed-by: NIra Weiny <ira.weiny@intel.com>
Signed-off-by: NJan Kara <jack@suse.cz>
Signed-off-by: NTheodore Ts'o <tytso@mit.edu>
Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Conflicts:
  fs/ext4/inode.c
[yyl: adjust context]
Signed-off-by: NYang Yingliang <yangyingliang@huawei.com>
上级 c4cf36c2
...@@ -5609,22 +5609,19 @@ int ext4_setattr(struct dentry *dentry, struct iattr *attr) ...@@ -5609,22 +5609,19 @@ int ext4_setattr(struct dentry *dentry, struct iattr *attr)
goto err_out; goto err_out;
} }
} }
if (!shrink) if (!shrink) {
pagecache_isize_extended(inode, oldsize, inode->i_size); pagecache_isize_extended(inode, oldsize, inode->i_size);
} else {
/* /*
* Blocks are going to be removed from the inode. Wait * Blocks are going to be removed from the inode. Wait
* for dio in flight. Temporarily disable * for dio in flight.
* dioread_nolock to prevent livelock.
*/ */
if (orphan) {
if (!ext4_should_journal_data(inode)) {
ext4_inode_block_unlocked_dio(inode); ext4_inode_block_unlocked_dio(inode);
inode_dio_wait(inode); inode_dio_wait(inode);
ext4_inode_resume_unlocked_dio(inode); ext4_inode_resume_unlocked_dio(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); down_write(&EXT4_I(inode)->i_mmap_sem);
rc = ext4_break_layouts(inode); rc = ext4_break_layouts(inode);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册