ext4: fix races of writeback with punch hole and zero range
[firefly-linux-kernel-4.4.55.git] / fs / ext4 / extents.c
index 4b105c96df082e916209417348ded03d3ac599b5..3578b25fccfd8eef98062e22ee037037a9c8ca38 100644 (file)
@@ -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);