Skip to content

reflink and atomic write bugs

Chris Mason linux-ext4 linux-fsdevel linux-xfs sashiko-reviews 6 versions – In review

Get series with b4
b4 am [email protected]

Versions newest first · linked by author and title

  1. v9 Latest14 patches 5 repliesIn review
  2. v8 posting 2/215 patches 6 repliesSuperseded
  3. v8 posting 1/20 of 15 patches 0 repliesSuperseded
Earlier versions · 3
VersionPostedPatchesRepliesStatus
v7 posting 2/20 of 11 patches0 repliesSuperseded
v7 posting 1/211 patches3 repliesSuperseded
v610 patches11 repliesSuperseded

Patches in v9 No applies recorded yet

#Subject and filesSizeRepliesApplied
1/14xfs: don't skip the flush before shifting extentsfs/xfs/xfs_bmap_util.c+1 -10 replies
2/14xfs: flush the shifted range before changing the filefs/xfs/xfs_file.c+23 -20 replies
3/14xfs: don't change the block map under a dirty foliofs/xfs/xfs_bmap_util.c fs/xfs/xfs_reflink.c+16 -30 replies
4/14iomap: don't punch delalloc under a dirty EOF blockfs/iomap/buffered-io.c+30 -40 replies
5/14fs: validate atomic writes after O_APPEND and limitsfs/ext4/file.c fs/read_write.c fs/xfs/xfs_file.c+24 -100 replies
6/14xfs: recheck direct write alignment after write checksfs/xfs/xfs_file.c+38 -61 reply
7/14xfs: test for reflink after the dio write checksfs/xfs/xfs_file.c+7 -50 replies
8/14xfs: refuse writes to files racing with realtime inode flag changesfs/xfs/xfs_file.c+13 -00 replies
9/14xfs: test for always COW after the dio write checksfs/xfs/xfs_file.c+9 -80 replies
10/14xfs: refuse fallocate racing with realtime flag changesfs/xfs/xfs_file.c+32 -90 replies
11/14xfs: take the MMAPLOCK in xfs_fileattr_set()fs/xfs/xfs_inode.c fs/xfs/xfs_ioctl.c+17 -31 reply
12/14xfs: restart faults racing with realtime flag changesfs/xfs/xfs_file.c+13 -21 reply
13/14xfs: don't enable DAX on zoned inodesfs/xfs/xfs_ioctl.c fs/xfs/xfs_iops.c+9 -31 reply
14/14xfs: test for realtime and reflink under the pNFS locksfs/xfs/xfs_pnfs.c+17 -151 reply

Reviews trailers per patch

13 of 14 patches have a Reviewed-by or Acked-by.

PatchChristoph HellwigCarlos Maiolino
1/14R-b
2/14R-b
3/14R-b
4/14R-b
5/14
6/14R-b
7/14R-b
8/14R-b
9/14R-b
10/14R-b
11/14R-b
12/14R-b
13/14R-b
14/14R-b

Trailers given in replies are filled; those carried in the patches from earlier versions are outlined with dashes.

Read the v9 thread

Cover letter [PATCH v9 00/14] reflink and atomic write bugs

The meat of the series is fixing reflink corner cases that incorrectly let you write into the source of a reflink. LLMs also tripped over a few ways to use atomic writes to expose stale blocks on the drive, and a few races with realtime flag and extent size hint manipulations.

Carlos has accepted patches 1-4, but I've kept them here so the whole series can still be tested.

Except for Christoph's patch, these were all found and fixed by an LLM.

v8->v9:

Christoph suggested taking the MMAPLOCK in xfs_fileattr_set() instead of chasing flag and hint changes down in the iomap code. Page faults only hold the MMAPLOCK, so FS_IOC_FSSETXATTR now waits for them. That's the new "xfs: take the MMAPLOCK in xfs_fileattr_set()".

It replaces the two "resample" patches. It also replaces "xfs: test for an extsize hint again under the ILOCK". With the new lock the hint can't change between its two tests.

"xfs: restart faults racing with realtime flag changes" is down to one test in __xfs_write_fault(), because zoned space is still reserved before the lock. xfs_iomap.c is back to what's in 7.4-rc2, so the -EAGAIN and the -EINVAL are both gone.

One more existing pnfs bug fell out, LAYOUTGET can race with a clone and hand shared blocks to the client for writing. The new "xfs: test for realtime and reflink under the pNFS locks" deals with that. That one is from reading the code, and I haven't set up a pNFS server to test it.

Christoph also pointed out that DAX doesn't require writing in place, the zoned code just doesn't support it. "xfs: don't enable DAX on zoned inodes" has the same code with a new commit log and comments.

v7->v8:

Christoph pointed out that only page faults can cope with the -EAGAIN from "xfs: restart faults racing with realtime flag changes". pNFS is the one other caller that can really get there, so now faults get -EAGAIN and everyone else gets -EINVAL.

Sashiko had two complaints about the same patch. The stale reservation is fixed by the two "resample" patches. Those are the rest of the 3 additional patches I promised in v7, I just managed to leave them out of the posting.

The second complaint turned out to be on disk corruption for realtime filesystems with extents bigger than one block, with nothing returning an error. That's the new "xfs: test for an extsize hint again under the ILOCK".

While checking what a DAX fault does with the -EAGAIN, we found that DAX and zoned inodes don't work together at all. With a zoned filesystem on pmem and dax=always, the first store into a mapped file oopses on 7.4-rc2, and so does ftruncate(). "xfs: don't enable DAX on zoned inodes" turns DAX off for zoned inodes.

Added Christoph's review to "xfs: test for always COW after the dio write checks".

v6->v7:

Sashiko noticed a few pre-existing corners that I had ignored, so we have 3 additional patches dealing with races between FS_IOC_FSSETXATTR and decisions about file writes.

"xfs: restart faults racing with realtime flag changes" changed enough that I dropped Christoph's review.

Chris Mason (13):
xfs: don't skip the flush before shifting extents
xfs: flush the shifted range before changing the file
xfs: don't change the block map under a dirty folio
iomap: don't punch delalloc under a dirty EOF block
fs: validate atomic writes after O_APPEND and limits
xfs: recheck direct write alignment after write checks
xfs: test for reflink after the dio write checks
xfs: test for always COW after the dio write checks
xfs: refuse fallocate racing with realtime flag changes
xfs: take the MMAPLOCK in xfs_fileattr_set()
xfs: restart faults racing with realtime flag changes
xfs: don't enable DAX on zoned inodes
xfs: test for realtime and reflink under the pNFS locks

Christoph Hellwig (1):
xfs: refuse writes to files racing with realtime inode flag changes

 fs/ext4/file.c         |   4 -
 fs/iomap/buffered-io.c |  34 +++++++-
 fs/read_write.c        |  13 +++
 fs/xfs/xfs_bmap_util.c |  19 ++++-
 fs/xfs/xfs_file.c      | 182 ++++++++++++++++++++++++++++++++---------
 fs/xfs/xfs_inode.c     |   3 +-
 fs/xfs/xfs_ioctl.c     |  25 ++++--
 fs/xfs/xfs_iops.c      |   4 +
 fs/xfs/xfs_pnfs.c      |  32 ++++----
 fs/xfs/xfs_reflink.c   |   2 +-
 10 files changed, 248 insertions(+), 70 deletions(-)