bitmap.c (ecc73f8a58c7844b04186726f8699ba97cec2ef9) | bitmap.c (178b48d588ea5424a54423dc9c406416de0547c8) |
---|---|
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#include "xfs.h" 7#include "xfs_fs.h" 8#include "xfs_shared.h" 9#include "xfs_format.h" 10#include "xfs_trans_resv.h" 11#include "xfs_mount.h" 12#include "xfs_btree.h" 13#include "scrub/scrub.h" 14#include "scrub/bitmap.h" 15 | 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#include "xfs.h" 7#include "xfs_fs.h" 8#include "xfs_shared.h" 9#include "xfs_format.h" 10#include "xfs_trans_resv.h" 11#include "xfs_mount.h" 12#include "xfs_btree.h" 13#include "scrub/scrub.h" 14#include "scrub/bitmap.h" 15 |
16#define for_each_xbitmap_extent(bex, n, bitmap) \ 17 list_for_each_entry_safe((bex), (n), &(bitmap)->list, list) 18 |
|
16/* 17 * Set a range of this bitmap. Caller must ensure the range is not set. 18 * 19 * This is the logical equivalent of bitmap |= mask(start, len). 20 */ 21int 22xbitmap_set( 23 struct xbitmap *bitmap, --- 284 unchanged lines hidden (view full) --- 308 struct xbitmap_range *n; 309 uint64_t ret = 0; 310 311 for_each_xbitmap_extent(bmr, n, bitmap) 312 ret += bmr->len; 313 314 return ret; 315} | 19/* 20 * Set a range of this bitmap. Caller must ensure the range is not set. 21 * 22 * This is the logical equivalent of bitmap |= mask(start, len). 23 */ 24int 25xbitmap_set( 26 struct xbitmap *bitmap, --- 284 unchanged lines hidden (view full) --- 311 struct xbitmap_range *n; 312 uint64_t ret = 0; 313 314 for_each_xbitmap_extent(bmr, n, bitmap) 315 ret += bmr->len; 316 317 return ret; 318} |
319 320/* Call a function for every run of set bits in this bitmap. */ 321int 322xbitmap_walk( 323 struct xbitmap *bitmap, 324 xbitmap_walk_fn fn, 325 void *priv) 326{ 327 struct xbitmap_range *bex, *n; 328 int error = 0; 329 330 for_each_xbitmap_extent(bex, n, bitmap) { 331 error = fn(bex->start, bex->len, priv); 332 if (error) 333 break; 334 } 335 336 return error; 337} 338 339struct xbitmap_walk_bits { 340 xbitmap_walk_bits_fn fn; 341 void *priv; 342}; 343 344/* Walk all the bits in a run. */ 345static int 346xbitmap_walk_bits_in_run( 347 uint64_t start, 348 uint64_t len, 349 void *priv) 350{ 351 struct xbitmap_walk_bits *wb = priv; 352 uint64_t i; 353 int error = 0; 354 355 for (i = start; i < start + len; i++) { 356 error = wb->fn(i, wb->priv); 357 if (error) 358 break; 359 } 360 361 return error; 362} 363 364/* Call a function for every set bit in this bitmap. */ 365int 366xbitmap_walk_bits( 367 struct xbitmap *bitmap, 368 xbitmap_walk_bits_fn fn, 369 void *priv) 370{ 371 struct xbitmap_walk_bits wb = {.fn = fn, .priv = priv}; 372 373 return xbitmap_walk(bitmap, xbitmap_walk_bits_in_run, &wb); 374} |
|