]> www.infradead.org Git - users/hch/xfsprogs.git/commitdiff
xfs: check that rtblock extents do not break rtsupers or rtgroups
authorDarrick J. Wong <djwong@kernel.org>
Mon, 5 Aug 2024 17:51:58 +0000 (10:51 -0700)
committerChristoph Hellwig <hch@lst.de>
Tue, 6 Aug 2024 12:53:49 +0000 (05:53 -0700)
Source kernel commit: 503fca119d2c8df89256e555c00ecc732fc98e4b

Check that rt block pointers do not point to the realtime superblock and
that allocated rt space extents do not cross rtgroup boundaries.

Signed-off-by: Darrick J. Wong <djwong@kernel.org>
Signed-off-by: Christoph Hellwig <hch@lst.de>
libxfs/xfs_types.c

index 74ab1965a8f49c9b4c5f71ff2263b272cb47ea02..e84292ce2d8daa24035f01f2c39a94c890995991 100644 (file)
@@ -12,6 +12,8 @@
 #include "xfs_bit.h"
 #include "xfs_mount.h"
 #include "xfs_ag.h"
+#include "xfs_rtbitmap.h"
+#include "xfs_rtgroup.h"
 
 
 /*
@@ -135,18 +137,37 @@ xfs_verify_dir_ino(
 }
 
 /*
- * Verify that an realtime block number pointer doesn't point off the
- * end of the realtime device.
+ * Verify that a realtime block number pointer neither points outside the
+ * allocatable areas of the rtgroup nor off the end of the realtime
+ * device.
  */
 inline bool
 xfs_verify_rtbno(
        struct xfs_mount        *mp,
        xfs_rtblock_t           rtbno)
 {
-       return rtbno < mp->m_sb.sb_rblocks;
+       if (rtbno >= mp->m_sb.sb_rblocks)
+               return false;
+
+       if (xfs_has_rtgroups(mp)) {
+               xfs_rgnumber_t  rgno = xfs_rtb_to_rgno(mp, rtbno);
+               xfs_rtxnum_t    rtx = xfs_rtb_to_rtx(mp, rtbno);
+
+               if (rgno >= mp->m_sb.sb_rgcount)
+                       return false;
+               if (rtx >= xfs_rtgroup_extents(mp, rgno))
+                       return false;
+               if (xfs_has_rtsb(mp) && rgno == 0 && rtx == 0)
+                       return false;
+       }
+       return true;
 }
 
-/* Verify that a realtime device extent is fully contained inside the volume. */
+/*
+ * Verify that an allocated realtime device extent neither points outside
+ * allocatable areas of the rtgroup, across an rtgroup boundary, nor off the
+ * end of the realtime device.
+ */
 bool
 xfs_verify_rtbext(
        struct xfs_mount        *mp,
@@ -159,7 +180,14 @@ xfs_verify_rtbext(
        if (!xfs_verify_rtbno(mp, rtbno))
                return false;
 
-       return xfs_verify_rtbno(mp, rtbno + len - 1);
+       if (!xfs_verify_rtbno(mp, rtbno + len - 1))
+               return false;
+
+       if (xfs_has_rtgroups(mp) &&
+           xfs_rtb_to_rgno(mp, rtbno) != xfs_rtb_to_rgno(mp, rtbno + len - 1))
+               return false;
+
+       return true;
 }
 
 /* Calculate the range of valid icount values. */