]> www.infradead.org Git - users/hch/xfsprogs.git/commitdiff
mkfs: validate CoW extent size hint when rtinherit is set
authorDarrick J. Wong <djwong@kernel.org>
Mon, 24 Feb 2025 18:22:07 +0000 (10:22 -0800)
committerDarrick J. Wong <djwong@kernel.org>
Tue, 25 Feb 2025 17:16:02 +0000 (09:16 -0800)
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>
Reviewed-by: Christoph Hellwig <hch@lst.de>
mkfs/xfs_mkfs.c

index da83fb36a2438d91361fa64ab8db226fc87f0f7f..9dc71fb8c4c82af4fe844a75ecbadd09e3d4144e 100644 (file)
@@ -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. */