fix stale delalloc punching for COW I/O v4

Christoph Hellwig
2024-09-24T07:41:21Z

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.

[Sorry for the rapid fire repost, but as we're down to comment changes
and the series has been fully reviewed except for the trivial
refactoring patch at the beginning I'd like to get it out before being
semi-offline for a few days]

Changes since v3:
- improve two comments

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(-)