From: Chris Mason <mason@kernel.org>
To: mason@kernel.org, tytso@mit.edu, cem@kernel.org,
david@fromorbit.com, jack@suse.cz, djwong@kernel.org,
josef@toxicpanda.com, hch@lst.de, linux-xfs@vger.kernel.org,
linux-fsdevel@vger.kernel.org, linux-ext4@vger.kernel.org,
tz2294@columbia.edu, brauner@kernel.org
Subject: [PATCH v9 00/14] reflink and atomic write bugs
Date: Thu, 12 Nov 2026 16:46:04 -0500 [thread overview]
Message-ID: <20261112214604.67875-1-mason@kernel.org> (raw)
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(-)
next reply other threads:[~2026-11-12 21:46 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-11-12 21:46 Chris Mason [this message]
2026-11-12 21:46 ` [PATCH v9 01/14] xfs: don't skip the flush before shifting extents Chris Mason
2026-11-12 21:46 ` [PATCH v9 02/14] xfs: flush the shifted range before changing the file Chris Mason
2026-11-12 21:46 ` [PATCH v9 03/14] xfs: don't change the block map under a dirty folio Chris Mason
2026-11-12 21:46 ` [PATCH v9 04/14] iomap: don't punch delalloc under a dirty EOF block Chris Mason
2026-11-12 21:46 ` [PATCH v9 05/14] fs: validate atomic writes after O_APPEND and limits Chris Mason
2026-11-12 21:46 ` [PATCH v9 06/14] xfs: recheck direct write alignment after write checks Chris Mason
2026-11-12 21:46 ` [PATCH v9 07/14] xfs: test for reflink after the dio " Chris Mason
2026-11-12 21:46 ` [PATCH v9 08/14] xfs: refuse writes to files racing with realtime inode flag changes Chris Mason
2026-11-12 21:46 ` [PATCH v9 09/14] xfs: test for always COW after the dio write checks Chris Mason
2026-11-12 21:46 ` [PATCH v9 10/14] xfs: refuse fallocate racing with realtime flag changes Chris Mason
2026-11-12 21:46 ` [PATCH v9 11/14] xfs: take the MMAPLOCK in xfs_fileattr_set() Chris Mason
2026-11-12 21:46 ` [PATCH v9 12/14] xfs: restart faults racing with realtime flag changes Chris Mason
2026-11-12 21:46 ` [PATCH v9 13/14] xfs: don't enable DAX on zoned inodes Chris Mason
2026-11-12 21:46 ` [PATCH v9 14/14] xfs: test for realtime and reflink under the pNFS locks Chris Mason
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20261112214604.67875-1-mason@kernel.org \
--to=mason@kernel.org \
--cc=brauner@kernel.org \
--cc=cem@kernel.org \
--cc=david@fromorbit.com \
--cc=djwong@kernel.org \
--cc=hch@lst.de \
--cc=jack@suse.cz \
--cc=josef@toxicpanda.com \
--cc=linux-ext4@vger.kernel.org \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-xfs@vger.kernel.org \
--cc=tytso@mit.edu \
--cc=tz2294@columbia.edu \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox