]> 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>
Thu, 15 Aug 2024 18:58:32 +0000 (11:58 -0700)
committerDarrick J. Wong <djwong@kernel.org>
Fri, 16 Aug 2024 21:57:45 +0000 (14:57 -0700)
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

index 64dad7070e8d6fed1a0ab6d92efd1b15f0049c7d..7b398e0440bb4049c80626d979aea65879686637 100644 (file)
@@ -2882,6 +2882,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. */