mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-09-18 23:09:29 +02:00
ext4: write back partial-zeroed edges in WRITE_ZEROES
FALLOC_FL_WRITE_ZEROES requires that all blocks in the requested range
end up as written extents with zeroed content. For unaligned edges that
were partial-zeroed in dirty unwritten or delalloc state, the buffer
is left dirty while the underlying extent may not yet be converted to
written. As a result, a subsequent SYNC write to this range would still
trigger metadata changes, which violates the semantics of WRITE_ZEROES.
Fix this by calling filemap_write_and_wait_range() for partial-zeroed
edges to flush out the zeroed data and ensure the extent conversion
is complete.
Fixes: f4265b8d32 ("ext4: add FALLOC_FL_WRITE_ZEROES support")
Cc: stable@vger.kernel.org
Signed-off-by: Zhang Yi <yi.zhang@huawei.com>
Reviewed-by: Jan Kara <jack@suse.cz>
Link: https://patch.msgid.link/20260714080044.4038124-9-yi.zhang@huaweicloud.com
Signed-off-by: Theodore Ts'o <tytso@mit.edu>
This commit is contained in:
+9
-1
@@ -4791,7 +4791,15 @@ static long ext4_zero_range(struct file *file, loff_t offset,
|
||||
if (IS_ALIGNED(offset | end, blocksize))
|
||||
return ret;
|
||||
|
||||
if (((file->f_flags & O_SYNC) || IS_SYNC(inode)) && partial_zeroed) {
|
||||
/*
|
||||
* In FALLOC_FL_WRITE_ZEROES mode, edges that have been partially
|
||||
* zeroed must be written back to ensure the entire zeroed range
|
||||
* is converted to the written state. In SYNC mode, writeback is
|
||||
* also required to persist the zeroed data to disk.
|
||||
*/
|
||||
if (partial_zeroed &&
|
||||
((mode & FALLOC_FL_WRITE_ZEROES) ||
|
||||
(file->f_flags & O_SYNC) || IS_SYNC(inode))) {
|
||||
ret = filemap_write_and_wait_range(inode->i_mapping, offset,
|
||||
end - 1);
|
||||
if (ret)
|
||||
|
||||
Reference in New Issue
Block a user