xfs: replace open-coded bitmap weight logic
authorDarrick J. Wong <darrick.wong@oracle.com>
Tue, 17 Mar 2020 00:16:35 +0000 (17:16 -0700)
committerDarrick J. Wong <darrick.wong@oracle.com>
Wed, 18 Mar 2020 15:12:23 +0000 (08:12 -0700)
Add a xbitmap_hweight helper function so that we can get rid of the
open-coded loop.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Brian Foster <bfoster@redhat.com>
fs/xfs/scrub/agheader_repair.c
fs/xfs/scrub/bitmap.c
fs/xfs/scrub/bitmap.h

index 8f5a499..bca2ab1 100644 (file)
@@ -482,8 +482,6 @@ xrep_agfl_collect_blocks(
        struct xrep_agfl        ra;
        struct xfs_mount        *mp = sc->mp;
        struct xfs_btree_cur    *cur;
-       struct xbitmap_range    *br;
-       struct xbitmap_range    *n;
        int                     error;
 
        ra.sc = sc;
@@ -527,14 +525,8 @@ xrep_agfl_collect_blocks(
         * Calculate the new AGFL size.  If we found more blocks than fit in
         * the AGFL we'll free them later.
         */
-       *flcount = 0;
-       for_each_xbitmap_extent(br, n, agfl_extents) {
-               *flcount += br->len;
-               if (*flcount > xfs_agfl_size(mp))
-                       break;
-       }
-       if (*flcount > xfs_agfl_size(mp))
-               *flcount = xfs_agfl_size(mp);
+       *flcount = min_t(uint64_t, xbitmap_hweight(agfl_extents),
+                        xfs_agfl_size(mp));
        return 0;
 
 err:
index ab26201..f88694f 100644 (file)
@@ -297,3 +297,18 @@ xbitmap_set_btblocks(
        return xfs_btree_visit_blocks(cur, xbitmap_collect_btblock,
                        XFS_BTREE_VISIT_ALL, bitmap);
 }
+
+/* How many bits are set in this bitmap? */
+uint64_t
+xbitmap_hweight(
+       struct xbitmap          *bitmap)
+{
+       struct xbitmap_range    *bmr;
+       struct xbitmap_range    *n;
+       uint64_t                ret = 0;
+
+       for_each_xbitmap_extent(bmr, n, bitmap)
+               ret += bmr->len;
+
+       return ret;
+}
index 8db4017..900646b 100644 (file)
@@ -32,5 +32,6 @@ int xbitmap_set_btcur_path(struct xbitmap *bitmap,
                struct xfs_btree_cur *cur);
 int xbitmap_set_btblocks(struct xbitmap *bitmap,
                struct xfs_btree_cur *cur);
+uint64_t xbitmap_hweight(struct xbitmap *bitmap);
 
 #endif /* __XFS_SCRUB_BITMAP_H__ */