summaryrefslogtreecommitdiffstats
path: root/fs/ext4/extents.c
diff options
context:
space:
mode:
authorJan Kara <jack@suse.com>2015-12-07 14:34:49 -0500
committerTheodore Ts'o <tytso@mit.edu>2015-12-07 14:34:49 -0500
commit011278485ecc3cd2a3954b5d4c73101d919bf1fa (patch)
tree740938e00aa0c972db386b5576656e646c02e36d /fs/ext4/extents.c
parent32ebffd3bbb4162da5ff88f9a35dd32d0a28ea70 (diff)
downloadlinux-stable-011278485ecc3cd2a3954b5d4c73101d919bf1fa.tar.gz
linux-stable-011278485ecc3cd2a3954b5d4c73101d919bf1fa.tar.bz2
linux-stable-011278485ecc3cd2a3954b5d4c73101d919bf1fa.zip
ext4: fix races of writeback with punch hole and zero range
When doing delayed allocation, update of on-disk inode size is postponed until IO submission time. However hole punch or zero range fallocate calls can end up discarding the tail page cache page and thus on-disk inode size would never be properly updated. Make sure the on-disk inode size is updated before truncating page cache. Signed-off-by: Jan Kara <jack@suse.com> Signed-off-by: Theodore Ts'o <tytso@mit.edu>
Diffstat (limited to 'fs/ext4/extents.c')
-rw-r--r--fs/ext4/extents.c5
1 files changed, 5 insertions, 0 deletions
diff --git a/fs/ext4/extents.c b/fs/ext4/extents.c
index 4b105c96df08..3578b25fccfd 100644
--- a/fs/ext4/extents.c
+++ b/fs/ext4/extents.c
@@ -4847,6 +4847,11 @@ static long ext4_zero_range(struct file *file, loff_t offset,
* released from page cache.
*/
down_write(&EXT4_I(inode)->i_mmap_sem);
+ ret = ext4_update_disksize_before_punch(inode, offset, len);
+ if (ret) {
+ up_write(&EXT4_I(inode)->i_mmap_sem);
+ goto out_dio;
+ }
/* Now release the pages and zero block aligned part of pages */
truncate_pagecache_range(inode, start, end - 1);
inode->i_mtime = inode->i_ctime = ext4_current_time(inode);