diff options
author | Darrick J. Wong <darrick.wong@oracle.com> | 2019-08-30 15:44:44 -0700 |
---|---|---|
committer | Darrick J. Wong <darrick.wong@oracle.com> | 2019-10-09 09:39:18 -0700 |
commit | 3c224db1310734711f08159c0e75f3316e0c991d (patch) | |
tree | c0ad671ead5b4aa2ced9525082a50544cf05bcd3 | |
parent | 3e7cc62b302a09cc69c3e0db6cab462c3df71a23 (diff) |
xfs: replace open-coded bitmap weight logic
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>
-rw-r--r-- | fs/xfs/scrub/agheader_repair.c | 12 | ||||
-rw-r--r-- | fs/xfs/scrub/bitmap.c | 15 | ||||
-rw-r--r-- | fs/xfs/scrub/bitmap.h | 1 |
3 files changed, 18 insertions, 10 deletions
diff --git a/fs/xfs/scrub/agheader_repair.c b/fs/xfs/scrub/agheader_repair.c index 9fbb6035f4e2..f35596cc26fb 100644 --- a/fs/xfs/scrub/agheader_repair.c +++ b/fs/xfs/scrub/agheader_repair.c @@ -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: diff --git a/fs/xfs/scrub/bitmap.c b/fs/xfs/scrub/bitmap.c index 5b07b46c89c9..8b704d7b5855 100644 --- a/fs/xfs/scrub/bitmap.c +++ b/fs/xfs/scrub/bitmap.c @@ -296,3 +296,18 @@ xbitmap_set_btblocks( { return xfs_btree_visit_blocks(cur, xbitmap_collect_btblock, 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; +} diff --git a/fs/xfs/scrub/bitmap.h b/fs/xfs/scrub/bitmap.h index 8db4017ac78e..900646b72de1 100644 --- a/fs/xfs/scrub/bitmap.h +++ b/fs/xfs/scrub/bitmap.h @@ -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__ */ |