]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
xfs: create helpers for rtsummary block/wordcount computations
authorDarrick J. Wong <djwong@kernel.org>
Mon, 16 Oct 2023 16:50:34 +0000 (09:50 -0700)
committerDarrick J. Wong <djwong@kernel.org>
Wed, 18 Oct 2023 23:53:00 +0000 (16:53 -0700)
Create helper functions that compute the number of blocks or words
necessary to store the rt summary file.

Signed-off-by: Darrick J. Wong <djwong@kernel.org>
Reviewed-by: Christoph Hellwig <hch@lst.de>
fs/xfs/libxfs/xfs_rtbitmap.c
fs/xfs/libxfs/xfs_rtbitmap.h
fs/xfs/xfs_rtalloc.c

index b81e4ffa1f44d5f61f2dfc5250ff3075f56923fa..fb05ea0177ec3111b0d3c0bb623c418851a33af1 100644 (file)
@@ -1146,3 +1146,32 @@ xfs_rtbitmap_wordcount(
        blocks = xfs_rtbitmap_blockcount(mp, rtextents);
        return XFS_FSB_TO_B(mp, blocks) >> XFS_WORDLOG;
 }
+
+/* Compute the number of rtsummary blocks needed to track the given rt space. */
+xfs_filblks_t
+xfs_rtsummary_blockcount(
+       struct xfs_mount        *mp,
+       unsigned int            rsumlevels,
+       xfs_extlen_t            rbmblocks)
+{
+       unsigned long long      rsumwords;
+
+       rsumwords = (unsigned long long)rsumlevels * rbmblocks;
+       return XFS_B_TO_FSB(mp, rsumwords << XFS_WORDLOG);
+}
+
+/*
+ * Compute the number of rtsummary info words needed to populate every block of
+ * a summary file that is large enough to track the given rt space.
+ */
+unsigned long long
+xfs_rtsummary_wordcount(
+       struct xfs_mount        *mp,
+       unsigned int            rsumlevels,
+       xfs_extlen_t            rbmblocks)
+{
+       xfs_filblks_t           blocks;
+
+       blocks = xfs_rtsummary_blockcount(mp, rsumlevels, rbmblocks);
+       return XFS_FSB_TO_B(mp, blocks) >> XFS_WORDLOG;
+}
index ede24de74620dc04ff0716b91014444bfd45ed94..a3e8288bedea12d2eaa29a38f90fd1ea4b49070d 100644 (file)
@@ -308,6 +308,11 @@ xfs_filblks_t xfs_rtbitmap_blockcount(struct xfs_mount *mp, xfs_rtbxlen_t
                rtextents);
 unsigned long long xfs_rtbitmap_wordcount(struct xfs_mount *mp,
                xfs_rtbxlen_t rtextents);
+
+xfs_filblks_t xfs_rtsummary_blockcount(struct xfs_mount *mp,
+               unsigned int rsumlevels, xfs_extlen_t rbmblocks);
+unsigned long long xfs_rtsummary_wordcount(struct xfs_mount *mp,
+               unsigned int rsumlevels, xfs_extlen_t rbmblocks);
 #else /* CONFIG_XFS_RT */
 # define xfs_rtfree_extent(t,b,l)                      (-ENOSYS)
 # define xfs_rtfree_blocks(t,rb,rl)                    (-ENOSYS)
@@ -322,6 +327,8 @@ xfs_rtbitmap_blockcount(struct xfs_mount *mp, xfs_rtbxlen_t rtextents)
        return 0;
 }
 # define xfs_rtbitmap_wordcount(mp, r)                 (0)
+# define xfs_rtsummary_blockcount(mp, l, b)            (0)
+# define xfs_rtsummary_wordcount(mp, l, b)             (0)
 #endif /* CONFIG_XFS_RT */
 
 #endif /* __XFS_RTBITMAP_H__ */
index 8e041df126401a2c511ac34bd9c22f632316ace8..3be6bda2fd920cf24ff9032432e308401202aae0 100644 (file)
@@ -1001,8 +1001,7 @@ xfs_growfs_rt(
        nrbmblocks = xfs_rtbitmap_blockcount(mp, nrextents);
        nrextslog = xfs_highbit32(nrextents);
        nrsumlevels = nrextslog + 1;
-       nrsumsize = (uint)sizeof(xfs_suminfo_t) * nrsumlevels * nrbmblocks;
-       nrsumblocks = XFS_B_TO_FSB(mp, nrsumsize);
+       nrsumblocks = xfs_rtsummary_blockcount(mp, nrsumlevels, nrbmblocks);
        nrsumsize = XFS_FSB_TO_B(mp, nrsumblocks);
        /*
         * New summary size can't be more than half the size of
@@ -1063,10 +1062,8 @@ xfs_growfs_rt(
                ASSERT(nsbp->sb_rextents != 0);
                nsbp->sb_rextslog = xfs_highbit32(nsbp->sb_rextents);
                nrsumlevels = nmp->m_rsumlevels = nsbp->sb_rextslog + 1;
-               nrsumsize =
-                       (uint)sizeof(xfs_suminfo_t) * nrsumlevels *
-                       nsbp->sb_rbmblocks;
-               nrsumblocks = XFS_B_TO_FSB(mp, nrsumsize);
+               nrsumblocks = xfs_rtsummary_blockcount(mp, nrsumlevels,
+                               nsbp->sb_rbmblocks);
                nmp->m_rsumsize = nrsumsize = XFS_FSB_TO_B(mp, nrsumblocks);
                /*
                 * Start a transaction, get the log reservation.
@@ -1272,6 +1269,7 @@ xfs_rtmount_init(
        struct xfs_buf          *bp;    /* buffer for last block of subvolume */
        struct xfs_sb           *sbp;   /* filesystem superblock copy in mount */
        xfs_daddr_t             d;      /* address of last block of subvolume */
+       unsigned int            rsumblocks;
        int                     error;
 
        sbp = &mp->m_sb;
@@ -1283,10 +1281,9 @@ xfs_rtmount_init(
                return -ENODEV;
        }
        mp->m_rsumlevels = sbp->sb_rextslog + 1;
-       mp->m_rsumsize =
-               (uint)sizeof(xfs_suminfo_t) * mp->m_rsumlevels *
-               sbp->sb_rbmblocks;
-       mp->m_rsumsize = roundup(mp->m_rsumsize, sbp->sb_blocksize);
+       rsumblocks = xfs_rtsummary_blockcount(mp, mp->m_rsumlevels,
+                       mp->m_sb.sb_rbmblocks);
+       mp->m_rsumsize = XFS_FSB_TO_B(mp, rsumblocks);
        mp->m_rbmip = mp->m_rsumip = NULL;
        /*
         * Check that the realtime section is an ok size.