iomap: handle a post-direct I/O invalidate race in iomap_write_delalloc_release
When direct I/O completions invalidates the page cache it holds neither the i_rwsem nor the invalidate_lock so it can be racing with iomap_write_delalloc_release. If the search for the end of the region that contains data returns the start offset we hit such a race and just need to look for the end of the newly created hole instead. Signed-off-by: Christoph Hellwig <hch@lst.de> Link: https://lore.kernel.org/r/20240910043949.3481298-2-hch@lst.de Reviewed-by: Darrick J. Wong <djwong@kernel.org> Signed-off-by: Christian Brauner <brauner@kernel.org>
This commit is contained in:
parent
b1daf3f847
commit
7a9d43eace
@ -1242,7 +1242,15 @@ static int iomap_write_delalloc_release(struct inode *inode,
|
|||||||
error = data_end;
|
error = data_end;
|
||||||
goto out_unlock;
|
goto out_unlock;
|
||||||
}
|
}
|
||||||
WARN_ON_ONCE(data_end <= start_byte);
|
|
||||||
|
/*
|
||||||
|
* If we race with post-direct I/O invalidation of the page cache,
|
||||||
|
* there might be no data left at start_byte.
|
||||||
|
*/
|
||||||
|
if (data_end == start_byte)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
WARN_ON_ONCE(data_end < start_byte);
|
||||||
WARN_ON_ONCE(data_end > scan_end_byte);
|
WARN_ON_ONCE(data_end > scan_end_byte);
|
||||||
|
|
||||||
error = iomap_write_delalloc_scan(inode, &punch_start_byte,
|
error = iomap_write_delalloc_scan(inode, &punch_start_byte,
|
||||||
|
Loading…
Reference in New Issue
Block a user