1 // SPDX-License-Identifier: GPL-2.0 2 /* 3 * Copyright (C) 2013 Fusion IO. All rights reserved. 4 */ 5 6 #include <linux/slab.h> 7 #include "btrfs-tests.h" 8 #include "../ctree.h" 9 #include "../disk-io.h" 10 #include "../free-space-cache.h" 11 #include "../block-group.h" 12 13 #define BITS_PER_BITMAP (PAGE_SIZE * 8UL) 14 15 /* 16 * This test just does basic sanity checking, making sure we can add an extent 17 * entry and remove space from either end and the middle, and make sure we can 18 * remove space that covers adjacent extent entries. 19 */ 20 static int test_extents(struct btrfs_block_group *cache) 21 { 22 int ret = 0; 23 24 test_msg("running extent only tests"); 25 26 /* First just make sure we can remove an entire entry */ 27 ret = btrfs_add_free_space(cache, 0, SZ_4M); 28 if (ret) { 29 test_err("error adding initial extents %d", ret); 30 return ret; 31 } 32 33 ret = btrfs_remove_free_space(cache, 0, SZ_4M); 34 if (ret) { 35 test_err("error removing extent %d", ret); 36 return ret; 37 } 38 39 if (test_check_exists(cache, 0, SZ_4M)) { 40 test_err("full remove left some lingering space"); 41 return -1; 42 } 43 44 /* Ok edge and middle cases now */ 45 ret = btrfs_add_free_space(cache, 0, SZ_4M); 46 if (ret) { 47 test_err("error adding half extent %d", ret); 48 return ret; 49 } 50 51 ret = btrfs_remove_free_space(cache, 3 * SZ_1M, SZ_1M); 52 if (ret) { 53 test_err("error removing tail end %d", ret); 54 return ret; 55 } 56 57 ret = btrfs_remove_free_space(cache, 0, SZ_1M); 58 if (ret) { 59 test_err("error removing front end %d", ret); 60 return ret; 61 } 62 63 ret = btrfs_remove_free_space(cache, SZ_2M, 4096); 64 if (ret) { 65 test_err("error removing middle piece %d", ret); 66 return ret; 67 } 68 69 if (test_check_exists(cache, 0, SZ_1M)) { 70 test_err("still have space at the front"); 71 return -1; 72 } 73 74 if (test_check_exists(cache, SZ_2M, 4096)) { 75 test_err("still have space in the middle"); 76 return -1; 77 } 78 79 if (test_check_exists(cache, 3 * SZ_1M, SZ_1M)) { 80 test_err("still have space at the end"); 81 return -1; 82 } 83 84 /* Cleanup */ 85 btrfs_remove_free_space_cache(cache); 86 87 return 0; 88 } 89 90 static int test_bitmaps(struct btrfs_block_group *cache, u32 sectorsize) 91 { 92 u64 next_bitmap_offset; 93 int ret; 94 95 test_msg("running bitmap only tests"); 96 97 ret = test_add_free_space_entry(cache, 0, SZ_4M, 1); 98 if (ret) { 99 test_err("couldn't create a bitmap entry %d", ret); 100 return ret; 101 } 102 103 ret = btrfs_remove_free_space(cache, 0, SZ_4M); 104 if (ret) { 105 test_err("error removing bitmap full range %d", ret); 106 return ret; 107 } 108 109 if (test_check_exists(cache, 0, SZ_4M)) { 110 test_err("left some space in bitmap"); 111 return -1; 112 } 113 114 ret = test_add_free_space_entry(cache, 0, SZ_4M, 1); 115 if (ret) { 116 test_err("couldn't add to our bitmap entry %d", ret); 117 return ret; 118 } 119 120 ret = btrfs_remove_free_space(cache, SZ_1M, SZ_2M); 121 if (ret) { 122 test_err("couldn't remove middle chunk %d", ret); 123 return ret; 124 } 125 126 /* 127 * The first bitmap we have starts at offset 0 so the next one is just 128 * at the end of the first bitmap. 129 */ 130 next_bitmap_offset = (u64)(BITS_PER_BITMAP * sectorsize); 131 132 /* Test a bit straddling two bitmaps */ 133 ret = test_add_free_space_entry(cache, next_bitmap_offset - SZ_2M, 134 SZ_4M, 1); 135 if (ret) { 136 test_err("couldn't add space that straddles two bitmaps %d", 137 ret); 138 return ret; 139 } 140 141 ret = btrfs_remove_free_space(cache, next_bitmap_offset - SZ_1M, SZ_2M); 142 if (ret) { 143 test_err("couldn't remove overlapping space %d", ret); 144 return ret; 145 } 146 147 if (test_check_exists(cache, next_bitmap_offset - SZ_1M, SZ_2M)) { 148 test_err("left some space when removing overlapping"); 149 return -1; 150 } 151 152 btrfs_remove_free_space_cache(cache); 153 154 return 0; 155 } 156 157 /* This is the high grade jackassery */ 158 static int test_bitmaps_and_extents(struct btrfs_block_group *cache, 159 u32 sectorsize) 160 { 161 u64 bitmap_offset = (u64)(BITS_PER_BITMAP * sectorsize); 162 int ret; 163 164 test_msg("running bitmap and extent tests"); 165 166 /* 167 * First let's do something simple, an extent at the same offset as the 168 * bitmap, but the free space completely in the extent and then 169 * completely in the bitmap. 170 */ 171 ret = test_add_free_space_entry(cache, SZ_4M, SZ_1M, 1); 172 if (ret) { 173 test_err("couldn't create bitmap entry %d", ret); 174 return ret; 175 } 176 177 ret = test_add_free_space_entry(cache, 0, SZ_1M, 0); 178 if (ret) { 179 test_err("couldn't add extent entry %d", ret); 180 return ret; 181 } 182 183 ret = btrfs_remove_free_space(cache, 0, SZ_1M); 184 if (ret) { 185 test_err("couldn't remove extent entry %d", ret); 186 return ret; 187 } 188 189 if (test_check_exists(cache, 0, SZ_1M)) { 190 test_err("left remnants after our remove"); 191 return -1; 192 } 193 194 /* Now to add back the extent entry and remove from the bitmap */ 195 ret = test_add_free_space_entry(cache, 0, SZ_1M, 0); 196 if (ret) { 197 test_err("couldn't re-add extent entry %d", ret); 198 return ret; 199 } 200 201 ret = btrfs_remove_free_space(cache, SZ_4M, SZ_1M); 202 if (ret) { 203 test_err("couldn't remove from bitmap %d", ret); 204 return ret; 205 } 206 207 if (test_check_exists(cache, SZ_4M, SZ_1M)) { 208 test_err("left remnants in the bitmap"); 209 return -1; 210 } 211 212 /* 213 * Ok so a little more evil, extent entry and bitmap at the same offset, 214 * removing an overlapping chunk. 215 */ 216 ret = test_add_free_space_entry(cache, SZ_1M, SZ_4M, 1); 217 if (ret) { 218 test_err("couldn't add to a bitmap %d", ret); 219 return ret; 220 } 221 222 ret = btrfs_remove_free_space(cache, SZ_512K, 3 * SZ_1M); 223 if (ret) { 224 test_err("couldn't remove overlapping space %d", ret); 225 return ret; 226 } 227 228 if (test_check_exists(cache, SZ_512K, 3 * SZ_1M)) { 229 test_err("left over pieces after removing overlapping"); 230 return -1; 231 } 232 233 btrfs_remove_free_space_cache(cache); 234 235 /* Now with the extent entry offset into the bitmap */ 236 ret = test_add_free_space_entry(cache, SZ_4M, SZ_4M, 1); 237 if (ret) { 238 test_err("couldn't add space to the bitmap %d", ret); 239 return ret; 240 } 241 242 ret = test_add_free_space_entry(cache, SZ_2M, SZ_2M, 0); 243 if (ret) { 244 test_err("couldn't add extent to the cache %d", ret); 245 return ret; 246 } 247 248 ret = btrfs_remove_free_space(cache, 3 * SZ_1M, SZ_4M); 249 if (ret) { 250 test_err("problem removing overlapping space %d", ret); 251 return ret; 252 } 253 254 if (test_check_exists(cache, 3 * SZ_1M, SZ_4M)) { 255 test_err("left something behind when removing space"); 256 return -1; 257 } 258 259 /* 260 * This has blown up in the past, the extent entry starts before the 261 * bitmap entry, but we're trying to remove an offset that falls 262 * completely within the bitmap range and is in both the extent entry 263 * and the bitmap entry, looks like this 264 * 265 * [ extent ] 266 * [ bitmap ] 267 * [ del ] 268 */ 269 btrfs_remove_free_space_cache(cache); 270 ret = test_add_free_space_entry(cache, bitmap_offset + SZ_4M, SZ_4M, 1); 271 if (ret) { 272 test_err("couldn't add bitmap %d", ret); 273 return ret; 274 } 275 276 ret = test_add_free_space_entry(cache, bitmap_offset - SZ_1M, 277 5 * SZ_1M, 0); 278 if (ret) { 279 test_err("couldn't add extent entry %d", ret); 280 return ret; 281 } 282 283 ret = btrfs_remove_free_space(cache, bitmap_offset + SZ_1M, 5 * SZ_1M); 284 if (ret) { 285 test_err("failed to free our space %d", ret); 286 return ret; 287 } 288 289 if (test_check_exists(cache, bitmap_offset + SZ_1M, 5 * SZ_1M)) { 290 test_err("left stuff over"); 291 return -1; 292 } 293 294 btrfs_remove_free_space_cache(cache); 295 296 /* 297 * This blew up before, we have part of the free space in a bitmap and 298 * then the entirety of the rest of the space in an extent. This used 299 * to return -EAGAIN back from btrfs_remove_extent, make sure this 300 * doesn't happen. 301 */ 302 ret = test_add_free_space_entry(cache, SZ_1M, SZ_2M, 1); 303 if (ret) { 304 test_err("couldn't add bitmap entry %d", ret); 305 return ret; 306 } 307 308 ret = test_add_free_space_entry(cache, 3 * SZ_1M, SZ_1M, 0); 309 if (ret) { 310 test_err("couldn't add extent entry %d", ret); 311 return ret; 312 } 313 314 ret = btrfs_remove_free_space(cache, SZ_1M, 3 * SZ_1M); 315 if (ret) { 316 test_err("error removing bitmap and extent overlapping %d", ret); 317 return ret; 318 } 319 320 btrfs_remove_free_space_cache(cache); 321 return 0; 322 } 323 324 /* Used by test_steal_space_from_bitmap_to_extent(). */ 325 static bool test_use_bitmap(struct btrfs_free_space_ctl *ctl, 326 struct btrfs_free_space *info) 327 { 328 return ctl->free_extents > 0; 329 } 330 331 /* Used by test_steal_space_from_bitmap_to_extent(). */ 332 static int 333 check_num_extents_and_bitmaps(const struct btrfs_block_group *cache, 334 const int num_extents, 335 const int num_bitmaps) 336 { 337 if (cache->free_space_ctl->free_extents != num_extents) { 338 test_err( 339 "incorrect # of extent entries in the cache: %d, expected %d", 340 cache->free_space_ctl->free_extents, num_extents); 341 return -EINVAL; 342 } 343 if (cache->free_space_ctl->total_bitmaps != num_bitmaps) { 344 test_err( 345 "incorrect # of extent entries in the cache: %d, expected %d", 346 cache->free_space_ctl->total_bitmaps, num_bitmaps); 347 return -EINVAL; 348 } 349 return 0; 350 } 351 352 /* Used by test_steal_space_from_bitmap_to_extent(). */ 353 static int check_cache_empty(struct btrfs_block_group *cache) 354 { 355 u64 offset; 356 u64 max_extent_size; 357 358 /* 359 * Now lets confirm that there's absolutely no free space left to 360 * allocate. 361 */ 362 if (cache->free_space_ctl->free_space != 0) { 363 test_err("cache free space is not 0"); 364 return -EINVAL; 365 } 366 367 /* And any allocation request, no matter how small, should fail now. */ 368 offset = btrfs_find_space_for_alloc(cache, 0, 4096, 0, 369 &max_extent_size); 370 if (offset != 0) { 371 test_err("space allocation did not fail, returned offset: %llu", 372 offset); 373 return -EINVAL; 374 } 375 376 /* And no extent nor bitmap entries in the cache anymore. */ 377 return check_num_extents_and_bitmaps(cache, 0, 0); 378 } 379 380 /* 381 * Before we were able to steal free space from a bitmap entry to an extent 382 * entry, we could end up with 2 entries representing a contiguous free space. 383 * One would be an extent entry and the other a bitmap entry. Since in order 384 * to allocate space to a caller we use only 1 entry, we couldn't return that 385 * whole range to the caller if it was requested. This forced the caller to 386 * either assume ENOSPC or perform several smaller space allocations, which 387 * wasn't optimal as they could be spread all over the block group while under 388 * concurrency (extra overhead and fragmentation). 389 * 390 * This stealing approach is beneficial, since we always prefer to allocate 391 * from extent entries, both for clustered and non-clustered allocation 392 * requests. 393 */ 394 static int 395 test_steal_space_from_bitmap_to_extent(struct btrfs_block_group *cache, 396 u32 sectorsize) 397 { 398 int ret; 399 u64 offset; 400 u64 max_extent_size; 401 bool (*orig_use_bitmap)(struct btrfs_free_space_ctl *ctl, 402 struct btrfs_free_space *info); 403 404 test_msg("running space stealing from bitmap to extent tests"); 405 406 /* 407 * For this test, we want to ensure we end up with an extent entry 408 * immediately adjacent to a bitmap entry, where the bitmap starts 409 * at an offset where the extent entry ends. We keep adding and 410 * removing free space to reach into this state, but to get there 411 * we need to reach a point where marking new free space doesn't 412 * result in adding new extent entries or merging the new space 413 * with existing extent entries - the space ends up being marked 414 * in an existing bitmap that covers the new free space range. 415 * 416 * To get there, we need to reach the threshold defined set at 417 * cache->free_space_ctl->extents_thresh, which currently is 418 * 256 extents on a x86_64 system at least, and a few other 419 * conditions (check free_space_cache.c). Instead of making the 420 * test much longer and complicated, use a "use_bitmap" operation 421 * that forces use of bitmaps as soon as we have at least 1 422 * extent entry. 423 */ 424 orig_use_bitmap = cache->fs_info->use_bitmap; 425 cache->fs_info->use_bitmap = test_use_bitmap; 426 427 /* 428 * Extent entry covering free space range [128Mb - 256Kb, 128Mb - 128Kb[ 429 */ 430 ret = test_add_free_space_entry(cache, SZ_128M - SZ_256K, SZ_128K, 0); 431 if (ret) { 432 test_err("couldn't add extent entry %d", ret); 433 return ret; 434 } 435 436 /* Bitmap entry covering free space range [128Mb + 512Kb, 256Mb[ */ 437 ret = test_add_free_space_entry(cache, SZ_128M + SZ_512K, 438 SZ_128M - SZ_512K, 1); 439 if (ret) { 440 test_err("couldn't add bitmap entry %d", ret); 441 return ret; 442 } 443 444 ret = check_num_extents_and_bitmaps(cache, 2, 1); 445 if (ret) 446 return ret; 447 448 /* 449 * Now make only the first 256Kb of the bitmap marked as free, so that 450 * we end up with only the following ranges marked as free space: 451 * 452 * [128Mb - 256Kb, 128Mb - 128Kb[ 453 * [128Mb + 512Kb, 128Mb + 768Kb[ 454 */ 455 ret = btrfs_remove_free_space(cache, 456 SZ_128M + 768 * SZ_1K, 457 SZ_128M - 768 * SZ_1K); 458 if (ret) { 459 test_err("failed to free part of bitmap space %d", ret); 460 return ret; 461 } 462 463 /* Confirm that only those 2 ranges are marked as free. */ 464 if (!test_check_exists(cache, SZ_128M - SZ_256K, SZ_128K)) { 465 test_err("free space range missing"); 466 return -ENOENT; 467 } 468 if (!test_check_exists(cache, SZ_128M + SZ_512K, SZ_256K)) { 469 test_err("free space range missing"); 470 return -ENOENT; 471 } 472 473 /* 474 * Confirm that the bitmap range [128Mb + 768Kb, 256Mb[ isn't marked 475 * as free anymore. 476 */ 477 if (test_check_exists(cache, SZ_128M + 768 * SZ_1K, 478 SZ_128M - 768 * SZ_1K)) { 479 test_err("bitmap region not removed from space cache"); 480 return -EINVAL; 481 } 482 483 /* 484 * Confirm that the region [128Mb + 256Kb, 128Mb + 512Kb[, which is 485 * covered by the bitmap, isn't marked as free. 486 */ 487 if (test_check_exists(cache, SZ_128M + SZ_256K, SZ_256K)) { 488 test_err("invalid bitmap region marked as free"); 489 return -EINVAL; 490 } 491 492 /* 493 * Confirm that the region [128Mb, 128Mb + 256Kb[, which is covered 494 * by the bitmap too, isn't marked as free either. 495 */ 496 if (test_check_exists(cache, SZ_128M, SZ_256K)) { 497 test_err("invalid bitmap region marked as free"); 498 return -EINVAL; 499 } 500 501 /* 502 * Now lets mark the region [128Mb, 128Mb + 512Kb[ as free too. But, 503 * lets make sure the free space cache marks it as free in the bitmap, 504 * and doesn't insert a new extent entry to represent this region. 505 */ 506 ret = btrfs_add_free_space(cache, SZ_128M, SZ_512K); 507 if (ret) { 508 test_err("error adding free space: %d", ret); 509 return ret; 510 } 511 /* Confirm the region is marked as free. */ 512 if (!test_check_exists(cache, SZ_128M, SZ_512K)) { 513 test_err("bitmap region not marked as free"); 514 return -ENOENT; 515 } 516 517 /* 518 * Confirm that no new extent entries or bitmap entries were added to 519 * the cache after adding that free space region. 520 */ 521 ret = check_num_extents_and_bitmaps(cache, 2, 1); 522 if (ret) 523 return ret; 524 525 /* 526 * Now lets add a small free space region to the right of the previous 527 * one, which is not contiguous with it and is part of the bitmap too. 528 * The goal is to test that the bitmap entry space stealing doesn't 529 * steal this space region. 530 */ 531 ret = btrfs_add_free_space(cache, SZ_128M + SZ_16M, sectorsize); 532 if (ret) { 533 test_err("error adding free space: %d", ret); 534 return ret; 535 } 536 537 /* 538 * Confirm that no new extent entries or bitmap entries were added to 539 * the cache after adding that free space region. 540 */ 541 ret = check_num_extents_and_bitmaps(cache, 2, 1); 542 if (ret) 543 return ret; 544 545 /* 546 * Now mark the region [128Mb - 128Kb, 128Mb[ as free too. This will 547 * expand the range covered by the existing extent entry that represents 548 * the free space [128Mb - 256Kb, 128Mb - 128Kb[. 549 */ 550 ret = btrfs_add_free_space(cache, SZ_128M - SZ_128K, SZ_128K); 551 if (ret) { 552 test_err("error adding free space: %d", ret); 553 return ret; 554 } 555 /* Confirm the region is marked as free. */ 556 if (!test_check_exists(cache, SZ_128M - SZ_128K, SZ_128K)) { 557 test_err("extent region not marked as free"); 558 return -ENOENT; 559 } 560 561 /* 562 * Confirm that our extent entry didn't stole all free space from the 563 * bitmap, because of the small 4Kb free space region. 564 */ 565 ret = check_num_extents_and_bitmaps(cache, 2, 1); 566 if (ret) 567 return ret; 568 569 /* 570 * So now we have the range [128Mb - 256Kb, 128Mb + 768Kb[ as free 571 * space. Without stealing bitmap free space into extent entry space, 572 * we would have all this free space represented by 2 entries in the 573 * cache: 574 * 575 * extent entry covering range: [128Mb - 256Kb, 128Mb[ 576 * bitmap entry covering range: [128Mb, 128Mb + 768Kb[ 577 * 578 * Attempting to allocate the whole free space (1Mb) would fail, because 579 * we can't allocate from multiple entries. 580 * With the bitmap free space stealing, we get a single extent entry 581 * that represents the 1Mb free space, and therefore we're able to 582 * allocate the whole free space at once. 583 */ 584 if (!test_check_exists(cache, SZ_128M - SZ_256K, SZ_1M)) { 585 test_err("expected region not marked as free"); 586 return -ENOENT; 587 } 588 589 if (cache->free_space_ctl->free_space != (SZ_1M + sectorsize)) { 590 test_err("cache free space is not 1Mb + %u", sectorsize); 591 return -EINVAL; 592 } 593 594 offset = btrfs_find_space_for_alloc(cache, 595 0, SZ_1M, 0, 596 &max_extent_size); 597 if (offset != (SZ_128M - SZ_256K)) { 598 test_err( 599 "failed to allocate 1Mb from space cache, returned offset is: %llu", 600 offset); 601 return -EINVAL; 602 } 603 604 /* 605 * All that remains is a sectorsize free space region in a bitmap. 606 * Confirm. 607 */ 608 ret = check_num_extents_and_bitmaps(cache, 1, 1); 609 if (ret) 610 return ret; 611 612 if (cache->free_space_ctl->free_space != sectorsize) { 613 test_err("cache free space is not %u", sectorsize); 614 return -EINVAL; 615 } 616 617 offset = btrfs_find_space_for_alloc(cache, 618 0, sectorsize, 0, 619 &max_extent_size); 620 if (offset != (SZ_128M + SZ_16M)) { 621 test_err("failed to allocate %u, returned offset : %llu", 622 sectorsize, offset); 623 return -EINVAL; 624 } 625 626 ret = check_cache_empty(cache); 627 if (ret) 628 return ret; 629 630 btrfs_remove_free_space_cache(cache); 631 632 /* 633 * Now test a similar scenario, but where our extent entry is located 634 * to the right of the bitmap entry, so that we can check that stealing 635 * space from a bitmap to the front of an extent entry works. 636 */ 637 638 /* 639 * Extent entry covering free space range [128Mb + 128Kb, 128Mb + 256Kb[ 640 */ 641 ret = test_add_free_space_entry(cache, SZ_128M + SZ_128K, SZ_128K, 0); 642 if (ret) { 643 test_err("couldn't add extent entry %d", ret); 644 return ret; 645 } 646 647 /* Bitmap entry covering free space range [0, 128Mb - 512Kb[ */ 648 ret = test_add_free_space_entry(cache, 0, SZ_128M - SZ_512K, 1); 649 if (ret) { 650 test_err("couldn't add bitmap entry %d", ret); 651 return ret; 652 } 653 654 ret = check_num_extents_and_bitmaps(cache, 2, 1); 655 if (ret) 656 return ret; 657 658 /* 659 * Now make only the last 256Kb of the bitmap marked as free, so that 660 * we end up with only the following ranges marked as free space: 661 * 662 * [128Mb + 128b, 128Mb + 256Kb[ 663 * [128Mb - 768Kb, 128Mb - 512Kb[ 664 */ 665 ret = btrfs_remove_free_space(cache, 0, SZ_128M - 768 * SZ_1K); 666 if (ret) { 667 test_err("failed to free part of bitmap space %d", ret); 668 return ret; 669 } 670 671 /* Confirm that only those 2 ranges are marked as free. */ 672 if (!test_check_exists(cache, SZ_128M + SZ_128K, SZ_128K)) { 673 test_err("free space range missing"); 674 return -ENOENT; 675 } 676 if (!test_check_exists(cache, SZ_128M - 768 * SZ_1K, SZ_256K)) { 677 test_err("free space range missing"); 678 return -ENOENT; 679 } 680 681 /* 682 * Confirm that the bitmap range [0, 128Mb - 768Kb[ isn't marked 683 * as free anymore. 684 */ 685 if (test_check_exists(cache, 0, SZ_128M - 768 * SZ_1K)) { 686 test_err("bitmap region not removed from space cache"); 687 return -EINVAL; 688 } 689 690 /* 691 * Confirm that the region [128Mb - 512Kb, 128Mb[, which is 692 * covered by the bitmap, isn't marked as free. 693 */ 694 if (test_check_exists(cache, SZ_128M - SZ_512K, SZ_512K)) { 695 test_err("invalid bitmap region marked as free"); 696 return -EINVAL; 697 } 698 699 /* 700 * Now lets mark the region [128Mb - 512Kb, 128Mb[ as free too. But, 701 * lets make sure the free space cache marks it as free in the bitmap, 702 * and doesn't insert a new extent entry to represent this region. 703 */ 704 ret = btrfs_add_free_space(cache, SZ_128M - SZ_512K, SZ_512K); 705 if (ret) { 706 test_err("error adding free space: %d", ret); 707 return ret; 708 } 709 /* Confirm the region is marked as free. */ 710 if (!test_check_exists(cache, SZ_128M - SZ_512K, SZ_512K)) { 711 test_err("bitmap region not marked as free"); 712 return -ENOENT; 713 } 714 715 /* 716 * Confirm that no new extent entries or bitmap entries were added to 717 * the cache after adding that free space region. 718 */ 719 ret = check_num_extents_and_bitmaps(cache, 2, 1); 720 if (ret) 721 return ret; 722 723 /* 724 * Now lets add a small free space region to the left of the previous 725 * one, which is not contiguous with it and is part of the bitmap too. 726 * The goal is to test that the bitmap entry space stealing doesn't 727 * steal this space region. 728 */ 729 ret = btrfs_add_free_space(cache, SZ_32M, 2 * sectorsize); 730 if (ret) { 731 test_err("error adding free space: %d", ret); 732 return ret; 733 } 734 735 /* 736 * Now mark the region [128Mb, 128Mb + 128Kb[ as free too. This will 737 * expand the range covered by the existing extent entry that represents 738 * the free space [128Mb + 128Kb, 128Mb + 256Kb[. 739 */ 740 ret = btrfs_add_free_space(cache, SZ_128M, SZ_128K); 741 if (ret) { 742 test_err("error adding free space: %d", ret); 743 return ret; 744 } 745 /* Confirm the region is marked as free. */ 746 if (!test_check_exists(cache, SZ_128M, SZ_128K)) { 747 test_err("extent region not marked as free"); 748 return -ENOENT; 749 } 750 751 /* 752 * Confirm that our extent entry didn't stole all free space from the 753 * bitmap, because of the small 2 * sectorsize free space region. 754 */ 755 ret = check_num_extents_and_bitmaps(cache, 2, 1); 756 if (ret) 757 return ret; 758 759 /* 760 * So now we have the range [128Mb - 768Kb, 128Mb + 256Kb[ as free 761 * space. Without stealing bitmap free space into extent entry space, 762 * we would have all this free space represented by 2 entries in the 763 * cache: 764 * 765 * extent entry covering range: [128Mb, 128Mb + 256Kb[ 766 * bitmap entry covering range: [128Mb - 768Kb, 128Mb[ 767 * 768 * Attempting to allocate the whole free space (1Mb) would fail, because 769 * we can't allocate from multiple entries. 770 * With the bitmap free space stealing, we get a single extent entry 771 * that represents the 1Mb free space, and therefore we're able to 772 * allocate the whole free space at once. 773 */ 774 if (!test_check_exists(cache, SZ_128M - 768 * SZ_1K, SZ_1M)) { 775 test_err("expected region not marked as free"); 776 return -ENOENT; 777 } 778 779 if (cache->free_space_ctl->free_space != (SZ_1M + 2 * sectorsize)) { 780 test_err("cache free space is not 1Mb + %u", 2 * sectorsize); 781 return -EINVAL; 782 } 783 784 offset = btrfs_find_space_for_alloc(cache, 0, SZ_1M, 0, 785 &max_extent_size); 786 if (offset != (SZ_128M - 768 * SZ_1K)) { 787 test_err( 788 "failed to allocate 1Mb from space cache, returned offset is: %llu", 789 offset); 790 return -EINVAL; 791 } 792 793 /* 794 * All that remains is 2 * sectorsize free space region 795 * in a bitmap. Confirm. 796 */ 797 ret = check_num_extents_and_bitmaps(cache, 1, 1); 798 if (ret) 799 return ret; 800 801 if (cache->free_space_ctl->free_space != 2 * sectorsize) { 802 test_err("cache free space is not %u", 2 * sectorsize); 803 return -EINVAL; 804 } 805 806 offset = btrfs_find_space_for_alloc(cache, 807 0, 2 * sectorsize, 0, 808 &max_extent_size); 809 if (offset != SZ_32M) { 810 test_err("failed to allocate %u, offset: %llu", 811 2 * sectorsize, offset); 812 return -EINVAL; 813 } 814 815 ret = check_cache_empty(cache); 816 if (ret) 817 return ret; 818 819 cache->fs_info->use_bitmap = orig_use_bitmap; 820 btrfs_remove_free_space_cache(cache); 821 822 return 0; 823 } 824 825 static bool bytes_index_use_bitmap(struct btrfs_free_space_ctl *ctl, 826 struct btrfs_free_space *info) 827 { 828 return true; 829 } 830 831 static int test_bytes_index(struct btrfs_block_group *cache, u32 sectorsize) 832 { 833 bool (*orig_use_bitmap)(struct btrfs_free_space_ctl *ctl, 834 struct btrfs_free_space *info); 835 struct btrfs_free_space_ctl *ctl = cache->free_space_ctl; 836 struct btrfs_free_space *entry; 837 struct rb_node *node; 838 u64 offset, max_extent_size, bytes; 839 int ret, i; 840 841 test_msg("running bytes index tests"); 842 843 /* First just validate that it does everything in order. */ 844 offset = 0; 845 for (i = 0; i < 10; i++) { 846 bytes = (i + 1) * SZ_1M; 847 ret = test_add_free_space_entry(cache, offset, bytes, 0); 848 if (ret) { 849 test_err("couldn't add extent entry %d\n", ret); 850 return ret; 851 } 852 offset += bytes + sectorsize; 853 } 854 855 for (node = rb_first_cached(&ctl->free_space_bytes), i = 9; node; 856 node = rb_next(node), i--) { 857 entry = rb_entry(node, struct btrfs_free_space, bytes_index); 858 bytes = (i + 1) * SZ_1M; 859 if (entry->bytes != bytes) { 860 test_err("invalid bytes index order, found %llu expected %llu", 861 entry->bytes, bytes); 862 return -EINVAL; 863 } 864 } 865 866 /* Now validate bitmaps do the correct thing. */ 867 btrfs_remove_free_space_cache(cache); 868 for (i = 0; i < 2; i++) { 869 offset = i * BITS_PER_BITMAP * sectorsize; 870 bytes = (i + 1) * SZ_1M; 871 ret = test_add_free_space_entry(cache, offset, bytes, 1); 872 if (ret) { 873 test_err("couldn't add bitmap entry"); 874 return ret; 875 } 876 } 877 878 for (node = rb_first_cached(&ctl->free_space_bytes), i = 1; node; 879 node = rb_next(node), i--) { 880 entry = rb_entry(node, struct btrfs_free_space, bytes_index); 881 bytes = (i + 1) * SZ_1M; 882 if (entry->bytes != bytes) { 883 test_err("invalid bytes index order, found %llu expected %llu", 884 entry->bytes, bytes); 885 return -EINVAL; 886 } 887 } 888 889 /* Now validate bitmaps with different ->max_extent_size. */ 890 btrfs_remove_free_space_cache(cache); 891 orig_use_bitmap = cache->fs_info->use_bitmap; 892 cache->fs_info->use_bitmap = bytes_index_use_bitmap; 893 894 ret = test_add_free_space_entry(cache, 0, sectorsize, 1); 895 if (ret) { 896 test_err("couldn't add bitmap entry"); 897 return ret; 898 } 899 900 offset = BITS_PER_BITMAP * sectorsize; 901 ret = test_add_free_space_entry(cache, offset, sectorsize, 1); 902 if (ret) { 903 test_err("couldn't add bitmap_entry"); 904 return ret; 905 } 906 907 /* 908 * Now set a bunch of sectorsize extents in the first entry so it's 909 * ->bytes is large. 910 */ 911 for (i = 2; i < 20; i += 2) { 912 offset = sectorsize * i; 913 ret = btrfs_add_free_space(cache, offset, sectorsize); 914 if (ret) { 915 test_err("error populating sparse bitmap %d", ret); 916 return ret; 917 } 918 } 919 920 /* 921 * Now set a contiguous extent in the second bitmap so its 922 * ->max_extent_size is larger than the first bitmaps. 923 */ 924 offset = (BITS_PER_BITMAP * sectorsize) + sectorsize; 925 ret = btrfs_add_free_space(cache, offset, sectorsize); 926 if (ret) { 927 test_err("error adding contiguous extent %d", ret); 928 return ret; 929 } 930 931 /* 932 * Since we don't set ->max_extent_size unless we search everything 933 * should be indexed on bytes. 934 */ 935 entry = rb_entry(rb_first_cached(&ctl->free_space_bytes), 936 struct btrfs_free_space, bytes_index); 937 if (entry->bytes != (10 * sectorsize)) { 938 test_err("error, wrong entry in the first slot in bytes_index"); 939 return -EINVAL; 940 } 941 942 max_extent_size = 0; 943 offset = btrfs_find_space_for_alloc(cache, cache->start, sectorsize * 3, 944 0, &max_extent_size); 945 if (offset != 0) { 946 test_err("found space to alloc even though we don't have enough space"); 947 return -EINVAL; 948 } 949 950 if (max_extent_size != (2 * sectorsize)) { 951 test_err("got the wrong max_extent size %llu expected %llu", 952 max_extent_size, (unsigned long long)(2 * sectorsize)); 953 return -EINVAL; 954 } 955 956 /* 957 * The search should have re-arranged the bytes index to use the 958 * ->max_extent_size, validate it's now what we expect it to be. 959 */ 960 entry = rb_entry(rb_first_cached(&ctl->free_space_bytes), 961 struct btrfs_free_space, bytes_index); 962 if (entry->bytes != (2 * sectorsize)) { 963 test_err("error, the bytes index wasn't recalculated properly"); 964 return -EINVAL; 965 } 966 967 /* Add another sectorsize to re-arrange the tree back to ->bytes. */ 968 offset = (BITS_PER_BITMAP * sectorsize) - sectorsize; 969 ret = btrfs_add_free_space(cache, offset, sectorsize); 970 if (ret) { 971 test_err("error adding extent to the sparse entry %d", ret); 972 return ret; 973 } 974 975 entry = rb_entry(rb_first_cached(&ctl->free_space_bytes), 976 struct btrfs_free_space, bytes_index); 977 if (entry->bytes != (11 * sectorsize)) { 978 test_err("error, wrong entry in the first slot in bytes_index"); 979 return -EINVAL; 980 } 981 982 /* 983 * Now make sure we find our correct entry after searching that will 984 * result in a re-arranging of the tree. 985 */ 986 max_extent_size = 0; 987 offset = btrfs_find_space_for_alloc(cache, cache->start, sectorsize * 2, 988 0, &max_extent_size); 989 if (offset != (BITS_PER_BITMAP * sectorsize)) { 990 test_err("error, found %llu instead of %llu for our alloc", 991 offset, 992 (unsigned long long)(BITS_PER_BITMAP * sectorsize)); 993 return -EINVAL; 994 } 995 996 cache->fs_info->use_bitmap = orig_use_bitmap; 997 btrfs_remove_free_space_cache(cache); 998 return 0; 999 } 1000 1001 int btrfs_test_free_space_cache(u32 sectorsize, u32 nodesize) 1002 { 1003 struct btrfs_fs_info *fs_info; 1004 struct btrfs_block_group *cache; 1005 struct btrfs_root *root = NULL; 1006 int ret = -ENOMEM; 1007 1008 test_msg("running btrfs free space cache tests"); 1009 fs_info = btrfs_alloc_dummy_fs_info(nodesize, sectorsize); 1010 if (!fs_info) { 1011 test_std_err(TEST_ALLOC_FS_INFO); 1012 return -ENOMEM; 1013 } 1014 1015 /* 1016 * For ppc64 (with 64k page size), bytes per bitmap might be 1017 * larger than 1G. To make bitmap test available in ppc64, 1018 * alloc dummy block group whose size cross bitmaps. 1019 */ 1020 cache = btrfs_alloc_dummy_block_group(fs_info, 1021 BITS_PER_BITMAP * sectorsize + PAGE_SIZE); 1022 if (!cache) { 1023 test_std_err(TEST_ALLOC_BLOCK_GROUP); 1024 btrfs_free_dummy_fs_info(fs_info); 1025 return 0; 1026 } 1027 1028 root = btrfs_alloc_dummy_root(fs_info); 1029 if (IS_ERR(root)) { 1030 test_std_err(TEST_ALLOC_ROOT); 1031 ret = PTR_ERR(root); 1032 goto out; 1033 } 1034 1035 root->root_key.objectid = BTRFS_EXTENT_TREE_OBJECTID; 1036 root->root_key.type = BTRFS_ROOT_ITEM_KEY; 1037 root->root_key.offset = 0; 1038 btrfs_global_root_insert(root); 1039 1040 ret = test_extents(cache); 1041 if (ret) 1042 goto out; 1043 ret = test_bitmaps(cache, sectorsize); 1044 if (ret) 1045 goto out; 1046 ret = test_bitmaps_and_extents(cache, sectorsize); 1047 if (ret) 1048 goto out; 1049 1050 ret = test_steal_space_from_bitmap_to_extent(cache, sectorsize); 1051 if (ret) 1052 goto out; 1053 ret = test_bytes_index(cache, sectorsize); 1054 out: 1055 btrfs_free_dummy_block_group(cache); 1056 btrfs_free_dummy_root(root); 1057 btrfs_free_dummy_fs_info(fs_info); 1058 return ret; 1059 } 1060