diff options
Diffstat (limited to 'fs/btrfs/tests/free-space-tests.c')
-rw-r--r-- | fs/btrfs/tests/free-space-tests.c | 76 |
1 files changed, 46 insertions, 30 deletions
diff --git a/fs/btrfs/tests/free-space-tests.c b/fs/btrfs/tests/free-space-tests.c index 0eeb8f3d6b67..3956bb2ff84c 100644 --- a/fs/btrfs/tests/free-space-tests.c +++ b/fs/btrfs/tests/free-space-tests.c | |||
@@ -22,7 +22,7 @@ | |||
22 | #include "../disk-io.h" | 22 | #include "../disk-io.h" |
23 | #include "../free-space-cache.h" | 23 | #include "../free-space-cache.h" |
24 | 24 | ||
25 | #define BITS_PER_BITMAP (PAGE_SIZE * 8) | 25 | #define BITS_PER_BITMAP (PAGE_SIZE * 8UL) |
26 | 26 | ||
27 | /* | 27 | /* |
28 | * This test just does basic sanity checking, making sure we can add an extent | 28 | * This test just does basic sanity checking, making sure we can add an extent |
@@ -99,7 +99,8 @@ static int test_extents(struct btrfs_block_group_cache *cache) | |||
99 | return 0; | 99 | return 0; |
100 | } | 100 | } |
101 | 101 | ||
102 | static int test_bitmaps(struct btrfs_block_group_cache *cache) | 102 | static int test_bitmaps(struct btrfs_block_group_cache *cache, |
103 | u32 sectorsize) | ||
103 | { | 104 | { |
104 | u64 next_bitmap_offset; | 105 | u64 next_bitmap_offset; |
105 | int ret; | 106 | int ret; |
@@ -139,7 +140,7 @@ static int test_bitmaps(struct btrfs_block_group_cache *cache) | |||
139 | * The first bitmap we have starts at offset 0 so the next one is just | 140 | * The first bitmap we have starts at offset 0 so the next one is just |
140 | * at the end of the first bitmap. | 141 | * at the end of the first bitmap. |
141 | */ | 142 | */ |
142 | next_bitmap_offset = (u64)(BITS_PER_BITMAP * 4096); | 143 | next_bitmap_offset = (u64)(BITS_PER_BITMAP * sectorsize); |
143 | 144 | ||
144 | /* Test a bit straddling two bitmaps */ | 145 | /* Test a bit straddling two bitmaps */ |
145 | ret = test_add_free_space_entry(cache, next_bitmap_offset - SZ_2M, | 146 | ret = test_add_free_space_entry(cache, next_bitmap_offset - SZ_2M, |
@@ -167,9 +168,10 @@ static int test_bitmaps(struct btrfs_block_group_cache *cache) | |||
167 | } | 168 | } |
168 | 169 | ||
169 | /* This is the high grade jackassery */ | 170 | /* This is the high grade jackassery */ |
170 | static int test_bitmaps_and_extents(struct btrfs_block_group_cache *cache) | 171 | static int test_bitmaps_and_extents(struct btrfs_block_group_cache *cache, |
172 | u32 sectorsize) | ||
171 | { | 173 | { |
172 | u64 bitmap_offset = (u64)(BITS_PER_BITMAP * 4096); | 174 | u64 bitmap_offset = (u64)(BITS_PER_BITMAP * sectorsize); |
173 | int ret; | 175 | int ret; |
174 | 176 | ||
175 | test_msg("Running bitmap and extent tests\n"); | 177 | test_msg("Running bitmap and extent tests\n"); |
@@ -401,7 +403,8 @@ static int check_cache_empty(struct btrfs_block_group_cache *cache) | |||
401 | * requests. | 403 | * requests. |
402 | */ | 404 | */ |
403 | static int | 405 | static int |
404 | test_steal_space_from_bitmap_to_extent(struct btrfs_block_group_cache *cache) | 406 | test_steal_space_from_bitmap_to_extent(struct btrfs_block_group_cache *cache, |
407 | u32 sectorsize) | ||
405 | { | 408 | { |
406 | int ret; | 409 | int ret; |
407 | u64 offset; | 410 | u64 offset; |
@@ -539,7 +542,7 @@ test_steal_space_from_bitmap_to_extent(struct btrfs_block_group_cache *cache) | |||
539 | * The goal is to test that the bitmap entry space stealing doesn't | 542 | * The goal is to test that the bitmap entry space stealing doesn't |
540 | * steal this space region. | 543 | * steal this space region. |
541 | */ | 544 | */ |
542 | ret = btrfs_add_free_space(cache, SZ_128M + SZ_16M, 4096); | 545 | ret = btrfs_add_free_space(cache, SZ_128M + SZ_16M, sectorsize); |
543 | if (ret) { | 546 | if (ret) { |
544 | test_msg("Error adding free space: %d\n", ret); | 547 | test_msg("Error adding free space: %d\n", ret); |
545 | return ret; | 548 | return ret; |
@@ -597,8 +600,8 @@ test_steal_space_from_bitmap_to_extent(struct btrfs_block_group_cache *cache) | |||
597 | return -ENOENT; | 600 | return -ENOENT; |
598 | } | 601 | } |
599 | 602 | ||
600 | if (cache->free_space_ctl->free_space != (SZ_1M + 4096)) { | 603 | if (cache->free_space_ctl->free_space != (SZ_1M + sectorsize)) { |
601 | test_msg("Cache free space is not 1Mb + 4Kb\n"); | 604 | test_msg("Cache free space is not 1Mb + %u\n", sectorsize); |
602 | return -EINVAL; | 605 | return -EINVAL; |
603 | } | 606 | } |
604 | 607 | ||
@@ -611,22 +614,25 @@ test_steal_space_from_bitmap_to_extent(struct btrfs_block_group_cache *cache) | |||
611 | return -EINVAL; | 614 | return -EINVAL; |
612 | } | 615 | } |
613 | 616 | ||
614 | /* All that remains is a 4Kb free space region in a bitmap. Confirm. */ | 617 | /* |
618 | * All that remains is a sectorsize free space region in a bitmap. | ||
619 | * Confirm. | ||
620 | */ | ||
615 | ret = check_num_extents_and_bitmaps(cache, 1, 1); | 621 | ret = check_num_extents_and_bitmaps(cache, 1, 1); |
616 | if (ret) | 622 | if (ret) |
617 | return ret; | 623 | return ret; |
618 | 624 | ||
619 | if (cache->free_space_ctl->free_space != 4096) { | 625 | if (cache->free_space_ctl->free_space != sectorsize) { |
620 | test_msg("Cache free space is not 4Kb\n"); | 626 | test_msg("Cache free space is not %u\n", sectorsize); |
621 | return -EINVAL; | 627 | return -EINVAL; |
622 | } | 628 | } |
623 | 629 | ||
624 | offset = btrfs_find_space_for_alloc(cache, | 630 | offset = btrfs_find_space_for_alloc(cache, |
625 | 0, 4096, 0, | 631 | 0, sectorsize, 0, |
626 | &max_extent_size); | 632 | &max_extent_size); |
627 | if (offset != (SZ_128M + SZ_16M)) { | 633 | if (offset != (SZ_128M + SZ_16M)) { |
628 | test_msg("Failed to allocate 4Kb from space cache, returned offset is: %llu\n", | 634 | test_msg("Failed to allocate %u, returned offset : %llu\n", |
629 | offset); | 635 | sectorsize, offset); |
630 | return -EINVAL; | 636 | return -EINVAL; |
631 | } | 637 | } |
632 | 638 | ||
@@ -733,7 +739,7 @@ test_steal_space_from_bitmap_to_extent(struct btrfs_block_group_cache *cache) | |||
733 | * The goal is to test that the bitmap entry space stealing doesn't | 739 | * The goal is to test that the bitmap entry space stealing doesn't |
734 | * steal this space region. | 740 | * steal this space region. |
735 | */ | 741 | */ |
736 | ret = btrfs_add_free_space(cache, SZ_32M, 8192); | 742 | ret = btrfs_add_free_space(cache, SZ_32M, 2 * sectorsize); |
737 | if (ret) { | 743 | if (ret) { |
738 | test_msg("Error adding free space: %d\n", ret); | 744 | test_msg("Error adding free space: %d\n", ret); |
739 | return ret; | 745 | return ret; |
@@ -757,7 +763,7 @@ test_steal_space_from_bitmap_to_extent(struct btrfs_block_group_cache *cache) | |||
757 | 763 | ||
758 | /* | 764 | /* |
759 | * Confirm that our extent entry didn't stole all free space from the | 765 | * Confirm that our extent entry didn't stole all free space from the |
760 | * bitmap, because of the small 8Kb free space region. | 766 | * bitmap, because of the small 2 * sectorsize free space region. |
761 | */ | 767 | */ |
762 | ret = check_num_extents_and_bitmaps(cache, 2, 1); | 768 | ret = check_num_extents_and_bitmaps(cache, 2, 1); |
763 | if (ret) | 769 | if (ret) |
@@ -783,8 +789,8 @@ test_steal_space_from_bitmap_to_extent(struct btrfs_block_group_cache *cache) | |||
783 | return -ENOENT; | 789 | return -ENOENT; |
784 | } | 790 | } |
785 | 791 | ||
786 | if (cache->free_space_ctl->free_space != (SZ_1M + 8192)) { | 792 | if (cache->free_space_ctl->free_space != (SZ_1M + 2 * sectorsize)) { |
787 | test_msg("Cache free space is not 1Mb + 8Kb\n"); | 793 | test_msg("Cache free space is not 1Mb + %u\n", 2 * sectorsize); |
788 | return -EINVAL; | 794 | return -EINVAL; |
789 | } | 795 | } |
790 | 796 | ||
@@ -796,21 +802,25 @@ test_steal_space_from_bitmap_to_extent(struct btrfs_block_group_cache *cache) | |||
796 | return -EINVAL; | 802 | return -EINVAL; |
797 | } | 803 | } |
798 | 804 | ||
799 | /* All that remains is a 8Kb free space region in a bitmap. Confirm. */ | 805 | /* |
806 | * All that remains is 2 * sectorsize free space region | ||
807 | * in a bitmap. Confirm. | ||
808 | */ | ||
800 | ret = check_num_extents_and_bitmaps(cache, 1, 1); | 809 | ret = check_num_extents_and_bitmaps(cache, 1, 1); |
801 | if (ret) | 810 | if (ret) |
802 | return ret; | 811 | return ret; |
803 | 812 | ||
804 | if (cache->free_space_ctl->free_space != 8192) { | 813 | if (cache->free_space_ctl->free_space != 2 * sectorsize) { |
805 | test_msg("Cache free space is not 8Kb\n"); | 814 | test_msg("Cache free space is not %u\n", 2 * sectorsize); |
806 | return -EINVAL; | 815 | return -EINVAL; |
807 | } | 816 | } |
808 | 817 | ||
809 | offset = btrfs_find_space_for_alloc(cache, | 818 | offset = btrfs_find_space_for_alloc(cache, |
810 | 0, 8192, 0, | 819 | 0, 2 * sectorsize, 0, |
811 | &max_extent_size); | 820 | &max_extent_size); |
812 | if (offset != SZ_32M) { | 821 | if (offset != SZ_32M) { |
813 | test_msg("Failed to allocate 8Kb from space cache, returned offset is: %llu\n", | 822 | test_msg("Failed to allocate %u, offset: %llu\n", |
823 | 2 * sectorsize, | ||
814 | offset); | 824 | offset); |
815 | return -EINVAL; | 825 | return -EINVAL; |
816 | } | 826 | } |
@@ -825,7 +835,7 @@ test_steal_space_from_bitmap_to_extent(struct btrfs_block_group_cache *cache) | |||
825 | return 0; | 835 | return 0; |
826 | } | 836 | } |
827 | 837 | ||
828 | int btrfs_test_free_space_cache(void) | 838 | int btrfs_test_free_space_cache(u32 sectorsize, u32 nodesize) |
829 | { | 839 | { |
830 | struct btrfs_block_group_cache *cache; | 840 | struct btrfs_block_group_cache *cache; |
831 | struct btrfs_root *root = NULL; | 841 | struct btrfs_root *root = NULL; |
@@ -833,13 +843,19 @@ int btrfs_test_free_space_cache(void) | |||
833 | 843 | ||
834 | test_msg("Running btrfs free space cache tests\n"); | 844 | test_msg("Running btrfs free space cache tests\n"); |
835 | 845 | ||
836 | cache = btrfs_alloc_dummy_block_group(1024 * 1024 * 1024); | 846 | /* |
847 | * For ppc64 (with 64k page size), bytes per bitmap might be | ||
848 | * larger than 1G. To make bitmap test available in ppc64, | ||
849 | * alloc dummy block group whose size cross bitmaps. | ||
850 | */ | ||
851 | cache = btrfs_alloc_dummy_block_group(BITS_PER_BITMAP * sectorsize | ||
852 | + PAGE_SIZE, sectorsize); | ||
837 | if (!cache) { | 853 | if (!cache) { |
838 | test_msg("Couldn't run the tests\n"); | 854 | test_msg("Couldn't run the tests\n"); |
839 | return 0; | 855 | return 0; |
840 | } | 856 | } |
841 | 857 | ||
842 | root = btrfs_alloc_dummy_root(); | 858 | root = btrfs_alloc_dummy_root(sectorsize, nodesize); |
843 | if (IS_ERR(root)) { | 859 | if (IS_ERR(root)) { |
844 | ret = PTR_ERR(root); | 860 | ret = PTR_ERR(root); |
845 | goto out; | 861 | goto out; |
@@ -855,14 +871,14 @@ int btrfs_test_free_space_cache(void) | |||
855 | ret = test_extents(cache); | 871 | ret = test_extents(cache); |
856 | if (ret) | 872 | if (ret) |
857 | goto out; | 873 | goto out; |
858 | ret = test_bitmaps(cache); | 874 | ret = test_bitmaps(cache, sectorsize); |
859 | if (ret) | 875 | if (ret) |
860 | goto out; | 876 | goto out; |
861 | ret = test_bitmaps_and_extents(cache); | 877 | ret = test_bitmaps_and_extents(cache, sectorsize); |
862 | if (ret) | 878 | if (ret) |
863 | goto out; | 879 | goto out; |
864 | 880 | ||
865 | ret = test_steal_space_from_bitmap_to_extent(cache); | 881 | ret = test_steal_space_from_bitmap_to_extent(cache, sectorsize); |
866 | out: | 882 | out: |
867 | btrfs_free_dummy_block_group(cache); | 883 | btrfs_free_dummy_block_group(cache); |
868 | btrfs_free_dummy_root(root); | 884 | btrfs_free_dummy_root(root); |