[PATCH 21/22] mkfs: validate CoW extent size hint when rtinherit is set

Darrick J. Wong
2025-02-06T23:02:15Z

Extent size hints exist to nudge the behavior of the file data block
allocator towards trying to make aligned allocations. Therefore, it
doesn't make sense to allow a hint that isn't a multiple of the
fundamental allocation unit for a given file.

This means that if the sysadmin is formatting with rtinherit set on the
root dir, validate_cowextsize_hint needs to check the hint value on a
simulated realtime file to make sure that it's correct. This hasn't
been necessary in the past since one cannot have a CoW hint without a
reflink filesystem, and we previously didn't allow rt reflink
filesystems.

Signed-off-by: "Darrick J. Wong" <djwong@kernel.org>
---
mkfs/xfs_mkfs.c | 20 ++++++++++++++++++++
1 file changed, 20 insertions(+)

diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c
index c8042261328171..9239109434d748 100644
--- a/mkfs/xfs_mkfs.c
+++ b/mkfs/xfs_mkfs.c
@@ -2985,6 +2985,26 @@ _("illegal CoW extent size hint %lld, must be less than %u.\n"),
min(XFS_MAX_BMBT_EXTLEN, mp->m_sb.sb_agblocks / 2));
usage();
}
+
+ /*
+ * If the value is to be passed on to realtime files, revalidate with
+ * a realtime file so that we know the hint and flag that get passed on
+ * to realtime files will be correct.
+ */
+ if (!(cli->fsx.fsx_xflags & FS_XFLAG_RTINHERIT))
+ return;
+
+ fa = libxfs_inode_validate_cowextsize(mp, cli->fsx.fsx_cowextsize,
+ S_IFREG, XFS_DIFLAG_REALTIME, flags2);
+
+ if (fa) {
+ fprintf(stderr,
+_("illegal CoW extent size hint %lld, must be less than %u and a multiple of %u. %p\n"),
+ (long long)cli->fsx.fsx_cowextsize,
+ min(XFS_MAX_BMBT_EXTLEN, mp->m_sb.sb_agblocks / 2),
+ mp->m_sb.sb_rextsize, fa);
+ usage();
+ }
}

/* Complain if this filesystem is not a supported configuration. */