]> Git Repo - linux.git/commitdiff
xfs: create helpers for rtbitmap block/wordcount computations
authorDarrick J. Wong <[email protected]>
Mon, 16 Oct 2023 16:48:20 +0000 (09:48 -0700)
committerDarrick J. Wong <[email protected]>
Wed, 18 Oct 2023 17:58:58 +0000 (10:58 -0700)
Create helper functions that compute the number of blocks or words
necessary to store the rt bitmap.

Signed-off-by: Darrick J. Wong <[email protected]>
Reviewed-by: Christoph Hellwig <[email protected]>
fs/xfs/libxfs/xfs_rtbitmap.c
fs/xfs/libxfs/xfs_rtbitmap.h
fs/xfs/libxfs/xfs_trans_resv.c
fs/xfs/scrub/rtsummary.c
fs/xfs/xfs_rtalloc.c

index efa084de58c24b83f3c12c6f08357f70e0b2589a..aefa2b0747a547c6d60fcac17e82bdb6749e8858 100644 (file)
@@ -1135,3 +1135,30 @@ xfs_rtalloc_extent_is_free(
        *is_free = matches;
        return 0;
 }
+
+/*
+ * Compute the number of rtbitmap blocks needed to track the given number of rt
+ * extents.
+ */
+xfs_filblks_t
+xfs_rtbitmap_blockcount(
+       struct xfs_mount        *mp,
+       xfs_rtbxlen_t           rtextents)
+{
+       return howmany_64(rtextents, NBBY * mp->m_sb.sb_blocksize);
+}
+
+/*
+ * Compute the number of rtbitmap words needed to populate every block of a
+ * bitmap that is large enough to track the given number of rt extents.
+ */
+unsigned long long
+xfs_rtbitmap_wordcount(
+       struct xfs_mount        *mp,
+       xfs_rtbxlen_t           rtextents)
+{
+       xfs_filblks_t           blocks;
+
+       blocks = xfs_rtbitmap_blockcount(mp, rtextents);
+       return XFS_FSB_TO_B(mp, blocks) >> XFS_WORDLOG;
+}
index 79ade6d2361badfd56fc77379cd48ad0a56c35b9..01eabb9b5516395c2adee6d9378fa32d6539bf91 100644 (file)
@@ -280,6 +280,11 @@ xfs_rtfree_extent(
 /* Same as above, but in units of rt blocks. */
 int xfs_rtfree_blocks(struct xfs_trans *tp, xfs_fsblock_t rtbno,
                xfs_filblks_t rtlen);
+
+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);
 #else /* CONFIG_XFS_RT */
 # define xfs_rtfree_extent(t,b,l)                      (-ENOSYS)
 # define xfs_rtfree_blocks(t,rb,rl)                    (-ENOSYS)
@@ -287,6 +292,13 @@ int xfs_rtfree_blocks(struct xfs_trans *tp, xfs_fsblock_t rtbno,
 # define xfs_rtalloc_query_all(m,t,f,p)                        (-ENOSYS)
 # define xfs_rtbuf_get(m,t,b,i,p)                      (-ENOSYS)
 # define xfs_rtalloc_extent_is_free(m,t,s,l,i)         (-ENOSYS)
+static inline xfs_filblks_t
+xfs_rtbitmap_blockcount(struct xfs_mount *mp, xfs_rtbxlen_t rtextents)
+{
+       /* shut up gcc */
+       return 0;
+}
+# define xfs_rtbitmap_wordcount(mp, r)                 (0)
 #endif /* CONFIG_XFS_RT */
 
 #endif /* __XFS_RTBITMAP_H__ */
index 4629f10d2f67ea4f80ba0dfc8f6e748ca1e2f71e..6cd45e8c118daf63b60542b2c1934faff4de3813 100644 (file)
@@ -218,11 +218,12 @@ xfs_rtalloc_block_count(
        struct xfs_mount        *mp,
        unsigned int            num_ops)
 {
-       unsigned int            blksz = XFS_FSB_TO_B(mp, 1);
-       unsigned int            rtbmp_bytes;
+       unsigned int            rtbmp_blocks;
+       xfs_rtxlen_t            rtxlen;
 
-       rtbmp_bytes = xfs_extlen_to_rtxlen(mp, XFS_MAX_BMBT_EXTLEN) / NBBY;
-       return (howmany(rtbmp_bytes, blksz) + 1) * num_ops;
+       rtxlen = xfs_extlen_to_rtxlen(mp, XFS_MAX_BMBT_EXTLEN);
+       rtbmp_blocks = xfs_rtbitmap_blockcount(mp, rtxlen);
+       return (rtbmp_blocks + 1) * num_ops;
 }
 
 /*
index 3c8a6cc338005a8c9a4184871171e14e90a441c1..0971d002d906ab705d3209a16fd26407a7d2d68b 100644 (file)
@@ -160,12 +160,11 @@ xchk_rtsum_compute(
        struct xfs_scrub        *sc)
 {
        struct xfs_mount        *mp = sc->mp;
-       unsigned long long      rtbmp_bytes;
+       unsigned long long      rtbmp_blocks;
 
        /* If the bitmap size doesn't match the computed size, bail. */
-       rtbmp_bytes = howmany_64(mp->m_sb.sb_rextents, NBBY);
-       if (roundup_64(rtbmp_bytes, mp->m_sb.sb_blocksize) !=
-                       mp->m_rbmip->i_disk_size)
+       rtbmp_blocks = xfs_rtbitmap_blockcount(mp, mp->m_sb.sb_rextents);
+       if (XFS_FSB_TO_B(mp, rtbmp_blocks) != mp->m_rbmip->i_disk_size)
                return -EFSCORRUPTED;
 
        return xfs_rtalloc_query_all(sc->mp, sc->tp, xchk_rtsum_record_free,
index fdfb22baa6da692109f10d89ebd03bc374bfc700..8e041df126401a2c511ac34bd9c22f632316ace8 100644 (file)
@@ -998,7 +998,7 @@ xfs_growfs_rt(
         */
        nrextents = nrblocks;
        do_div(nrextents, in->extsize);
-       nrbmblocks = howmany_64(nrextents, NBBY * sbp->sb_blocksize);
+       nrbmblocks = xfs_rtbitmap_blockcount(mp, nrextents);
        nrextslog = xfs_highbit32(nrextents);
        nrsumlevels = nrextslog + 1;
        nrsumsize = (uint)sizeof(xfs_suminfo_t) * nrsumlevels * nrbmblocks;
This page took 0.062647 seconds and 4 git commands to generate.