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 11struct xbitmap64 { 12 struct rb_root_cached xb_root; 13}; 14 15void xbitmap64_init(struct xbitmap64 *bitmap); 16void xbitmap64_destroy(struct xbitmap64 *bitmap); 17 18int xbitmap64_clear(struct xbitmap64 *bitmap, uint64_t start, uint64_t len); 19int xbitmap64_set(struct xbitmap64 *bitmap, uint64_t start, uint64_t len); 20int xbitmap64_disunion(struct xbitmap64 *bitmap, struct xbitmap64 *sub); 21uint64_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 */ 30typedef int (*xbitmap64_walk_fn)(uint64_t start, uint64_t len, void *priv); 31int xbitmap64_walk(struct xbitmap64 *bitmap, xbitmap64_walk_fn fn, 32 void *priv); 33 34bool xbitmap64_empty(struct xbitmap64 *bitmap); 35bool xbitmap64_test(struct xbitmap64 *bitmap, uint64_t start, uint64_t *len); 36 37/* u32 bitmap */ 38 39struct xbitmap32 { 40 struct rb_root_cached xb_root; 41}; 42 43void xbitmap32_init(struct xbitmap32 *bitmap); 44void xbitmap32_destroy(struct xbitmap32 *bitmap); 45 46int xbitmap32_clear(struct xbitmap32 *bitmap, uint32_t start, uint32_t len); 47int xbitmap32_set(struct xbitmap32 *bitmap, uint32_t start, uint32_t len); 48int xbitmap32_disunion(struct xbitmap32 *bitmap, struct xbitmap32 *sub); 49uint32_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 */ 58typedef int (*xbitmap32_walk_fn)(uint32_t start, uint32_t len, void *priv); 59int xbitmap32_walk(struct xbitmap32 *bitmap, xbitmap32_walk_fn fn, 60 void *priv); 61 62bool xbitmap32_empty(struct xbitmap32 *bitmap); 63bool xbitmap32_test(struct xbitmap32 *bitmap, uint32_t start, uint32_t *len); 64 65uint32_t xbitmap32_count_set_regions(struct xbitmap32 *bitmap); 66 67#endif /* __XFS_SCRUB_BITMAP_H__ */ 68