xref: /openbmc/linux/fs/xfs/scrub/bitmap.h (revision 014ad537)
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