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}