xref: /linux/fs/xfs/scrub/bitmap.c (revision 46c1b6674a7b3a8385e7fa27f4efc6f45eddf967)
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_platform.h"
7 #include "xfs_fs.h"
8 #include "xfs_shared.h"
9 #include "xfs_bit.h"
10 #include "xfs_format.h"
11 #include "xfs_trans_resv.h"
12 #include "xfs_mount.h"
13 #include "xfs_btree.h"
14 #include "scrub/scrub.h"
15 #include "scrub/bitmap.h"
16 
17 #include <linux/interval_tree_generic.h>
18 
19 /* u64 bitmap */
20 
21 struct xbitmap64_node {
22 	struct rb_node	bn_rbnode;
23 
24 	/* First set bit of this interval and subtree. */
25 	uint64_t	bn_start;
26 
27 	/* Last set bit of this interval. */
28 	uint64_t	bn_last;
29 
30 	/* Last set bit of this subtree.  Do not touch this. */
31 	uint64_t	__bn_subtree_last;
32 };
33 
34 /* Define our own interval tree type with uint64_t parameters. */
35 
36 #define START(node) ((node)->bn_start)
37 #define LAST(node)  ((node)->bn_last)
38 
39 /*
40  * These functions are defined by the INTERVAL_TREE_DEFINE macro, but we'll
41  * forward-declare them anyway for clarity.
42  */
43 static inline __maybe_unused void
44 xbitmap64_tree_insert(struct xbitmap64_node *node, struct rb_root_cached *root);
45 
46 static inline __maybe_unused void
47 xbitmap64_tree_remove(struct xbitmap64_node *node, struct rb_root_cached *root);
48 
49 static inline __maybe_unused struct xbitmap64_node *
50 xbitmap64_tree_iter_first(struct rb_root_cached *root, uint64_t start,
51 			uint64_t last);
52 
53 static inline __maybe_unused struct xbitmap64_node *
54 xbitmap64_tree_iter_next(struct xbitmap64_node *node, uint64_t start,
55 		       uint64_t last);
56 
57 INTERVAL_TREE_DEFINE(struct xbitmap64_node, bn_rbnode, uint64_t,
58 		__bn_subtree_last, START, LAST, static inline __maybe_unused,
59 		xbitmap64_tree)
60 
61 /* Iterate each interval of a bitmap.  Do not change the bitmap. */
62 #define for_each_xbitmap64_extent(bn, bitmap) \
63 	for ((bn) = rb_entry_safe(rb_first(&(bitmap)->xb_root.rb_root), \
64 				   struct xbitmap64_node, bn_rbnode); \
65 	     (bn) != NULL; \
66 	     (bn) = rb_entry_safe(rb_next(&(bn)->bn_rbnode), \
67 				   struct xbitmap64_node, bn_rbnode))
68 
69 /* Clear a range of this bitmap. */
70 int
71 xbitmap64_clear(
72 	struct xbitmap64	*bitmap,
73 	uint64_t		start,
74 	uint64_t		len)
75 {
76 	struct xbitmap64_node	*bn;
77 	struct xbitmap64_node	*new_bn;
78 	uint64_t		last = start + len - 1;
79 
80 	while ((bn = xbitmap64_tree_iter_first(&bitmap->xb_root, start, last))) {
81 		if (bn->bn_start < start && bn->bn_last > last) {
82 			uint64_t	old_last = bn->bn_last;
83 
84 			/* overlaps with the entire clearing range */
85 			xbitmap64_tree_remove(bn, &bitmap->xb_root);
86 			bn->bn_last = start - 1;
87 			xbitmap64_tree_insert(bn, &bitmap->xb_root);
88 
89 			/* add an extent */
90 			new_bn = kmalloc_obj(struct xbitmap64_node,
91 					     XCHK_GFP_FLAGS);
92 			if (!new_bn)
93 				return -ENOMEM;
94 			new_bn->bn_start = last + 1;
95 			new_bn->bn_last = old_last;
96 			xbitmap64_tree_insert(new_bn, &bitmap->xb_root);
97 		} else if (bn->bn_start < start) {
98 			/* overlaps with the left side of the clearing range */
99 			xbitmap64_tree_remove(bn, &bitmap->xb_root);
100 			bn->bn_last = start - 1;
101 			xbitmap64_tree_insert(bn, &bitmap->xb_root);
102 		} else if (bn->bn_last > last) {
103 			/* overlaps with the right side of the clearing range */
104 			xbitmap64_tree_remove(bn, &bitmap->xb_root);
105 			bn->bn_start = last + 1;
106 			xbitmap64_tree_insert(bn, &bitmap->xb_root);
107 			break;
108 		} else {
109 			/* in the middle of the clearing range */
110 			xbitmap64_tree_remove(bn, &bitmap->xb_root);
111 			kfree(bn);
112 		}
113 	}
114 
115 	return 0;
116 }
117 
118 /* Set a range of this bitmap. */
119 int
120 xbitmap64_set(
121 	struct xbitmap64	*bitmap,
122 	uint64_t		start,
123 	uint64_t		len)
124 {
125 	struct xbitmap64_node	*left = NULL;
126 	struct xbitmap64_node	*right = NULL;
127 	uint64_t		last = start + len - 1;
128 	int			error;
129 
130 	/* Is this whole range already set? */
131 	left = xbitmap64_tree_iter_first(&bitmap->xb_root, start, last);
132 	if (left && left->bn_start <= start && left->bn_last >= last)
133 		return 0;
134 	left = NULL;
135 
136 	/* Clear out everything in the range we want to set. */
137 	error = xbitmap64_clear(bitmap, start, len);
138 	if (error)
139 		return error;
140 
141 	/* Do we have a left-adjacent extent? */
142 	if (start > 0)
143 		left = xbitmap64_tree_iter_first(&bitmap->xb_root, start - 1,
144 				start - 1);
145 	ASSERT(!left || left->bn_last + 1 == start);
146 
147 	/* Do we have a right-adjacent extent? */
148 	if (last < U64_MAX)
149 		right = xbitmap64_tree_iter_first(&bitmap->xb_root, last + 1,
150 				last + 1);
151 	ASSERT(!right || right->bn_start == last + 1);
152 
153 	if (left && right) {
154 		/* combine left and right adjacent extent */
155 		xbitmap64_tree_remove(left, &bitmap->xb_root);
156 		xbitmap64_tree_remove(right, &bitmap->xb_root);
157 		left->bn_last = right->bn_last;
158 		xbitmap64_tree_insert(left, &bitmap->xb_root);
159 		kfree(right);
160 	} else if (left) {
161 		/* combine with left extent */
162 		xbitmap64_tree_remove(left, &bitmap->xb_root);
163 		left->bn_last = last;
164 		xbitmap64_tree_insert(left, &bitmap->xb_root);
165 	} else if (right) {
166 		/* combine with right extent */
167 		xbitmap64_tree_remove(right, &bitmap->xb_root);
168 		right->bn_start = start;
169 		xbitmap64_tree_insert(right, &bitmap->xb_root);
170 	} else {
171 		/* add an extent */
172 		left = kmalloc_obj(struct xbitmap64_node, XCHK_GFP_FLAGS);
173 		if (!left)
174 			return -ENOMEM;
175 		left->bn_start = start;
176 		left->bn_last = last;
177 		xbitmap64_tree_insert(left, &bitmap->xb_root);
178 	}
179 
180 	return 0;
181 }
182 
183 /* Free everything related to this bitmap. */
184 void
185 xbitmap64_destroy(
186 	struct xbitmap64	*bitmap)
187 {
188 	struct xbitmap64_node	*bn;
189 
190 	while ((bn = xbitmap64_tree_iter_first(&bitmap->xb_root, 0, -1ULL))) {
191 		xbitmap64_tree_remove(bn, &bitmap->xb_root);
192 		kfree(bn);
193 	}
194 }
195 
196 /* Set up a per-AG block bitmap. */
197 void
198 xbitmap64_init(
199 	struct xbitmap64	*bitmap)
200 {
201 	bitmap->xb_root = RB_ROOT_CACHED;
202 }
203 
204 /*
205  * Remove all the blocks mentioned in @sub from the extents in @bitmap.
206  *
207  * The intent is that callers will iterate the rmapbt for all of its records
208  * for a given owner to generate @bitmap; and iterate all the blocks of the
209  * metadata structures that are not being rebuilt and have the same rmapbt
210  * owner to generate @sub.  This routine subtracts all the extents
211  * mentioned in sub from all the extents linked in @bitmap, which leaves
212  * @bitmap as the list of blocks that are not accounted for, which we assume
213  * are the dead blocks of the old metadata structure.  The blocks mentioned in
214  * @bitmap can be reaped.
215  *
216  * This is the logical equivalent of bitmap &= ~sub.
217  */
218 int
219 xbitmap64_disunion(
220 	struct xbitmap64	*bitmap,
221 	struct xbitmap64	*sub)
222 {
223 	struct xbitmap64_node	*bn;
224 	int			error;
225 
226 	if (xbitmap64_empty(bitmap) || xbitmap64_empty(sub))
227 		return 0;
228 
229 	for_each_xbitmap64_extent(bn, sub) {
230 		error = xbitmap64_clear(bitmap, bn->bn_start,
231 				bn->bn_last - bn->bn_start + 1);
232 		if (error)
233 			return error;
234 	}
235 
236 	return 0;
237 }
238 
239 /* How many bits are set in this bitmap? */
240 uint64_t
241 xbitmap64_hweight(
242 	struct xbitmap64	*bitmap)
243 {
244 	struct xbitmap64_node	*bn;
245 	uint64_t		ret = 0;
246 
247 	for_each_xbitmap64_extent(bn, bitmap)
248 		ret += bn->bn_last - bn->bn_start + 1;
249 
250 	return ret;
251 }
252 
253 /* Call a function for every run of set bits in this bitmap. */
254 int
255 xbitmap64_walk(
256 	struct xbitmap64	*bitmap,
257 	xbitmap64_walk_fn		fn,
258 	void			*priv)
259 {
260 	struct xbitmap64_node	*bn;
261 	int			error = 0;
262 
263 	for_each_xbitmap64_extent(bn, bitmap) {
264 		error = fn(bn->bn_start, bn->bn_last - bn->bn_start + 1, priv);
265 		if (error)
266 			break;
267 	}
268 
269 	return error;
270 }
271 
272 /* Does this bitmap have no bits set at all? */
273 bool
274 xbitmap64_empty(
275 	struct xbitmap64	*bitmap)
276 {
277 	return bitmap->xb_root.rb_root.rb_node == NULL;
278 }
279 
280 /* Is the start of the range set or clear?  And for how long? */
281 bool
282 xbitmap64_test(
283 	struct xbitmap64	*bitmap,
284 	uint64_t		start,
285 	uint64_t		*len)
286 {
287 	struct xbitmap64_node	*bn;
288 	uint64_t		last = start + *len - 1;
289 
290 	bn = xbitmap64_tree_iter_first(&bitmap->xb_root, start, last);
291 	if (!bn)
292 		return false;
293 	if (bn->bn_start <= start) {
294 		if (bn->bn_last < last)
295 			*len = bn->bn_last - start + 1;
296 		return true;
297 	}
298 	*len = bn->bn_start - start;
299 	return false;
300 }
301 
302 /* u32 bitmap */
303 
304 struct xbitmap32_node {
305 	struct rb_node	bn_rbnode;
306 
307 	/* First set bit of this interval and subtree. */
308 	uint32_t	bn_start;
309 
310 	/* Last set bit of this interval. */
311 	uint32_t	bn_last;
312 
313 	/* Last set bit of this subtree.  Do not touch this. */
314 	uint32_t	__bn_subtree_last;
315 };
316 
317 /* Define our own interval tree type with uint32_t parameters. */
318 
319 /*
320  * These functions are defined by the INTERVAL_TREE_DEFINE macro, but we'll
321  * forward-declare them anyway for clarity.
322  */
323 static inline __maybe_unused void
324 xbitmap32_tree_insert(struct xbitmap32_node *node, struct rb_root_cached *root);
325 
326 static inline __maybe_unused void
327 xbitmap32_tree_remove(struct xbitmap32_node *node, struct rb_root_cached *root);
328 
329 static inline __maybe_unused struct xbitmap32_node *
330 xbitmap32_tree_iter_first(struct rb_root_cached *root, uint32_t start,
331 			  uint32_t last);
332 
333 static inline __maybe_unused struct xbitmap32_node *
334 xbitmap32_tree_iter_next(struct xbitmap32_node *node, uint32_t start,
335 			 uint32_t last);
336 
337 INTERVAL_TREE_DEFINE(struct xbitmap32_node, bn_rbnode, uint32_t,
338 		__bn_subtree_last, START, LAST, static inline __maybe_unused,
339 		xbitmap32_tree)
340 
341 /* Iterate each interval of a bitmap.  Do not change the bitmap. */
342 #define for_each_xbitmap32_extent(bn, bitmap) \
343 	for ((bn) = rb_entry_safe(rb_first(&(bitmap)->xb_root.rb_root), \
344 				   struct xbitmap32_node, bn_rbnode); \
345 	     (bn) != NULL; \
346 	     (bn) = rb_entry_safe(rb_next(&(bn)->bn_rbnode), \
347 				   struct xbitmap32_node, bn_rbnode))
348 
349 /* Clear a range of this bitmap. */
350 int
351 xbitmap32_clear(
352 	struct xbitmap32	*bitmap,
353 	uint32_t		start,
354 	uint32_t		len)
355 {
356 	struct xbitmap32_node	*bn;
357 	struct xbitmap32_node	*new_bn;
358 	uint32_t		last = start + len - 1;
359 
360 	while ((bn = xbitmap32_tree_iter_first(&bitmap->xb_root, start, last))) {
361 		if (bn->bn_start < start && bn->bn_last > last) {
362 			uint32_t	old_last = bn->bn_last;
363 
364 			/* overlaps with the entire clearing range */
365 			xbitmap32_tree_remove(bn, &bitmap->xb_root);
366 			bn->bn_last = start - 1;
367 			xbitmap32_tree_insert(bn, &bitmap->xb_root);
368 
369 			/* add an extent */
370 			new_bn = kmalloc_obj(struct xbitmap32_node,
371 					     XCHK_GFP_FLAGS);
372 			if (!new_bn)
373 				return -ENOMEM;
374 			new_bn->bn_start = last + 1;
375 			new_bn->bn_last = old_last;
376 			xbitmap32_tree_insert(new_bn, &bitmap->xb_root);
377 		} else if (bn->bn_start < start) {
378 			/* overlaps with the left side of the clearing range */
379 			xbitmap32_tree_remove(bn, &bitmap->xb_root);
380 			bn->bn_last = start - 1;
381 			xbitmap32_tree_insert(bn, &bitmap->xb_root);
382 		} else if (bn->bn_last > last) {
383 			/* overlaps with the right side of the clearing range */
384 			xbitmap32_tree_remove(bn, &bitmap->xb_root);
385 			bn->bn_start = last + 1;
386 			xbitmap32_tree_insert(bn, &bitmap->xb_root);
387 			break;
388 		} else {
389 			/* in the middle of the clearing range */
390 			xbitmap32_tree_remove(bn, &bitmap->xb_root);
391 			kfree(bn);
392 		}
393 	}
394 
395 	return 0;
396 }
397 
398 /* Set a range of this bitmap. */
399 int
400 xbitmap32_set(
401 	struct xbitmap32	*bitmap,
402 	uint32_t		start,
403 	uint32_t		len)
404 {
405 	struct xbitmap32_node	*left = NULL;
406 	struct xbitmap32_node	*right = NULL;
407 	uint32_t		last = start + len - 1;
408 	int			error;
409 
410 	/* Is this whole range already set? */
411 	left = xbitmap32_tree_iter_first(&bitmap->xb_root, start, last);
412 	if (left && left->bn_start <= start && left->bn_last >= last)
413 		return 0;
414 	left = NULL;
415 
416 	/* Clear out everything in the range we want to set. */
417 	error = xbitmap32_clear(bitmap, start, len);
418 	if (error)
419 		return error;
420 
421 	/* Do we have a left-adjacent extent? */
422 	if (start > 0)
423 		left = xbitmap32_tree_iter_first(&bitmap->xb_root, start - 1,
424 				start - 1);
425 	ASSERT(!left || left->bn_last + 1 == start);
426 
427 	/* Do we have a right-adjacent extent? */
428 	if (last < U32_MAX)
429 		right = xbitmap32_tree_iter_first(&bitmap->xb_root, last + 1,
430 				last + 1);
431 	ASSERT(!right || right->bn_start == last + 1);
432 
433 	if (left && right) {
434 		/* combine left and right adjacent extent */
435 		xbitmap32_tree_remove(left, &bitmap->xb_root);
436 		xbitmap32_tree_remove(right, &bitmap->xb_root);
437 		left->bn_last = right->bn_last;
438 		xbitmap32_tree_insert(left, &bitmap->xb_root);
439 		kfree(right);
440 	} else if (left) {
441 		/* combine with left extent */
442 		xbitmap32_tree_remove(left, &bitmap->xb_root);
443 		left->bn_last = last;
444 		xbitmap32_tree_insert(left, &bitmap->xb_root);
445 	} else if (right) {
446 		/* combine with right extent */
447 		xbitmap32_tree_remove(right, &bitmap->xb_root);
448 		right->bn_start = start;
449 		xbitmap32_tree_insert(right, &bitmap->xb_root);
450 	} else {
451 		/* add an extent */
452 		left = kmalloc_obj(struct xbitmap32_node, XCHK_GFP_FLAGS);
453 		if (!left)
454 			return -ENOMEM;
455 		left->bn_start = start;
456 		left->bn_last = last;
457 		xbitmap32_tree_insert(left, &bitmap->xb_root);
458 	}
459 
460 	return 0;
461 }
462 
463 /* Free everything related to this bitmap. */
464 void
465 xbitmap32_destroy(
466 	struct xbitmap32	*bitmap)
467 {
468 	struct xbitmap32_node	*bn;
469 
470 	while ((bn = xbitmap32_tree_iter_first(&bitmap->xb_root, 0, -1U))) {
471 		xbitmap32_tree_remove(bn, &bitmap->xb_root);
472 		kfree(bn);
473 	}
474 }
475 
476 /* Set up a per-AG block bitmap. */
477 void
478 xbitmap32_init(
479 	struct xbitmap32	*bitmap)
480 {
481 	bitmap->xb_root = RB_ROOT_CACHED;
482 }
483 
484 /*
485  * Remove all the blocks mentioned in @sub from the extents in @bitmap.
486  *
487  * The intent is that callers will iterate the rmapbt for all of its records
488  * for a given owner to generate @bitmap; and iterate all the blocks of the
489  * metadata structures that are not being rebuilt and have the same rmapbt
490  * owner to generate @sub.  This routine subtracts all the extents
491  * mentioned in sub from all the extents linked in @bitmap, which leaves
492  * @bitmap as the list of blocks that are not accounted for, which we assume
493  * are the dead blocks of the old metadata structure.  The blocks mentioned in
494  * @bitmap can be reaped.
495  *
496  * This is the logical equivalent of bitmap &= ~sub.
497  */
498 int
499 xbitmap32_disunion(
500 	struct xbitmap32	*bitmap,
501 	struct xbitmap32	*sub)
502 {
503 	struct xbitmap32_node	*bn;
504 	int			error;
505 
506 	if (xbitmap32_empty(bitmap) || xbitmap32_empty(sub))
507 		return 0;
508 
509 	for_each_xbitmap32_extent(bn, sub) {
510 		error = xbitmap32_clear(bitmap, bn->bn_start,
511 				bn->bn_last - bn->bn_start + 1);
512 		if (error)
513 			return error;
514 	}
515 
516 	return 0;
517 }
518 
519 /* How many bits are set in this bitmap? */
520 uint32_t
521 xbitmap32_hweight(
522 	struct xbitmap32	*bitmap)
523 {
524 	struct xbitmap32_node	*bn;
525 	uint32_t		ret = 0;
526 
527 	for_each_xbitmap32_extent(bn, bitmap)
528 		ret += bn->bn_last - bn->bn_start + 1;
529 
530 	return ret;
531 }
532 
533 /* Call a function for every run of set bits in this bitmap. */
534 int
535 xbitmap32_walk(
536 	struct xbitmap32	*bitmap,
537 	xbitmap32_walk_fn	fn,
538 	void			*priv)
539 {
540 	struct xbitmap32_node	*bn;
541 	int			error = 0;
542 
543 	for_each_xbitmap32_extent(bn, bitmap) {
544 		error = fn(bn->bn_start, bn->bn_last - bn->bn_start + 1, priv);
545 		if (error)
546 			break;
547 	}
548 
549 	return error;
550 }
551 
552 /* Does this bitmap have no bits set at all? */
553 bool
554 xbitmap32_empty(
555 	struct xbitmap32	*bitmap)
556 {
557 	return bitmap->xb_root.rb_root.rb_node == NULL;
558 }
559 
560 /* Is the start of the range set or clear?  And for how long? */
561 bool
562 xbitmap32_test(
563 	struct xbitmap32	*bitmap,
564 	uint32_t		start,
565 	uint32_t		*len)
566 {
567 	struct xbitmap32_node	*bn;
568 	uint32_t		last = start + *len - 1;
569 
570 	bn = xbitmap32_tree_iter_first(&bitmap->xb_root, start, last);
571 	if (!bn)
572 		return false;
573 	if (bn->bn_start <= start) {
574 		if (bn->bn_last < last)
575 			*len = bn->bn_last - start + 1;
576 		return true;
577 	}
578 	*len = bn->bn_start - start;
579 	return false;
580 }
581 
582 /* Count the number of set regions in this bitmap. */
583 uint32_t
584 xbitmap32_count_set_regions(
585 	struct xbitmap32	*bitmap)
586 {
587 	struct xbitmap32_node	*bn;
588 	uint32_t		nr = 0;
589 
590 	for_each_xbitmap32_extent(bn, bitmap)
591 		nr++;
592 
593 	return nr;
594 }
595