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