fix stale delalloc punching for COW I/O v3

Christoph Hellwig
2024-09-23T15:29:09Z

Hi all,

this is another fallout from the zoned XFS work, which stresses the XFS
COW I/O path very heavily. It affects normal I/O to reflinked files as
well, but is very hard to hit there.

The main problem here is that we only punch out delalloc reservations
from the data fork, but COW I/O places delalloc extents into the COW
fork, which means that it won't get punched out forshort writes.

Changes since v2:
- drop the patches already merged and rebased to latest Linus' tree
- moved taking invalidate_lock from iomap to the caller to avoid a
too complicated locking protocol
- better document the xfs_file_write_zero_eof return value
- fix a commit log typo

Changes since v1:
- move the already reviewed iomap prep changes to the beginning in case
Christian wants to take them ASAP
- take the invalidate_lock for post-EOF zeroing so that we have a
consistent locking pattern for zeroing.

Diffstat:
Documentation/filesystems/iomap/operations.rst | 2
fs/iomap/buffered-io.c | 111 ++++++-------------
fs/xfs/xfs_aops.c | 4
fs/xfs/xfs_bmap_util.c | 10 +
fs/xfs/xfs_bmap_util.h | 2
fs/xfs/xfs_file.c | 146 +++++++++++++++----------
fs/xfs/xfs_iomap.c | 65 +++++++----
include/linux/iomap.h | 20 ++-
8 files changed, 196 insertions(+), 164 deletions(-)