Lines Matching +full:free +full:- +full:running

1 // SPDX-License-Identifier: GPL-2.0
7 #include "btrfs-tests.h"
9 #include "../disk-io.h"
10 #include "../free-space-cache.h"
11 #include "../block-group.h"
24 test_msg("running extent only tests"); in test_extents()
41 return -1; in test_extents()
71 return -1; in test_extents()
76 return -1; in test_extents()
81 return -1; in test_extents()
95 test_msg("running bitmap only tests"); in test_bitmaps()
111 return -1; in test_bitmaps()
133 ret = test_add_free_space_entry(cache, next_bitmap_offset - SZ_2M, in test_bitmaps()
141 ret = btrfs_remove_free_space(cache, next_bitmap_offset - SZ_1M, SZ_2M); in test_bitmaps()
147 if (test_check_exists(cache, next_bitmap_offset - SZ_1M, SZ_2M)) { in test_bitmaps()
149 return -1; in test_bitmaps()
164 test_msg("running bitmap and extent tests"); in test_bitmaps_and_extents()
168 * bitmap, but the free space completely in the extent and then in test_bitmaps_and_extents()
191 return -1; in test_bitmaps_and_extents()
197 test_err("couldn't re-add extent entry %d", ret); in test_bitmaps_and_extents()
209 return -1; in test_bitmaps_and_extents()
230 return -1; in test_bitmaps_and_extents()
256 return -1; in test_bitmaps_and_extents()
276 ret = test_add_free_space_entry(cache, bitmap_offset - SZ_1M, in test_bitmaps_and_extents()
285 test_err("failed to free our space %d", ret); in test_bitmaps_and_extents()
291 return -1; in test_bitmaps_and_extents()
297 * This blew up before, we have part of the free space in a bitmap and in test_bitmaps_and_extents()
299 * to return -EAGAIN back from btrfs_remove_extent, make sure this in test_bitmaps_and_extents()
328 return ctl->free_extents > 0; in test_use_bitmap()
337 if (cache->free_space_ctl->free_extents != num_extents) { in check_num_extents_and_bitmaps()
340 cache->free_space_ctl->free_extents, num_extents); in check_num_extents_and_bitmaps()
341 return -EINVAL; in check_num_extents_and_bitmaps()
343 if (cache->free_space_ctl->total_bitmaps != num_bitmaps) { in check_num_extents_and_bitmaps()
346 cache->free_space_ctl->total_bitmaps, num_bitmaps); in check_num_extents_and_bitmaps()
347 return -EINVAL; in check_num_extents_and_bitmaps()
359 * Now lets confirm that there's absolutely no free space left to in check_cache_empty()
362 if (cache->free_space_ctl->free_space != 0) { in check_cache_empty()
363 test_err("cache free space is not 0"); in check_cache_empty()
364 return -EINVAL; in check_cache_empty()
373 return -EINVAL; in check_cache_empty()
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.
391 * from extent entries, both for clustered and non-clustered allocation
406 test_msg("running space stealing from bitmap to extent tests"); in test_steal_space_from_bitmap_to_extent()
412 * removing free space to reach into this state, but to get there in test_steal_space_from_bitmap_to_extent()
413 * we need to reach a point where marking new free space doesn't in test_steal_space_from_bitmap_to_extent()
415 * with existing extent entries - the space ends up being marked in test_steal_space_from_bitmap_to_extent()
416 * in an existing bitmap that covers the new free space range. in test_steal_space_from_bitmap_to_extent()
419 * cache->free_space_ctl->extents_thresh, which currently is in test_steal_space_from_bitmap_to_extent()
426 orig_free_space_ops = cache->free_space_ctl->op; in test_steal_space_from_bitmap_to_extent()
427 cache->free_space_ctl->op = &test_free_space_ops; in test_steal_space_from_bitmap_to_extent()
430 * Extent entry covering free space range [128Mb - 256Kb, 128Mb - 128Kb[ in test_steal_space_from_bitmap_to_extent()
432 ret = test_add_free_space_entry(cache, SZ_128M - SZ_256K, SZ_128K, 0); in test_steal_space_from_bitmap_to_extent()
438 /* Bitmap entry covering free space range [128Mb + 512Kb, 256Mb[ */ in test_steal_space_from_bitmap_to_extent()
440 SZ_128M - SZ_512K, 1); in test_steal_space_from_bitmap_to_extent()
451 * Now make only the first 256Kb of the bitmap marked as free, so that in test_steal_space_from_bitmap_to_extent()
452 * we end up with only the following ranges marked as free space: in test_steal_space_from_bitmap_to_extent()
454 * [128Mb - 256Kb, 128Mb - 128Kb[ in test_steal_space_from_bitmap_to_extent()
459 SZ_128M - 768 * SZ_1K); in test_steal_space_from_bitmap_to_extent()
461 test_err("failed to free part of bitmap space %d", ret); in test_steal_space_from_bitmap_to_extent()
465 /* Confirm that only those 2 ranges are marked as free. */ in test_steal_space_from_bitmap_to_extent()
466 if (!test_check_exists(cache, SZ_128M - SZ_256K, SZ_128K)) { in test_steal_space_from_bitmap_to_extent()
467 test_err("free space range missing"); in test_steal_space_from_bitmap_to_extent()
468 return -ENOENT; in test_steal_space_from_bitmap_to_extent()
471 test_err("free space range missing"); in test_steal_space_from_bitmap_to_extent()
472 return -ENOENT; in test_steal_space_from_bitmap_to_extent()
477 * as free anymore. in test_steal_space_from_bitmap_to_extent()
480 SZ_128M - 768 * SZ_1K)) { in test_steal_space_from_bitmap_to_extent()
482 return -EINVAL; in test_steal_space_from_bitmap_to_extent()
487 * covered by the bitmap, isn't marked as free. in test_steal_space_from_bitmap_to_extent()
490 test_err("invalid bitmap region marked as free"); in test_steal_space_from_bitmap_to_extent()
491 return -EINVAL; in test_steal_space_from_bitmap_to_extent()
496 * by the bitmap too, isn't marked as free either. in test_steal_space_from_bitmap_to_extent()
499 test_err("invalid bitmap region marked as free"); in test_steal_space_from_bitmap_to_extent()
500 return -EINVAL; in test_steal_space_from_bitmap_to_extent()
504 * Now lets mark the region [128Mb, 128Mb + 512Kb[ as free too. But, in test_steal_space_from_bitmap_to_extent()
505 * lets make sure the free space cache marks it as free in the bitmap, in test_steal_space_from_bitmap_to_extent()
510 test_err("error adding free space: %d", ret); in test_steal_space_from_bitmap_to_extent()
513 /* Confirm the region is marked as free. */ in test_steal_space_from_bitmap_to_extent()
515 test_err("bitmap region not marked as free"); in test_steal_space_from_bitmap_to_extent()
516 return -ENOENT; in test_steal_space_from_bitmap_to_extent()
521 * the cache after adding that free space region. in test_steal_space_from_bitmap_to_extent()
528 * Now lets add a small free space region to the right of the previous in test_steal_space_from_bitmap_to_extent()
535 test_err("error adding free space: %d", ret); in test_steal_space_from_bitmap_to_extent()
541 * the cache after adding that free space region. in test_steal_space_from_bitmap_to_extent()
548 * Now mark the region [128Mb - 128Kb, 128Mb[ as free too. This will in test_steal_space_from_bitmap_to_extent()
550 * the free space [128Mb - 256Kb, 128Mb - 128Kb[. in test_steal_space_from_bitmap_to_extent()
552 ret = btrfs_add_free_space(cache, SZ_128M - SZ_128K, SZ_128K); in test_steal_space_from_bitmap_to_extent()
554 test_err("error adding free space: %d", ret); in test_steal_space_from_bitmap_to_extent()
557 /* Confirm the region is marked as free. */ in test_steal_space_from_bitmap_to_extent()
558 if (!test_check_exists(cache, SZ_128M - SZ_128K, SZ_128K)) { in test_steal_space_from_bitmap_to_extent()
559 test_err("extent region not marked as free"); in test_steal_space_from_bitmap_to_extent()
560 return -ENOENT; in test_steal_space_from_bitmap_to_extent()
564 * Confirm that our extent entry didn't stole all free space from the in test_steal_space_from_bitmap_to_extent()
565 * bitmap, because of the small 4Kb free space region. in test_steal_space_from_bitmap_to_extent()
572 * So now we have the range [128Mb - 256Kb, 128Mb + 768Kb[ as free in test_steal_space_from_bitmap_to_extent()
573 * space. Without stealing bitmap free space into extent entry space, in test_steal_space_from_bitmap_to_extent()
574 * we would have all this free space represented by 2 entries in the in test_steal_space_from_bitmap_to_extent()
577 * extent entry covering range: [128Mb - 256Kb, 128Mb[ in test_steal_space_from_bitmap_to_extent()
580 * Attempting to allocate the whole free space (1Mb) would fail, because in test_steal_space_from_bitmap_to_extent()
582 * With the bitmap free space stealing, we get a single extent entry in test_steal_space_from_bitmap_to_extent()
583 * that represents the 1Mb free space, and therefore we're able to in test_steal_space_from_bitmap_to_extent()
584 * allocate the whole free space at once. in test_steal_space_from_bitmap_to_extent()
586 if (!test_check_exists(cache, SZ_128M - SZ_256K, SZ_1M)) { in test_steal_space_from_bitmap_to_extent()
587 test_err("expected region not marked as free"); in test_steal_space_from_bitmap_to_extent()
588 return -ENOENT; in test_steal_space_from_bitmap_to_extent()
591 if (cache->free_space_ctl->free_space != (SZ_1M + sectorsize)) { in test_steal_space_from_bitmap_to_extent()
592 test_err("cache free space is not 1Mb + %u", sectorsize); in test_steal_space_from_bitmap_to_extent()
593 return -EINVAL; in test_steal_space_from_bitmap_to_extent()
599 if (offset != (SZ_128M - SZ_256K)) { in test_steal_space_from_bitmap_to_extent()
603 return -EINVAL; in test_steal_space_from_bitmap_to_extent()
607 * All that remains is a sectorsize free space region in a bitmap. in test_steal_space_from_bitmap_to_extent()
614 if (cache->free_space_ctl->free_space != sectorsize) { in test_steal_space_from_bitmap_to_extent()
615 test_err("cache free space is not %u", sectorsize); in test_steal_space_from_bitmap_to_extent()
616 return -EINVAL; in test_steal_space_from_bitmap_to_extent()
625 return -EINVAL; in test_steal_space_from_bitmap_to_extent()
641 * Extent entry covering free space range [128Mb + 128Kb, 128Mb + 256Kb[ in test_steal_space_from_bitmap_to_extent()
649 /* Bitmap entry covering free space range [0, 128Mb - 512Kb[ */ in test_steal_space_from_bitmap_to_extent()
650 ret = test_add_free_space_entry(cache, 0, SZ_128M - SZ_512K, 1); in test_steal_space_from_bitmap_to_extent()
661 * Now make only the last 256Kb of the bitmap marked as free, so that in test_steal_space_from_bitmap_to_extent()
662 * we end up with only the following ranges marked as free space: in test_steal_space_from_bitmap_to_extent()
665 * [128Mb - 768Kb, 128Mb - 512Kb[ in test_steal_space_from_bitmap_to_extent()
667 ret = btrfs_remove_free_space(cache, 0, SZ_128M - 768 * SZ_1K); in test_steal_space_from_bitmap_to_extent()
669 test_err("failed to free part of bitmap space %d", ret); in test_steal_space_from_bitmap_to_extent()
673 /* Confirm that only those 2 ranges are marked as free. */ in test_steal_space_from_bitmap_to_extent()
675 test_err("free space range missing"); in test_steal_space_from_bitmap_to_extent()
676 return -ENOENT; in test_steal_space_from_bitmap_to_extent()
678 if (!test_check_exists(cache, SZ_128M - 768 * SZ_1K, SZ_256K)) { in test_steal_space_from_bitmap_to_extent()
679 test_err("free space range missing"); in test_steal_space_from_bitmap_to_extent()
680 return -ENOENT; in test_steal_space_from_bitmap_to_extent()
684 * Confirm that the bitmap range [0, 128Mb - 768Kb[ isn't marked in test_steal_space_from_bitmap_to_extent()
685 * as free anymore. in test_steal_space_from_bitmap_to_extent()
687 if (test_check_exists(cache, 0, SZ_128M - 768 * SZ_1K)) { in test_steal_space_from_bitmap_to_extent()
689 return -EINVAL; in test_steal_space_from_bitmap_to_extent()
693 * Confirm that the region [128Mb - 512Kb, 128Mb[, which is in test_steal_space_from_bitmap_to_extent()
694 * covered by the bitmap, isn't marked as free. in test_steal_space_from_bitmap_to_extent()
696 if (test_check_exists(cache, SZ_128M - SZ_512K, SZ_512K)) { in test_steal_space_from_bitmap_to_extent()
697 test_err("invalid bitmap region marked as free"); in test_steal_space_from_bitmap_to_extent()
698 return -EINVAL; in test_steal_space_from_bitmap_to_extent()
702 * Now lets mark the region [128Mb - 512Kb, 128Mb[ as free too. But, in test_steal_space_from_bitmap_to_extent()
703 * lets make sure the free space cache marks it as free in the bitmap, in test_steal_space_from_bitmap_to_extent()
706 ret = btrfs_add_free_space(cache, SZ_128M - SZ_512K, SZ_512K); in test_steal_space_from_bitmap_to_extent()
708 test_err("error adding free space: %d", ret); in test_steal_space_from_bitmap_to_extent()
711 /* Confirm the region is marked as free. */ in test_steal_space_from_bitmap_to_extent()
712 if (!test_check_exists(cache, SZ_128M - SZ_512K, SZ_512K)) { in test_steal_space_from_bitmap_to_extent()
713 test_err("bitmap region not marked as free"); in test_steal_space_from_bitmap_to_extent()
714 return -ENOENT; in test_steal_space_from_bitmap_to_extent()
719 * the cache after adding that free space region. in test_steal_space_from_bitmap_to_extent()
726 * Now lets add a small free space region to the left of the previous in test_steal_space_from_bitmap_to_extent()
733 test_err("error adding free space: %d", ret); in test_steal_space_from_bitmap_to_extent()
738 * Now mark the region [128Mb, 128Mb + 128Kb[ as free too. This will in test_steal_space_from_bitmap_to_extent()
740 * the free space [128Mb + 128Kb, 128Mb + 256Kb[. in test_steal_space_from_bitmap_to_extent()
744 test_err("error adding free space: %d", ret); in test_steal_space_from_bitmap_to_extent()
747 /* Confirm the region is marked as free. */ in test_steal_space_from_bitmap_to_extent()
749 test_err("extent region not marked as free"); in test_steal_space_from_bitmap_to_extent()
750 return -ENOENT; in test_steal_space_from_bitmap_to_extent()
754 * Confirm that our extent entry didn't stole all free space from the in test_steal_space_from_bitmap_to_extent()
755 * bitmap, because of the small 2 * sectorsize free space region. in test_steal_space_from_bitmap_to_extent()
762 * So now we have the range [128Mb - 768Kb, 128Mb + 256Kb[ as free in test_steal_space_from_bitmap_to_extent()
763 * space. Without stealing bitmap free space into extent entry space, in test_steal_space_from_bitmap_to_extent()
764 * we would have all this free space represented by 2 entries in the in test_steal_space_from_bitmap_to_extent()
768 * bitmap entry covering range: [128Mb - 768Kb, 128Mb[ in test_steal_space_from_bitmap_to_extent()
770 * Attempting to allocate the whole free space (1Mb) would fail, because in test_steal_space_from_bitmap_to_extent()
772 * With the bitmap free space stealing, we get a single extent entry in test_steal_space_from_bitmap_to_extent()
773 * that represents the 1Mb free space, and therefore we're able to in test_steal_space_from_bitmap_to_extent()
774 * allocate the whole free space at once. in test_steal_space_from_bitmap_to_extent()
776 if (!test_check_exists(cache, SZ_128M - 768 * SZ_1K, SZ_1M)) { in test_steal_space_from_bitmap_to_extent()
777 test_err("expected region not marked as free"); in test_steal_space_from_bitmap_to_extent()
778 return -ENOENT; in test_steal_space_from_bitmap_to_extent()
781 if (cache->free_space_ctl->free_space != (SZ_1M + 2 * sectorsize)) { in test_steal_space_from_bitmap_to_extent()
782 test_err("cache free space is not 1Mb + %u", 2 * sectorsize); in test_steal_space_from_bitmap_to_extent()
783 return -EINVAL; in test_steal_space_from_bitmap_to_extent()
788 if (offset != (SZ_128M - 768 * SZ_1K)) { in test_steal_space_from_bitmap_to_extent()
792 return -EINVAL; in test_steal_space_from_bitmap_to_extent()
796 * All that remains is 2 * sectorsize free space region in test_steal_space_from_bitmap_to_extent()
803 if (cache->free_space_ctl->free_space != 2 * sectorsize) { in test_steal_space_from_bitmap_to_extent()
804 test_err("cache free space is not %u", 2 * sectorsize); in test_steal_space_from_bitmap_to_extent()
805 return -EINVAL; in test_steal_space_from_bitmap_to_extent()
814 return -EINVAL; in test_steal_space_from_bitmap_to_extent()
821 cache->free_space_ctl->op = orig_free_space_ops; in test_steal_space_from_bitmap_to_extent()
839 struct btrfs_free_space_ctl *ctl = cache->free_space_ctl; in test_bytes_index()
845 test_msg("running bytes index tests"); in test_bytes_index()
859 for (node = rb_first_cached(&ctl->free_space_bytes), i = 9; node; in test_bytes_index()
860 node = rb_next(node), i--) { in test_bytes_index()
863 if (entry->bytes != bytes) { in test_bytes_index()
865 entry->bytes, bytes); in test_bytes_index()
866 return -EINVAL; in test_bytes_index()
882 for (node = rb_first_cached(&ctl->free_space_bytes), i = 1; node; in test_bytes_index()
883 node = rb_next(node), i--) { in test_bytes_index()
886 if (entry->bytes != bytes) { in test_bytes_index()
888 entry->bytes, bytes); in test_bytes_index()
889 return -EINVAL; in test_bytes_index()
893 /* Now validate bitmaps with different ->max_extent_size. */ in test_bytes_index()
895 orig_free_space_ops = cache->free_space_ctl->op; in test_bytes_index()
896 cache->free_space_ctl->op = &test_free_space_ops; in test_bytes_index()
913 * ->bytes is large. in test_bytes_index()
926 * ->max_extent_size is larger than the first bitmaps. in test_bytes_index()
936 * Since we don't set ->max_extent_size unless we search everything in test_bytes_index()
939 entry = rb_entry(rb_first_cached(&ctl->free_space_bytes), in test_bytes_index()
941 if (entry->bytes != (10 * sectorsize)) { in test_bytes_index()
943 return -EINVAL; in test_bytes_index()
947 offset = btrfs_find_space_for_alloc(cache, cache->start, sectorsize * 3, in test_bytes_index()
951 return -EINVAL; in test_bytes_index()
957 return -EINVAL; in test_bytes_index()
961 * The search should have re-arranged the bytes index to use the in test_bytes_index()
962 * ->max_extent_size, validate it's now what we expect it to be. in test_bytes_index()
964 entry = rb_entry(rb_first_cached(&ctl->free_space_bytes), in test_bytes_index()
966 if (entry->bytes != (2 * sectorsize)) { in test_bytes_index()
968 return -EINVAL; in test_bytes_index()
971 /* Add another sectorsize to re-arrange the tree back to ->bytes. */ in test_bytes_index()
972 offset = (BITS_PER_BITMAP * sectorsize) - sectorsize; in test_bytes_index()
979 entry = rb_entry(rb_first_cached(&ctl->free_space_bytes), in test_bytes_index()
981 if (entry->bytes != (11 * sectorsize)) { in test_bytes_index()
983 return -EINVAL; in test_bytes_index()
988 * result in a re-arranging of the tree. in test_bytes_index()
991 offset = btrfs_find_space_for_alloc(cache, cache->start, sectorsize * 2, in test_bytes_index()
997 return -EINVAL; in test_bytes_index()
1000 cache->free_space_ctl->op = orig_free_space_ops; in test_bytes_index()
1010 int ret = -ENOMEM; in btrfs_test_free_space_cache()
1012 test_msg("running btrfs free space cache tests"); in btrfs_test_free_space_cache()
1016 return -ENOMEM; in btrfs_test_free_space_cache()
1039 root->root_key.objectid = BTRFS_EXTENT_TREE_OBJECTID; in btrfs_test_free_space_cache()
1040 root->root_key.type = BTRFS_ROOT_ITEM_KEY; in btrfs_test_free_space_cache()
1041 root->root_key.offset = 0; in btrfs_test_free_space_cache()