xfs: detect misaligned rtinherit directory extent size hints
authorDarrick J. Wong <djwong@kernel.org>
Wed, 14 Jul 2021 16:03:41 +0000 (09:03 -0700)
committerDarrick J. Wong <djwong@kernel.org>
Thu, 15 Jul 2021 16:58:42 +0000 (09:58 -0700)
If we encounter a directory that has been configured to pass on an
extent size hint to a new realtime file and the hint isn't an integer
multiple of the rt extent size, we should flag the hint for
administrative review because that is a misconfiguration (that other
parts of the kernel will fix automatically).

Signed-off-by: Darrick J. Wong <djwong@kernel.org>
Reviewed-by: Dave Chinner <dchinner@redhat.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
fs/xfs/scrub/inode.c

index 61f90b2..76fbc7c 100644 (file)
@@ -73,11 +73,25 @@ xchk_inode_extsize(
        uint16_t                flags)
 {
        xfs_failaddr_t          fa;
+       uint32_t                value = be32_to_cpu(dip->di_extsize);
 
-       fa = xfs_inode_validate_extsize(sc->mp, be32_to_cpu(dip->di_extsize),
-                       mode, flags);
+       fa = xfs_inode_validate_extsize(sc->mp, value, mode, flags);
        if (fa)
                xchk_ino_set_corrupt(sc, ino);
+
+       /*
+        * XFS allows a sysadmin to change the rt extent size when adding a rt
+        * section to a filesystem after formatting.  If there are any
+        * directories with extszinherit and rtinherit set, the hint could
+        * become misaligned with the new rextsize.  The verifier doesn't check
+        * this, because we allow rtinherit directories even without an rt
+        * device.  Flag this as an administrative warning since we will clean
+        * this up eventually.
+        */
+       if ((flags & XFS_DIFLAG_RTINHERIT) &&
+           (flags & XFS_DIFLAG_EXTSZINHERIT) &&
+           value % sc->mp->m_sb.sb_rextsize > 0)
+               xchk_ino_set_warning(sc, ino);
 }
 
 /*