From: Zhang Yi <yi.zhang@xxxxxxxxxx> If we zero partial blocks, iomap_zero_iter() will skip zeroing out if the srcmap is IOMAP_UNWRITTEN, it works fine in xfs because this type means the block is pure unwritten, doesn't contain any delayed data, but in ext4, IOMAP_UNWRITTEN may contain delayed data, it may hard to change the definition of this flag in ext4, so just writeback partial blocks firstly, make sure it becomes IOMAP_MAPPED. Signed-off-by: Zhang Yi <yi.zhang@xxxxxxxxxx> --- fs/ext4/extents.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/fs/ext4/extents.c b/fs/ext4/extents.c index 52bad225e3c8..b502edcf014b 100644 --- a/fs/ext4/extents.c +++ b/fs/ext4/extents.c @@ -4576,6 +4576,15 @@ static long ext4_zero_range(struct file *file, loff_t offset, if (ret) goto out_mutex; + ret = filemap_write_and_wait_range(mapping, + round_down(offset, 1 << blkbits), offset); + if (ret) + goto out_mutex; + + ret = filemap_write_and_wait_range(mapping, offset + len, + round_up((offset + len), 1 << blkbits)); + if (ret) + goto out_mutex; } /* Zero range excluding the unaligned edges */ -- 2.39.2