]> git.ipfire.org Git - thirdparty/xfsprogs-dev.git/commitdiff
xfs: refactor xfs_rtsummary_blockcount
authorChristoph Hellwig <hch@lst.de>
Mon, 25 Nov 2024 21:14:20 +0000 (13:14 -0800)
committerDarrick J. Wong <djwong@kernel.org>
Tue, 24 Dec 2024 02:01:29 +0000 (18:01 -0800)
Source kernel commit: f8c5a8415f6e23fa5b6301635d8b451627efae1c

Make xfs_rtsummary_blockcount take all the required information from
the mount structure and return the number of summary levels from it
as well.  This cleans up many of the callers and prepares for making the
rtsummary files per-rtgroup where they need to look at different value.

This means we recalculate some values in some callers, but as all these
calculations are outside the fast path and cheap, which seems like a
price worth paying.

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

index 5ec01537faac6b4744632aa615acc968a57361cc..a037012b77e5f6211bf92448dd4003ebf135b527 100644 (file)
@@ -323,9 +323,7 @@ rtmount_init(
                        progname);
                return -1;
        }
-       mp->m_rsumlevels = mp->m_sb.sb_rextslog + 1;
-       mp->m_rsumblocks = xfs_rtsummary_blockcount(mp, mp->m_rsumlevels,
-                       mp->m_sb.sb_rbmblocks);
+       mp->m_rsumblocks = xfs_rtsummary_blockcount(mp, &mp->m_rsumlevels);
 
        /*
         * Allow debugger to be run without the realtime device present.
index cebeef5134e6666bb554fa9b96f1b862f12f0e0b..edcfb09e29fa18874ac62a1f38e51a376325bbc2 100644 (file)
@@ -18,6 +18,7 @@
 #include "xfs_trans.h"
 #include "xfs_rtbitmap.h"
 #include "xfs_health.h"
+#include "xfs_sb.h"
 
 /*
  * Realtime allocator bitmap functions shared with userspace.
@@ -1164,16 +1165,20 @@ xfs_rtbitmap_blockcount(
        return xfs_rtbitmap_blockcount_len(mp, mp->m_sb.sb_rextents);
 }
 
-/* Compute the number of rtsummary blocks needed to track the given rt space. */
+/*
+ * Compute the geometry of the rtsummary file 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 int            *rsumlevels)
 {
        unsigned long long      rsumwords;
 
-       rsumwords = (unsigned long long)rsumlevels * rbmblocks;
+       *rsumlevels = xfs_compute_rextslog(mp->m_sb.sb_rextents) + 1;
+
+       rsumwords = xfs_rtbitmap_blockcount(mp) * (*rsumlevels);
        return XFS_B_TO_FSB(mp, rsumwords << XFS_WORDLOG);
 }
 
index 58672863053a94e2b1d586ad4b425e6b23a7029a..776cca9e41bf05d737ba151aac572bc3de1ff59f 100644 (file)
@@ -311,7 +311,7 @@ xfs_filblks_t xfs_rtbitmap_blockcount(struct xfs_mount *mp);
 xfs_filblks_t xfs_rtbitmap_blockcount_len(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 int *rsumlevels);
 
 int xfs_rtfile_initialize_blocks(struct xfs_rtgroup *rtg,
                enum xfs_rtg_inodes type, xfs_fileoff_t offset_fsb,
@@ -342,7 +342,6 @@ xfs_rtbitmap_blockcount_len(struct xfs_mount *mp, xfs_rtbxlen_t rtextents)
        /* shut up gcc */
        return 0;
 }
-# define xfs_rtsummary_blockcount(mp, l, b)            (0)
 #endif /* CONFIG_XFS_RT */
 
 #endif /* __XFS_RTBITMAP_H__ */