1739a2fe0SDarrick J. Wong // SPDX-License-Identifier: GPL-2.0-or-later
2bc270b53SDarrick J. Wong /*
3ecc73f8aSDarrick J. Wong * Copyright (C) 2018-2023 Oracle. All Rights Reserved.
4739a2fe0SDarrick J. Wong * Author: Darrick J. Wong <djwong@kernel.org>
5bc270b53SDarrick J. Wong */
6bc270b53SDarrick J. Wong #ifndef __XFS_SCRUB_BITMAP_H__
7bc270b53SDarrick J. Wong #define __XFS_SCRUB_BITMAP_H__
8bc270b53SDarrick J. Wong
900b10d48SDarrick J. Wong struct xbitmap {
106772fcc8SDarrick J. Wong struct rb_root_cached xb_root;
11bc270b53SDarrick J. Wong };
12bc270b53SDarrick J. Wong
1300b10d48SDarrick J. Wong void xbitmap_init(struct xbitmap *bitmap);
1400b10d48SDarrick J. Wong void xbitmap_destroy(struct xbitmap *bitmap);
15bc270b53SDarrick J. Wong
166772fcc8SDarrick J. Wong int xbitmap_clear(struct xbitmap *bitmap, uint64_t start, uint64_t len);
1700b10d48SDarrick J. Wong int xbitmap_set(struct xbitmap *bitmap, uint64_t start, uint64_t len);
1800b10d48SDarrick J. Wong int xbitmap_disunion(struct xbitmap *bitmap, struct xbitmap *sub);
19608eb3ceSDarrick J. Wong uint64_t xbitmap_hweight(struct xbitmap *bitmap);
20bc270b53SDarrick J. Wong
21178b48d5SDarrick J. Wong /*
22178b48d5SDarrick J. Wong * Return codes for the bitmap iterator functions are 0 to continue iterating,
23178b48d5SDarrick J. Wong * and non-zero to stop iterating. Any non-zero value will be passed up to the
24178b48d5SDarrick J. Wong * iteration caller. The special value -ECANCELED can be used to stop
25178b48d5SDarrick J. Wong * iteration, because neither bitmap iterator ever generates that error code on
26178b48d5SDarrick J. Wong * its own. Callers must not modify the bitmap while walking it.
27178b48d5SDarrick J. Wong */
28178b48d5SDarrick J. Wong typedef int (*xbitmap_walk_fn)(uint64_t start, uint64_t len, void *priv);
29178b48d5SDarrick J. Wong int xbitmap_walk(struct xbitmap *bitmap, xbitmap_walk_fn fn,
30178b48d5SDarrick J. Wong void *priv);
31178b48d5SDarrick J. Wong
326772fcc8SDarrick J. Wong bool xbitmap_empty(struct xbitmap *bitmap);
33fed050f3SDarrick J. Wong bool xbitmap_test(struct xbitmap *bitmap, uint64_t start, uint64_t *len);
346772fcc8SDarrick J. Wong
35a47bd1e0SDarrick J. Wong /* Bitmaps, but for type-checked for xfs_agblock_t */
36a47bd1e0SDarrick J. Wong
37a47bd1e0SDarrick J. Wong struct xagb_bitmap {
38a47bd1e0SDarrick J. Wong struct xbitmap agbitmap;
39a47bd1e0SDarrick J. Wong };
40a47bd1e0SDarrick J. Wong
xagb_bitmap_init(struct xagb_bitmap * bitmap)41a47bd1e0SDarrick J. Wong static inline void xagb_bitmap_init(struct xagb_bitmap *bitmap)
42a47bd1e0SDarrick J. Wong {
43a47bd1e0SDarrick J. Wong xbitmap_init(&bitmap->agbitmap);
44a47bd1e0SDarrick J. Wong }
45a47bd1e0SDarrick J. Wong
xagb_bitmap_destroy(struct xagb_bitmap * bitmap)46a47bd1e0SDarrick J. Wong static inline void xagb_bitmap_destroy(struct xagb_bitmap *bitmap)
47a47bd1e0SDarrick J. Wong {
48a47bd1e0SDarrick J. Wong xbitmap_destroy(&bitmap->agbitmap);
49a47bd1e0SDarrick J. Wong }
50a47bd1e0SDarrick J. Wong
xagb_bitmap_clear(struct xagb_bitmap * bitmap,xfs_agblock_t start,xfs_extlen_t len)51a47bd1e0SDarrick J. Wong static inline int xagb_bitmap_clear(struct xagb_bitmap *bitmap,
52a47bd1e0SDarrick J. Wong xfs_agblock_t start, xfs_extlen_t len)
53a47bd1e0SDarrick J. Wong {
54a47bd1e0SDarrick J. Wong return xbitmap_clear(&bitmap->agbitmap, start, len);
55a47bd1e0SDarrick J. Wong }
xagb_bitmap_set(struct xagb_bitmap * bitmap,xfs_agblock_t start,xfs_extlen_t len)56a47bd1e0SDarrick J. Wong static inline int xagb_bitmap_set(struct xagb_bitmap *bitmap,
57a47bd1e0SDarrick J. Wong xfs_agblock_t start, xfs_extlen_t len)
58a47bd1e0SDarrick J. Wong {
59a47bd1e0SDarrick J. Wong return xbitmap_set(&bitmap->agbitmap, start, len);
60a47bd1e0SDarrick J. Wong }
61a47bd1e0SDarrick J. Wong
62fed050f3SDarrick J. Wong static inline bool
xagb_bitmap_test(struct xagb_bitmap * bitmap,xfs_agblock_t start,xfs_extlen_t * len)63fed050f3SDarrick J. Wong xagb_bitmap_test(
64fed050f3SDarrick J. Wong struct xagb_bitmap *bitmap,
65fed050f3SDarrick J. Wong xfs_agblock_t start,
66fed050f3SDarrick J. Wong xfs_extlen_t *len)
67fed050f3SDarrick J. Wong {
68fed050f3SDarrick J. Wong uint64_t biglen = *len;
69fed050f3SDarrick J. Wong bool ret;
70fed050f3SDarrick J. Wong
71fed050f3SDarrick J. Wong ret = xbitmap_test(&bitmap->agbitmap, start, &biglen);
72fed050f3SDarrick J. Wong
73fed050f3SDarrick J. Wong if (start + biglen >= UINT_MAX) {
74fed050f3SDarrick J. Wong ASSERT(0);
75fed050f3SDarrick J. Wong biglen = UINT_MAX - start;
76fed050f3SDarrick J. Wong }
77fed050f3SDarrick J. Wong
78fed050f3SDarrick J. Wong *len = biglen;
79fed050f3SDarrick J. Wong return ret;
80fed050f3SDarrick J. Wong }
81fed050f3SDarrick J. Wong
xagb_bitmap_disunion(struct xagb_bitmap * bitmap,struct xagb_bitmap * sub)82a47bd1e0SDarrick J. Wong static inline int xagb_bitmap_disunion(struct xagb_bitmap *bitmap,
83a47bd1e0SDarrick J. Wong struct xagb_bitmap *sub)
84a47bd1e0SDarrick J. Wong {
85a47bd1e0SDarrick J. Wong return xbitmap_disunion(&bitmap->agbitmap, &sub->agbitmap);
86a47bd1e0SDarrick J. Wong }
87a47bd1e0SDarrick J. Wong
xagb_bitmap_hweight(struct xagb_bitmap * bitmap)88a47bd1e0SDarrick J. Wong static inline uint32_t xagb_bitmap_hweight(struct xagb_bitmap *bitmap)
89a47bd1e0SDarrick J. Wong {
90a47bd1e0SDarrick J. Wong return xbitmap_hweight(&bitmap->agbitmap);
91a47bd1e0SDarrick J. Wong }
xagb_bitmap_empty(struct xagb_bitmap * bitmap)92a47bd1e0SDarrick J. Wong static inline bool xagb_bitmap_empty(struct xagb_bitmap *bitmap)
93a47bd1e0SDarrick J. Wong {
94a47bd1e0SDarrick J. Wong return xbitmap_empty(&bitmap->agbitmap);
95a47bd1e0SDarrick J. Wong }
96a47bd1e0SDarrick J. Wong
xagb_bitmap_walk(struct xagb_bitmap * bitmap,xbitmap_walk_fn fn,void * priv)97a47bd1e0SDarrick J. Wong static inline int xagb_bitmap_walk(struct xagb_bitmap *bitmap,
98a47bd1e0SDarrick J. Wong xbitmap_walk_fn fn, void *priv)
99a47bd1e0SDarrick J. Wong {
100a47bd1e0SDarrick J. Wong return xbitmap_walk(&bitmap->agbitmap, fn, priv);
101a47bd1e0SDarrick J. Wong }
102a47bd1e0SDarrick J. Wong
1033a3108eaSDarrick J. Wong int xagb_bitmap_set_btblocks(struct xagb_bitmap *bitmap,
1043a3108eaSDarrick J. Wong struct xfs_btree_cur *cur);
105*014ad537SDarrick J. Wong int xagb_bitmap_set_btcur_path(struct xagb_bitmap *bitmap,
106*014ad537SDarrick J. Wong struct xfs_btree_cur *cur);
1073a3108eaSDarrick J. Wong
108bc270b53SDarrick J. Wong #endif /* __XFS_SCRUB_BITMAP_H__ */
109