From e36c42f49c29396d535333f9b2018db38d6ccc67 Mon Sep 17 00:00:00 2001 From: "Darrick J. Wong" Date: Tue, 9 Jan 2024 09:40:33 -0800 Subject: [PATCH] mkfs: validate CoW extent size hint when rtinherit is set 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 --- mkfs/xfs_mkfs.c | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c index 8676579ec..afa08f149 100644 --- a/mkfs/xfs_mkfs.c +++ b/mkfs/xfs_mkfs.c @@ -2775,6 +2775,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. */ -- 2.50.1