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 v8 12/15] xfs: test for an extsize hint again under the ILOCK
Date: Wed, 11 Nov 2026 20:02:41 -0500 [thread overview]
Message-ID: <20261112010229.51029-13-mason@kernel.org> (raw)
In-Reply-To: <20261112010229.51029-1-mason@kernel.org>
A store through a shared mapping can corrupt the data fork and the free
block counter on disk, if the realtime flag of the file is set during
the write fault and realtime extents are larger than one block.
Such a realtime inode has an extent size hint, and cannot use delayed
allocation. xfs_buffered_write_iomap_begin() tests for a hint before it
takes the ILOCK. FS_IOC_FSSETXATTR can change the flag of a file with no
blocks until then, since a fault never takes the IOLOCK:
write fault FS_IOC_FSSETXATTR
=========== =================
xfs_buffered_write_iomap_begin()
xfs_get_extsz_hint() is 0
sets the realtime flag
xfs_ilock_for_iomap()
xfs_bmapi_reserve_delalloc()
/* 1 block, 0 realtime extents */
The fix used here is to test for a hint again once the ILOCK is held,
and to allocate the blocks right away if the inode has got one.
Signed-off-by: Chris Mason <mason@kernel.org>
---
Notes:
v7->v8:
- New patch.
fs/xfs/xfs_iomap.c | 10 ++++++++++
1 file changed, 10 insertions(+)
diff --git a/fs/xfs/xfs_iomap.c b/fs/xfs/xfs_iomap.c
index d36650450cbb..b414e2cff346 100644
--- a/fs/xfs/xfs_iomap.c
+++ b/fs/xfs/xfs_iomap.c
@@ -1903,6 +1903,16 @@ xfs_buffered_write_iomap_begin(
goto out_unlock;
}
+ /*
+ * A write fault doesn't hold the IOLOCK, so the inode may have got an
+ * extent size hint since the test above.
+ */
+ if (xfs_get_extsz_hint(ip)) {
+ xfs_iunlock(ip, lockmode);
+ return xfs_direct_write_iomap_begin(inode, offset, count,
+ flags, iomap, srcmap);
+ }
+
if (XFS_IS_CORRUPT(mp, !xfs_ifork_has_extents(&ip->i_df)) ||
XFS_TEST_ERROR(mp, XFS_ERRTAG_BMAPIFORMAT)) {
xfs_bmap_mark_sick(ip, XFS_DATA_FORK);
--
2.55.0
next prev parent reply other threads:[~2026-11-12 1:02 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-11-12 1:02 [PATCH v8 00/15] reflink and atomic write bugs Chris Mason
2026-11-12 1:02 ` [PATCH v8 01/15] xfs: don't skip the flush before shifting extents Chris Mason
2026-11-12 1:02 ` [PATCH v8 02/15] xfs: flush the shifted range before changing the file Chris Mason
2026-11-12 1:02 ` [PATCH v8 03/15] xfs: don't change the block map under a dirty folio Chris Mason
2026-11-12 1:02 ` [PATCH v8 04/15] iomap: don't punch delalloc under a dirty EOF block Chris Mason
2026-11-12 1:02 ` [PATCH v8 05/15] fs: validate atomic writes after O_APPEND and limits Chris Mason
2026-11-12 1:02 ` [PATCH v8 06/15] xfs: recheck direct write alignment after write checks Chris Mason
2026-11-12 1:02 ` [PATCH v8 07/15] xfs: test for reflink after the dio " Chris Mason
2026-11-12 1:02 ` [PATCH v8 08/15] xfs: refuse writes to files racing with realtime inode flag changes Chris Mason
2026-11-12 1:02 ` [PATCH v8 09/15] xfs: test for always COW after the dio write checks Chris Mason
2026-11-12 1:02 ` [PATCH v8 10/15] xfs: refuse fallocate racing with realtime flag changes Chris Mason
2026-11-12 1:02 ` [PATCH v8 11/15] xfs: restart faults " Chris Mason
2026-11-12 1:02 ` Chris Mason [this message]
2026-11-12 1:02 ` [PATCH v8 13/15] xfs: resample the extsize hint after taking the ILOCK Chris Mason
2026-11-12 1:02 ` [PATCH v8 14/15] xfs: resample the COW extsize hint after cycling ILOCK Chris Mason
2026-11-12 1:02 ` [PATCH v8 15/15] xfs: don't enable DAX on zoned inodes 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=20261112010229.51029-13-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