1 // SPDX-License-Identifier: GPL-2.0-or-later 2 /* 3 * Copyright (C) 2018-2023 Oracle. All Rights Reserved. 4 * Author: Darrick J. Wong <djwong@kernel.org> 5 */ 6 #ifndef __XFS_SCRUB_BITMAP_H__ 7 #define __XFS_SCRUB_BITMAP_H__ 8 9 /* u64 bitmap */ 10 11 struct xbitmap64 { 12 struct rb_root_cached xb_root; 13 }; 14 15 void xbitmap64_init(struct xbitmap64 *bitmap); 16 void xbitmap64_destroy(struct xbitmap64 *bitmap); 17 18 int xbitmap64_clear(struct xbitmap64 *bitmap, uint64_t start, uint64_t len); 19 int xbitmap64_set(struct xbitmap64 *bitmap, uint64_t start, uint64_t len); 20 int xbitmap64_disunion(struct xbitmap64 *bitmap, struct xbitmap64 *sub); 21 uint64_t xbitmap64_hweight(struct xbitmap64 *bitmap); 22 23 /* 24 * Return codes for the bitmap iterator functions are 0 to continue iterating, 25 * and non-zero to stop iterating. Any non-zero value will be passed up to the 26 * iteration caller. The special value -ECANCELED can be used to stop 27 * iteration, because neither bitmap iterator ever generates that error code on 28 * its own. Callers must not modify the bitmap while walking it. 29 */ 30 typedef int (*xbitmap64_walk_fn)(uint64_t start, uint64_t len, void *priv); 31 int xbitmap64_walk(struct xbitmap64 *bitmap, xbitmap64_walk_fn fn, 32 void *priv); 33 34 bool xbitmap64_empty(struct xbitmap64 *bitmap); 35 bool xbitmap64_test(struct xbitmap64 *bitmap, uint64_t start, uint64_t *len); 36 37 /* u32 bitmap */ 38 39 struct xbitmap32 { 40 struct rb_root_cached xb_root; 41 }; 42 43 void xbitmap32_init(struct xbitmap32 *bitmap); 44 void xbitmap32_destroy(struct xbitmap32 *bitmap); 45 46 int xbitmap32_clear(struct xbitmap32 *bitmap, uint32_t start, uint32_t len); 47 int xbitmap32_set(struct xbitmap32 *bitmap, uint32_t start, uint32_t len); 48 int xbitmap32_disunion(struct xbitmap32 *bitmap, struct xbitmap32 *sub); 49 uint32_t xbitmap32_hweight(struct xbitmap32 *bitmap); 50 51 /* 52 * Return codes for the bitmap iterator functions are 0 to continue iterating, 53 * and non-zero to stop iterating. Any non-zero value will be passed up to the 54 * iteration caller. The special value -ECANCELED can be used to stop 55 * iteration, because neither bitmap iterator ever generates that error code on 56 * its own. Callers must not modify the bitmap while walking it. 57 */ 58 typedef int (*xbitmap32_walk_fn)(uint32_t start, uint32_t len, void *priv); 59 int xbitmap32_walk(struct xbitmap32 *bitmap, xbitmap32_walk_fn fn, 60 void *priv); 61 62 bool xbitmap32_empty(struct xbitmap32 *bitmap); 63 bool xbitmap32_test(struct xbitmap32 *bitmap, uint32_t start, uint32_t *len); 64 65 uint32_t xbitmap32_count_set_regions(struct xbitmap32 *bitmap); 66 67 #endif /* __XFS_SCRUB_BITMAP_H__ */ 68