1c1d7c514SDavid Sterba // SPDX-License-Identifier: GPL-2.0 2dc11dd5dSJosef Bacik /* 3dc11dd5dSJosef Bacik * Copyright (C) 2013 Fusion IO. All rights reserved. 4dc11dd5dSJosef Bacik */ 5dc11dd5dSJosef Bacik 6dc11dd5dSJosef Bacik #include <linux/slab.h> 7dc11dd5dSJosef Bacik #include "btrfs-tests.h" 8dc11dd5dSJosef Bacik #include "../ctree.h" 9d0bd4560SJosef Bacik #include "../disk-io.h" 10dc11dd5dSJosef Bacik #include "../free-space-cache.h" 11*aac0023cSJosef Bacik #include "../block-group.h" 12dc11dd5dSJosef Bacik 130ef6447aSFeifei Xu #define BITS_PER_BITMAP (PAGE_SIZE * 8UL) 14dc11dd5dSJosef Bacik 15dc11dd5dSJosef Bacik /* 1601327610SNicholas D Steeves * This test just does basic sanity checking, making sure we can add an extent 17dc11dd5dSJosef Bacik * entry and remove space from either end and the middle, and make sure we can 18dc11dd5dSJosef Bacik * remove space that covers adjacent extent entries. 19dc11dd5dSJosef Bacik */ 20dc11dd5dSJosef Bacik static int test_extents(struct btrfs_block_group_cache *cache) 21dc11dd5dSJosef Bacik { 22dc11dd5dSJosef Bacik int ret = 0; 23dc11dd5dSJosef Bacik 24315b76b4SDavid Sterba test_msg("running extent only tests"); 25dc11dd5dSJosef Bacik 26dc11dd5dSJosef Bacik /* First just make sure we can remove an entire entry */ 27ee22184bSByongho Lee ret = btrfs_add_free_space(cache, 0, SZ_4M); 28dc11dd5dSJosef Bacik if (ret) { 293c7251f2SDavid Sterba test_err("error adding initial extents %d", ret); 30dc11dd5dSJosef Bacik return ret; 31dc11dd5dSJosef Bacik } 32dc11dd5dSJosef Bacik 33ee22184bSByongho Lee ret = btrfs_remove_free_space(cache, 0, SZ_4M); 34dc11dd5dSJosef Bacik if (ret) { 353c7251f2SDavid Sterba test_err("error removing extent %d", ret); 36dc11dd5dSJosef Bacik return ret; 37dc11dd5dSJosef Bacik } 38dc11dd5dSJosef Bacik 39ee22184bSByongho Lee if (test_check_exists(cache, 0, SZ_4M)) { 403c7251f2SDavid Sterba test_err("full remove left some lingering space"); 41dc11dd5dSJosef Bacik return -1; 42dc11dd5dSJosef Bacik } 43dc11dd5dSJosef Bacik 44dc11dd5dSJosef Bacik /* Ok edge and middle cases now */ 45ee22184bSByongho Lee ret = btrfs_add_free_space(cache, 0, SZ_4M); 46dc11dd5dSJosef Bacik if (ret) { 473c7251f2SDavid Sterba test_err("error adding half extent %d", ret); 48dc11dd5dSJosef Bacik return ret; 49dc11dd5dSJosef Bacik } 50dc11dd5dSJosef Bacik 51ee22184bSByongho Lee ret = btrfs_remove_free_space(cache, 3 * SZ_1M, SZ_1M); 52dc11dd5dSJosef Bacik if (ret) { 533c7251f2SDavid Sterba test_err("error removing tail end %d", ret); 54dc11dd5dSJosef Bacik return ret; 55dc11dd5dSJosef Bacik } 56dc11dd5dSJosef Bacik 57ee22184bSByongho Lee ret = btrfs_remove_free_space(cache, 0, SZ_1M); 58dc11dd5dSJosef Bacik if (ret) { 593c7251f2SDavid Sterba test_err("error removing front end %d", ret); 60dc11dd5dSJosef Bacik return ret; 61dc11dd5dSJosef Bacik } 62dc11dd5dSJosef Bacik 63ee22184bSByongho Lee ret = btrfs_remove_free_space(cache, SZ_2M, 4096); 64dc11dd5dSJosef Bacik if (ret) { 653c7251f2SDavid Sterba test_err("error removing middle piece %d", ret); 66dc11dd5dSJosef Bacik return ret; 67dc11dd5dSJosef Bacik } 68dc11dd5dSJosef Bacik 69ee22184bSByongho Lee if (test_check_exists(cache, 0, SZ_1M)) { 703c7251f2SDavid Sterba test_err("still have space at the front"); 71dc11dd5dSJosef Bacik return -1; 72dc11dd5dSJosef Bacik } 73dc11dd5dSJosef Bacik 74ee22184bSByongho Lee if (test_check_exists(cache, SZ_2M, 4096)) { 753c7251f2SDavid Sterba test_err("still have space in the middle"); 76dc11dd5dSJosef Bacik return -1; 77dc11dd5dSJosef Bacik } 78dc11dd5dSJosef Bacik 79ee22184bSByongho Lee if (test_check_exists(cache, 3 * SZ_1M, SZ_1M)) { 803c7251f2SDavid Sterba test_err("still have space at the end"); 81dc11dd5dSJosef Bacik return -1; 82dc11dd5dSJosef Bacik } 83dc11dd5dSJosef Bacik 84dc11dd5dSJosef Bacik /* Cleanup */ 85dc11dd5dSJosef Bacik __btrfs_remove_free_space_cache(cache->free_space_ctl); 86dc11dd5dSJosef Bacik 87dc11dd5dSJosef Bacik return 0; 88dc11dd5dSJosef Bacik } 89dc11dd5dSJosef Bacik 90b9ef22deSFeifei Xu static int test_bitmaps(struct btrfs_block_group_cache *cache, 91b9ef22deSFeifei Xu u32 sectorsize) 92dc11dd5dSJosef Bacik { 93dc11dd5dSJosef Bacik u64 next_bitmap_offset; 94dc11dd5dSJosef Bacik int ret; 95dc11dd5dSJosef Bacik 96315b76b4SDavid Sterba test_msg("running bitmap only tests"); 97dc11dd5dSJosef Bacik 98ee22184bSByongho Lee ret = test_add_free_space_entry(cache, 0, SZ_4M, 1); 99dc11dd5dSJosef Bacik if (ret) { 1003c7251f2SDavid Sterba test_err("couldn't create a bitmap entry %d", ret); 101dc11dd5dSJosef Bacik return ret; 102dc11dd5dSJosef Bacik } 103dc11dd5dSJosef Bacik 104ee22184bSByongho Lee ret = btrfs_remove_free_space(cache, 0, SZ_4M); 105dc11dd5dSJosef Bacik if (ret) { 1063c7251f2SDavid Sterba test_err("error removing bitmap full range %d", ret); 107dc11dd5dSJosef Bacik return ret; 108dc11dd5dSJosef Bacik } 109dc11dd5dSJosef Bacik 110ee22184bSByongho Lee if (test_check_exists(cache, 0, SZ_4M)) { 1113c7251f2SDavid Sterba test_err("left some space in bitmap"); 112dc11dd5dSJosef Bacik return -1; 113dc11dd5dSJosef Bacik } 114dc11dd5dSJosef Bacik 115ee22184bSByongho Lee ret = test_add_free_space_entry(cache, 0, SZ_4M, 1); 116dc11dd5dSJosef Bacik if (ret) { 1173c7251f2SDavid Sterba test_err("couldn't add to our bitmap entry %d", ret); 118dc11dd5dSJosef Bacik return ret; 119dc11dd5dSJosef Bacik } 120dc11dd5dSJosef Bacik 121ee22184bSByongho Lee ret = btrfs_remove_free_space(cache, SZ_1M, SZ_2M); 122dc11dd5dSJosef Bacik if (ret) { 1233c7251f2SDavid Sterba test_err("couldn't remove middle chunk %d", ret); 124dc11dd5dSJosef Bacik return ret; 125dc11dd5dSJosef Bacik } 126dc11dd5dSJosef Bacik 127dc11dd5dSJosef Bacik /* 128dc11dd5dSJosef Bacik * The first bitmap we have starts at offset 0 so the next one is just 129dc11dd5dSJosef Bacik * at the end of the first bitmap. 130dc11dd5dSJosef Bacik */ 131b9ef22deSFeifei Xu next_bitmap_offset = (u64)(BITS_PER_BITMAP * sectorsize); 132dc11dd5dSJosef Bacik 133dc11dd5dSJosef Bacik /* Test a bit straddling two bitmaps */ 134ee22184bSByongho Lee ret = test_add_free_space_entry(cache, next_bitmap_offset - SZ_2M, 135ee22184bSByongho Lee SZ_4M, 1); 136dc11dd5dSJosef Bacik if (ret) { 1373c7251f2SDavid Sterba test_err("couldn't add space that straddles two bitmaps %d", 138dc11dd5dSJosef Bacik ret); 139dc11dd5dSJosef Bacik return ret; 140dc11dd5dSJosef Bacik } 141dc11dd5dSJosef Bacik 142ee22184bSByongho Lee ret = btrfs_remove_free_space(cache, next_bitmap_offset - SZ_1M, SZ_2M); 143dc11dd5dSJosef Bacik if (ret) { 1443c7251f2SDavid Sterba test_err("couldn't remove overlapping space %d", ret); 145dc11dd5dSJosef Bacik return ret; 146dc11dd5dSJosef Bacik } 147dc11dd5dSJosef Bacik 148ee22184bSByongho Lee if (test_check_exists(cache, next_bitmap_offset - SZ_1M, SZ_2M)) { 1493c7251f2SDavid Sterba test_err("left some space when removing overlapping"); 150dc11dd5dSJosef Bacik return -1; 151dc11dd5dSJosef Bacik } 152dc11dd5dSJosef Bacik 153dc11dd5dSJosef Bacik __btrfs_remove_free_space_cache(cache->free_space_ctl); 154dc11dd5dSJosef Bacik 155dc11dd5dSJosef Bacik return 0; 156dc11dd5dSJosef Bacik } 157dc11dd5dSJosef Bacik 158dc11dd5dSJosef Bacik /* This is the high grade jackassery */ 159b9ef22deSFeifei Xu static int test_bitmaps_and_extents(struct btrfs_block_group_cache *cache, 160b9ef22deSFeifei Xu u32 sectorsize) 161dc11dd5dSJosef Bacik { 162b9ef22deSFeifei Xu u64 bitmap_offset = (u64)(BITS_PER_BITMAP * sectorsize); 163dc11dd5dSJosef Bacik int ret; 164dc11dd5dSJosef Bacik 165315b76b4SDavid Sterba test_msg("running bitmap and extent tests"); 166dc11dd5dSJosef Bacik 167dc11dd5dSJosef Bacik /* 168dc11dd5dSJosef Bacik * First let's do something simple, an extent at the same offset as the 169dc11dd5dSJosef Bacik * bitmap, but the free space completely in the extent and then 170dc11dd5dSJosef Bacik * completely in the bitmap. 171dc11dd5dSJosef Bacik */ 172ee22184bSByongho Lee ret = test_add_free_space_entry(cache, SZ_4M, SZ_1M, 1); 173dc11dd5dSJosef Bacik if (ret) { 1743c7251f2SDavid Sterba test_err("couldn't create bitmap entry %d", ret); 175dc11dd5dSJosef Bacik return ret; 176dc11dd5dSJosef Bacik } 177dc11dd5dSJosef Bacik 178ee22184bSByongho Lee ret = test_add_free_space_entry(cache, 0, SZ_1M, 0); 179dc11dd5dSJosef Bacik if (ret) { 1803c7251f2SDavid Sterba test_err("couldn't add extent entry %d", ret); 181dc11dd5dSJosef Bacik return ret; 182dc11dd5dSJosef Bacik } 183dc11dd5dSJosef Bacik 184ee22184bSByongho Lee ret = btrfs_remove_free_space(cache, 0, SZ_1M); 185dc11dd5dSJosef Bacik if (ret) { 1863c7251f2SDavid Sterba test_err("couldn't remove extent entry %d", ret); 187dc11dd5dSJosef Bacik return ret; 188dc11dd5dSJosef Bacik } 189dc11dd5dSJosef Bacik 190ee22184bSByongho Lee if (test_check_exists(cache, 0, SZ_1M)) { 1913c7251f2SDavid Sterba test_err("left remnants after our remove"); 192dc11dd5dSJosef Bacik return -1; 193dc11dd5dSJosef Bacik } 194dc11dd5dSJosef Bacik 195dc11dd5dSJosef Bacik /* Now to add back the extent entry and remove from the bitmap */ 196ee22184bSByongho Lee ret = test_add_free_space_entry(cache, 0, SZ_1M, 0); 197dc11dd5dSJosef Bacik if (ret) { 1983c7251f2SDavid Sterba test_err("couldn't re-add extent entry %d", ret); 199dc11dd5dSJosef Bacik return ret; 200dc11dd5dSJosef Bacik } 201dc11dd5dSJosef Bacik 202ee22184bSByongho Lee ret = btrfs_remove_free_space(cache, SZ_4M, SZ_1M); 203dc11dd5dSJosef Bacik if (ret) { 2043c7251f2SDavid Sterba test_err("couldn't remove from bitmap %d", ret); 205dc11dd5dSJosef Bacik return ret; 206dc11dd5dSJosef Bacik } 207dc11dd5dSJosef Bacik 208ee22184bSByongho Lee if (test_check_exists(cache, SZ_4M, SZ_1M)) { 2093c7251f2SDavid Sterba test_err("left remnants in the bitmap"); 210dc11dd5dSJosef Bacik return -1; 211dc11dd5dSJosef Bacik } 212dc11dd5dSJosef Bacik 213dc11dd5dSJosef Bacik /* 214dc11dd5dSJosef Bacik * Ok so a little more evil, extent entry and bitmap at the same offset, 215dc11dd5dSJosef Bacik * removing an overlapping chunk. 216dc11dd5dSJosef Bacik */ 217ee22184bSByongho Lee ret = test_add_free_space_entry(cache, SZ_1M, SZ_4M, 1); 218dc11dd5dSJosef Bacik if (ret) { 2193c7251f2SDavid Sterba test_err("couldn't add to a bitmap %d", ret); 220dc11dd5dSJosef Bacik return ret; 221dc11dd5dSJosef Bacik } 222dc11dd5dSJosef Bacik 223ee22184bSByongho Lee ret = btrfs_remove_free_space(cache, SZ_512K, 3 * SZ_1M); 224dc11dd5dSJosef Bacik if (ret) { 2253c7251f2SDavid Sterba test_err("couldn't remove overlapping space %d", ret); 226dc11dd5dSJosef Bacik return ret; 227dc11dd5dSJosef Bacik } 228dc11dd5dSJosef Bacik 229ee22184bSByongho Lee if (test_check_exists(cache, SZ_512K, 3 * SZ_1M)) { 2303c7251f2SDavid Sterba test_err("left over pieces after removing overlapping"); 231dc11dd5dSJosef Bacik return -1; 232dc11dd5dSJosef Bacik } 233dc11dd5dSJosef Bacik 234dc11dd5dSJosef Bacik __btrfs_remove_free_space_cache(cache->free_space_ctl); 235dc11dd5dSJosef Bacik 236dc11dd5dSJosef Bacik /* Now with the extent entry offset into the bitmap */ 237ee22184bSByongho Lee ret = test_add_free_space_entry(cache, SZ_4M, SZ_4M, 1); 238dc11dd5dSJosef Bacik if (ret) { 2393c7251f2SDavid Sterba test_err("couldn't add space to the bitmap %d", ret); 240dc11dd5dSJosef Bacik return ret; 241dc11dd5dSJosef Bacik } 242dc11dd5dSJosef Bacik 243ee22184bSByongho Lee ret = test_add_free_space_entry(cache, SZ_2M, SZ_2M, 0); 244dc11dd5dSJosef Bacik if (ret) { 2453c7251f2SDavid Sterba test_err("couldn't add extent to the cache %d", ret); 246dc11dd5dSJosef Bacik return ret; 247dc11dd5dSJosef Bacik } 248dc11dd5dSJosef Bacik 249ee22184bSByongho Lee ret = btrfs_remove_free_space(cache, 3 * SZ_1M, SZ_4M); 250dc11dd5dSJosef Bacik if (ret) { 2513c7251f2SDavid Sterba test_err("problem removing overlapping space %d", ret); 252dc11dd5dSJosef Bacik return ret; 253dc11dd5dSJosef Bacik } 254dc11dd5dSJosef Bacik 255ee22184bSByongho Lee if (test_check_exists(cache, 3 * SZ_1M, SZ_4M)) { 2563c7251f2SDavid Sterba test_err("left something behind when removing space"); 257dc11dd5dSJosef Bacik return -1; 258dc11dd5dSJosef Bacik } 259dc11dd5dSJosef Bacik 260dc11dd5dSJosef Bacik /* 261dc11dd5dSJosef Bacik * This has blown up in the past, the extent entry starts before the 262dc11dd5dSJosef Bacik * bitmap entry, but we're trying to remove an offset that falls 263dc11dd5dSJosef Bacik * completely within the bitmap range and is in both the extent entry 264dc11dd5dSJosef Bacik * and the bitmap entry, looks like this 265dc11dd5dSJosef Bacik * 266dc11dd5dSJosef Bacik * [ extent ] 267dc11dd5dSJosef Bacik * [ bitmap ] 268dc11dd5dSJosef Bacik * [ del ] 269dc11dd5dSJosef Bacik */ 270dc11dd5dSJosef Bacik __btrfs_remove_free_space_cache(cache->free_space_ctl); 271ee22184bSByongho Lee ret = test_add_free_space_entry(cache, bitmap_offset + SZ_4M, SZ_4M, 1); 272dc11dd5dSJosef Bacik if (ret) { 2733c7251f2SDavid Sterba test_err("couldn't add bitmap %d", ret); 274dc11dd5dSJosef Bacik return ret; 275dc11dd5dSJosef Bacik } 276dc11dd5dSJosef Bacik 277ee22184bSByongho Lee ret = test_add_free_space_entry(cache, bitmap_offset - SZ_1M, 278ee22184bSByongho Lee 5 * SZ_1M, 0); 279dc11dd5dSJosef Bacik if (ret) { 2803c7251f2SDavid Sterba test_err("couldn't add extent entry %d", ret); 281dc11dd5dSJosef Bacik return ret; 282dc11dd5dSJosef Bacik } 283dc11dd5dSJosef Bacik 284ee22184bSByongho Lee ret = btrfs_remove_free_space(cache, bitmap_offset + SZ_1M, 5 * SZ_1M); 285dc11dd5dSJosef Bacik if (ret) { 2863c7251f2SDavid Sterba test_err("failed to free our space %d", ret); 287dc11dd5dSJosef Bacik return ret; 288dc11dd5dSJosef Bacik } 289dc11dd5dSJosef Bacik 290ee22184bSByongho Lee if (test_check_exists(cache, bitmap_offset + SZ_1M, 5 * SZ_1M)) { 2913c7251f2SDavid Sterba test_err("left stuff over"); 292dc11dd5dSJosef Bacik return -1; 293dc11dd5dSJosef Bacik } 294dc11dd5dSJosef Bacik 295dc11dd5dSJosef Bacik __btrfs_remove_free_space_cache(cache->free_space_ctl); 296dc11dd5dSJosef Bacik 297dc11dd5dSJosef Bacik /* 298dc11dd5dSJosef Bacik * This blew up before, we have part of the free space in a bitmap and 299dc11dd5dSJosef Bacik * then the entirety of the rest of the space in an extent. This used 300dc11dd5dSJosef Bacik * to return -EAGAIN back from btrfs_remove_extent, make sure this 301dc11dd5dSJosef Bacik * doesn't happen. 302dc11dd5dSJosef Bacik */ 303ee22184bSByongho Lee ret = test_add_free_space_entry(cache, SZ_1M, SZ_2M, 1); 304dc11dd5dSJosef Bacik if (ret) { 3053c7251f2SDavid Sterba test_err("couldn't add bitmap entry %d", ret); 306dc11dd5dSJosef Bacik return ret; 307dc11dd5dSJosef Bacik } 308dc11dd5dSJosef Bacik 309ee22184bSByongho Lee ret = test_add_free_space_entry(cache, 3 * SZ_1M, SZ_1M, 0); 310dc11dd5dSJosef Bacik if (ret) { 3113c7251f2SDavid Sterba test_err("couldn't add extent entry %d", ret); 312dc11dd5dSJosef Bacik return ret; 313dc11dd5dSJosef Bacik } 314dc11dd5dSJosef Bacik 315ee22184bSByongho Lee ret = btrfs_remove_free_space(cache, SZ_1M, 3 * SZ_1M); 316dc11dd5dSJosef Bacik if (ret) { 3173c7251f2SDavid Sterba test_err("error removing bitmap and extent overlapping %d", ret); 318dc11dd5dSJosef Bacik return ret; 319dc11dd5dSJosef Bacik } 320dc11dd5dSJosef Bacik 321dc11dd5dSJosef Bacik __btrfs_remove_free_space_cache(cache->free_space_ctl); 322dc11dd5dSJosef Bacik return 0; 323dc11dd5dSJosef Bacik } 324dc11dd5dSJosef Bacik 32520005523SFilipe Manana /* Used by test_steal_space_from_bitmap_to_extent(). */ 32620005523SFilipe Manana static bool test_use_bitmap(struct btrfs_free_space_ctl *ctl, 32720005523SFilipe Manana struct btrfs_free_space *info) 32820005523SFilipe Manana { 32920005523SFilipe Manana return ctl->free_extents > 0; 33020005523SFilipe Manana } 33120005523SFilipe Manana 33220005523SFilipe Manana /* Used by test_steal_space_from_bitmap_to_extent(). */ 33320005523SFilipe Manana static int 33420005523SFilipe Manana check_num_extents_and_bitmaps(const struct btrfs_block_group_cache *cache, 33520005523SFilipe Manana const int num_extents, 33620005523SFilipe Manana const int num_bitmaps) 33720005523SFilipe Manana { 33820005523SFilipe Manana if (cache->free_space_ctl->free_extents != num_extents) { 3393c7251f2SDavid Sterba test_err( 3403c7251f2SDavid Sterba "incorrect # of extent entries in the cache: %d, expected %d", 34120005523SFilipe Manana cache->free_space_ctl->free_extents, num_extents); 34220005523SFilipe Manana return -EINVAL; 34320005523SFilipe Manana } 34420005523SFilipe Manana if (cache->free_space_ctl->total_bitmaps != num_bitmaps) { 3453c7251f2SDavid Sterba test_err( 3463c7251f2SDavid Sterba "incorrect # of extent entries in the cache: %d, expected %d", 34720005523SFilipe Manana cache->free_space_ctl->total_bitmaps, num_bitmaps); 34820005523SFilipe Manana return -EINVAL; 34920005523SFilipe Manana } 35020005523SFilipe Manana return 0; 35120005523SFilipe Manana } 35220005523SFilipe Manana 35320005523SFilipe Manana /* Used by test_steal_space_from_bitmap_to_extent(). */ 35420005523SFilipe Manana static int check_cache_empty(struct btrfs_block_group_cache *cache) 35520005523SFilipe Manana { 35620005523SFilipe Manana u64 offset; 35720005523SFilipe Manana u64 max_extent_size; 35820005523SFilipe Manana 35920005523SFilipe Manana /* 36020005523SFilipe Manana * Now lets confirm that there's absolutely no free space left to 36120005523SFilipe Manana * allocate. 36220005523SFilipe Manana */ 36320005523SFilipe Manana if (cache->free_space_ctl->free_space != 0) { 3643c7251f2SDavid Sterba test_err("cache free space is not 0"); 36520005523SFilipe Manana return -EINVAL; 36620005523SFilipe Manana } 36720005523SFilipe Manana 36820005523SFilipe Manana /* And any allocation request, no matter how small, should fail now. */ 36920005523SFilipe Manana offset = btrfs_find_space_for_alloc(cache, 0, 4096, 0, 37020005523SFilipe Manana &max_extent_size); 37120005523SFilipe Manana if (offset != 0) { 3723c7251f2SDavid Sterba test_err("space allocation did not fail, returned offset: %llu", 37320005523SFilipe Manana offset); 37420005523SFilipe Manana return -EINVAL; 37520005523SFilipe Manana } 37620005523SFilipe Manana 37720005523SFilipe Manana /* And no extent nor bitmap entries in the cache anymore. */ 37820005523SFilipe Manana return check_num_extents_and_bitmaps(cache, 0, 0); 37920005523SFilipe Manana } 38020005523SFilipe Manana 38120005523SFilipe Manana /* 38220005523SFilipe Manana * Before we were able to steal free space from a bitmap entry to an extent 38320005523SFilipe Manana * entry, we could end up with 2 entries representing a contiguous free space. 38420005523SFilipe Manana * One would be an extent entry and the other a bitmap entry. Since in order 38520005523SFilipe Manana * to allocate space to a caller we use only 1 entry, we couldn't return that 38620005523SFilipe Manana * whole range to the caller if it was requested. This forced the caller to 38720005523SFilipe Manana * either assume ENOSPC or perform several smaller space allocations, which 38820005523SFilipe Manana * wasn't optimal as they could be spread all over the block group while under 38920005523SFilipe Manana * concurrency (extra overhead and fragmentation). 39020005523SFilipe Manana * 39101327610SNicholas D Steeves * This stealing approach is beneficial, since we always prefer to allocate 39201327610SNicholas D Steeves * from extent entries, both for clustered and non-clustered allocation 39301327610SNicholas D Steeves * requests. 39420005523SFilipe Manana */ 39520005523SFilipe Manana static int 396b9ef22deSFeifei Xu test_steal_space_from_bitmap_to_extent(struct btrfs_block_group_cache *cache, 397b9ef22deSFeifei Xu u32 sectorsize) 39820005523SFilipe Manana { 39920005523SFilipe Manana int ret; 40020005523SFilipe Manana u64 offset; 40120005523SFilipe Manana u64 max_extent_size; 40220e5506bSDavid Sterba const struct btrfs_free_space_op test_free_space_ops = { 40328f0779aSDavid Sterba .recalc_thresholds = cache->free_space_ctl->op->recalc_thresholds, 40428f0779aSDavid Sterba .use_bitmap = test_use_bitmap, 40528f0779aSDavid Sterba }; 40620e5506bSDavid Sterba const struct btrfs_free_space_op *orig_free_space_ops; 40720005523SFilipe Manana 408e4fa7469SDavid Sterba test_msg("running space stealing from bitmap to extent tests"); 40920005523SFilipe Manana 41020005523SFilipe Manana /* 41120005523SFilipe Manana * For this test, we want to ensure we end up with an extent entry 41220005523SFilipe Manana * immediately adjacent to a bitmap entry, where the bitmap starts 41320005523SFilipe Manana * at an offset where the extent entry ends. We keep adding and 41420005523SFilipe Manana * removing free space to reach into this state, but to get there 41520005523SFilipe Manana * we need to reach a point where marking new free space doesn't 41620005523SFilipe Manana * result in adding new extent entries or merging the new space 41720005523SFilipe Manana * with existing extent entries - the space ends up being marked 41820005523SFilipe Manana * in an existing bitmap that covers the new free space range. 41920005523SFilipe Manana * 42020005523SFilipe Manana * To get there, we need to reach the threshold defined set at 42120005523SFilipe Manana * cache->free_space_ctl->extents_thresh, which currently is 42220005523SFilipe Manana * 256 extents on a x86_64 system at least, and a few other 42320005523SFilipe Manana * conditions (check free_space_cache.c). Instead of making the 42420005523SFilipe Manana * test much longer and complicated, use a "use_bitmap" operation 42520005523SFilipe Manana * that forces use of bitmaps as soon as we have at least 1 42620005523SFilipe Manana * extent entry. 42720005523SFilipe Manana */ 42828f0779aSDavid Sterba orig_free_space_ops = cache->free_space_ctl->op; 42928f0779aSDavid Sterba cache->free_space_ctl->op = &test_free_space_ops; 43020005523SFilipe Manana 43120005523SFilipe Manana /* 43220005523SFilipe Manana * Extent entry covering free space range [128Mb - 256Kb, 128Mb - 128Kb[ 43320005523SFilipe Manana */ 434ee22184bSByongho Lee ret = test_add_free_space_entry(cache, SZ_128M - SZ_256K, SZ_128K, 0); 43520005523SFilipe Manana if (ret) { 4363c7251f2SDavid Sterba test_err("couldn't add extent entry %d", ret); 43720005523SFilipe Manana return ret; 43820005523SFilipe Manana } 43920005523SFilipe Manana 44020005523SFilipe Manana /* Bitmap entry covering free space range [128Mb + 512Kb, 256Mb[ */ 441ee22184bSByongho Lee ret = test_add_free_space_entry(cache, SZ_128M + SZ_512K, 442ee22184bSByongho Lee SZ_128M - SZ_512K, 1); 44320005523SFilipe Manana if (ret) { 4443c7251f2SDavid Sterba test_err("couldn't add bitmap entry %d", ret); 44520005523SFilipe Manana return ret; 44620005523SFilipe Manana } 44720005523SFilipe Manana 44820005523SFilipe Manana ret = check_num_extents_and_bitmaps(cache, 2, 1); 44920005523SFilipe Manana if (ret) 45020005523SFilipe Manana return ret; 45120005523SFilipe Manana 45220005523SFilipe Manana /* 45320005523SFilipe Manana * Now make only the first 256Kb of the bitmap marked as free, so that 45420005523SFilipe Manana * we end up with only the following ranges marked as free space: 45520005523SFilipe Manana * 45620005523SFilipe Manana * [128Mb - 256Kb, 128Mb - 128Kb[ 45720005523SFilipe Manana * [128Mb + 512Kb, 128Mb + 768Kb[ 45820005523SFilipe Manana */ 45920005523SFilipe Manana ret = btrfs_remove_free_space(cache, 460ee22184bSByongho Lee SZ_128M + 768 * SZ_1K, 461ee22184bSByongho Lee SZ_128M - 768 * SZ_1K); 46220005523SFilipe Manana if (ret) { 4633c7251f2SDavid Sterba test_err("failed to free part of bitmap space %d", ret); 46420005523SFilipe Manana return ret; 46520005523SFilipe Manana } 46620005523SFilipe Manana 46720005523SFilipe Manana /* Confirm that only those 2 ranges are marked as free. */ 468ee22184bSByongho Lee if (!test_check_exists(cache, SZ_128M - SZ_256K, SZ_128K)) { 4693c7251f2SDavid Sterba test_err("free space range missing"); 47020005523SFilipe Manana return -ENOENT; 47120005523SFilipe Manana } 472ee22184bSByongho Lee if (!test_check_exists(cache, SZ_128M + SZ_512K, SZ_256K)) { 4733c7251f2SDavid Sterba test_err("free space range missing"); 47420005523SFilipe Manana return -ENOENT; 47520005523SFilipe Manana } 47620005523SFilipe Manana 47720005523SFilipe Manana /* 47820005523SFilipe Manana * Confirm that the bitmap range [128Mb + 768Kb, 256Mb[ isn't marked 47920005523SFilipe Manana * as free anymore. 48020005523SFilipe Manana */ 481ee22184bSByongho Lee if (test_check_exists(cache, SZ_128M + 768 * SZ_1K, 482ee22184bSByongho Lee SZ_128M - 768 * SZ_1K)) { 4833c7251f2SDavid Sterba test_err("bitmap region not removed from space cache"); 48420005523SFilipe Manana return -EINVAL; 48520005523SFilipe Manana } 48620005523SFilipe Manana 48720005523SFilipe Manana /* 48820005523SFilipe Manana * Confirm that the region [128Mb + 256Kb, 128Mb + 512Kb[, which is 48920005523SFilipe Manana * covered by the bitmap, isn't marked as free. 49020005523SFilipe Manana */ 491ee22184bSByongho Lee if (test_check_exists(cache, SZ_128M + SZ_256K, SZ_256K)) { 4923c7251f2SDavid Sterba test_err("invalid bitmap region marked as free"); 49320005523SFilipe Manana return -EINVAL; 49420005523SFilipe Manana } 49520005523SFilipe Manana 49620005523SFilipe Manana /* 49720005523SFilipe Manana * Confirm that the region [128Mb, 128Mb + 256Kb[, which is covered 49820005523SFilipe Manana * by the bitmap too, isn't marked as free either. 49920005523SFilipe Manana */ 500ee22184bSByongho Lee if (test_check_exists(cache, SZ_128M, SZ_256K)) { 5013c7251f2SDavid Sterba test_err("invalid bitmap region marked as free"); 50220005523SFilipe Manana return -EINVAL; 50320005523SFilipe Manana } 50420005523SFilipe Manana 50520005523SFilipe Manana /* 50620005523SFilipe Manana * Now lets mark the region [128Mb, 128Mb + 512Kb[ as free too. But, 50720005523SFilipe Manana * lets make sure the free space cache marks it as free in the bitmap, 50820005523SFilipe Manana * and doesn't insert a new extent entry to represent this region. 50920005523SFilipe Manana */ 510ee22184bSByongho Lee ret = btrfs_add_free_space(cache, SZ_128M, SZ_512K); 51120005523SFilipe Manana if (ret) { 5123c7251f2SDavid Sterba test_err("error adding free space: %d", ret); 51320005523SFilipe Manana return ret; 51420005523SFilipe Manana } 51520005523SFilipe Manana /* Confirm the region is marked as free. */ 516ee22184bSByongho Lee if (!test_check_exists(cache, SZ_128M, SZ_512K)) { 5173c7251f2SDavid Sterba test_err("bitmap region not marked as free"); 51820005523SFilipe Manana return -ENOENT; 51920005523SFilipe Manana } 52020005523SFilipe Manana 52120005523SFilipe Manana /* 52220005523SFilipe Manana * Confirm that no new extent entries or bitmap entries were added to 52320005523SFilipe Manana * the cache after adding that free space region. 52420005523SFilipe Manana */ 52520005523SFilipe Manana ret = check_num_extents_and_bitmaps(cache, 2, 1); 52620005523SFilipe Manana if (ret) 52720005523SFilipe Manana return ret; 52820005523SFilipe Manana 52920005523SFilipe Manana /* 53020005523SFilipe Manana * Now lets add a small free space region to the right of the previous 53120005523SFilipe Manana * one, which is not contiguous with it and is part of the bitmap too. 53220005523SFilipe Manana * The goal is to test that the bitmap entry space stealing doesn't 53320005523SFilipe Manana * steal this space region. 53420005523SFilipe Manana */ 535b9ef22deSFeifei Xu ret = btrfs_add_free_space(cache, SZ_128M + SZ_16M, sectorsize); 53620005523SFilipe Manana if (ret) { 5373c7251f2SDavid Sterba test_err("error adding free space: %d", ret); 53820005523SFilipe Manana return ret; 53920005523SFilipe Manana } 54020005523SFilipe Manana 54120005523SFilipe Manana /* 54220005523SFilipe Manana * Confirm that no new extent entries or bitmap entries were added to 54320005523SFilipe Manana * the cache after adding that free space region. 54420005523SFilipe Manana */ 54520005523SFilipe Manana ret = check_num_extents_and_bitmaps(cache, 2, 1); 54620005523SFilipe Manana if (ret) 54720005523SFilipe Manana return ret; 54820005523SFilipe Manana 54920005523SFilipe Manana /* 55020005523SFilipe Manana * Now mark the region [128Mb - 128Kb, 128Mb[ as free too. This will 55120005523SFilipe Manana * expand the range covered by the existing extent entry that represents 55220005523SFilipe Manana * the free space [128Mb - 256Kb, 128Mb - 128Kb[. 55320005523SFilipe Manana */ 554ee22184bSByongho Lee ret = btrfs_add_free_space(cache, SZ_128M - SZ_128K, SZ_128K); 55520005523SFilipe Manana if (ret) { 5563c7251f2SDavid Sterba test_err("error adding free space: %d", ret); 55720005523SFilipe Manana return ret; 55820005523SFilipe Manana } 55920005523SFilipe Manana /* Confirm the region is marked as free. */ 560ee22184bSByongho Lee if (!test_check_exists(cache, SZ_128M - SZ_128K, SZ_128K)) { 5613c7251f2SDavid Sterba test_err("extent region not marked as free"); 56220005523SFilipe Manana return -ENOENT; 56320005523SFilipe Manana } 56420005523SFilipe Manana 56520005523SFilipe Manana /* 56620005523SFilipe Manana * Confirm that our extent entry didn't stole all free space from the 56720005523SFilipe Manana * bitmap, because of the small 4Kb free space region. 56820005523SFilipe Manana */ 56920005523SFilipe Manana ret = check_num_extents_and_bitmaps(cache, 2, 1); 57020005523SFilipe Manana if (ret) 57120005523SFilipe Manana return ret; 57220005523SFilipe Manana 57320005523SFilipe Manana /* 57420005523SFilipe Manana * So now we have the range [128Mb - 256Kb, 128Mb + 768Kb[ as free 57520005523SFilipe Manana * space. Without stealing bitmap free space into extent entry space, 57620005523SFilipe Manana * we would have all this free space represented by 2 entries in the 57720005523SFilipe Manana * cache: 57820005523SFilipe Manana * 57920005523SFilipe Manana * extent entry covering range: [128Mb - 256Kb, 128Mb[ 58020005523SFilipe Manana * bitmap entry covering range: [128Mb, 128Mb + 768Kb[ 58120005523SFilipe Manana * 58220005523SFilipe Manana * Attempting to allocate the whole free space (1Mb) would fail, because 58320005523SFilipe Manana * we can't allocate from multiple entries. 58420005523SFilipe Manana * With the bitmap free space stealing, we get a single extent entry 58520005523SFilipe Manana * that represents the 1Mb free space, and therefore we're able to 58620005523SFilipe Manana * allocate the whole free space at once. 58720005523SFilipe Manana */ 588ee22184bSByongho Lee if (!test_check_exists(cache, SZ_128M - SZ_256K, SZ_1M)) { 5893c7251f2SDavid Sterba test_err("expected region not marked as free"); 59020005523SFilipe Manana return -ENOENT; 59120005523SFilipe Manana } 59220005523SFilipe Manana 593b9ef22deSFeifei Xu if (cache->free_space_ctl->free_space != (SZ_1M + sectorsize)) { 5943c7251f2SDavid Sterba test_err("cache free space is not 1Mb + %u", sectorsize); 59520005523SFilipe Manana return -EINVAL; 59620005523SFilipe Manana } 59720005523SFilipe Manana 59820005523SFilipe Manana offset = btrfs_find_space_for_alloc(cache, 599ee22184bSByongho Lee 0, SZ_1M, 0, 60020005523SFilipe Manana &max_extent_size); 601ee22184bSByongho Lee if (offset != (SZ_128M - SZ_256K)) { 6023c7251f2SDavid Sterba test_err( 6033c7251f2SDavid Sterba "failed to allocate 1Mb from space cache, returned offset is: %llu", 60420005523SFilipe Manana offset); 60520005523SFilipe Manana return -EINVAL; 60620005523SFilipe Manana } 60720005523SFilipe Manana 608b9ef22deSFeifei Xu /* 609b9ef22deSFeifei Xu * All that remains is a sectorsize free space region in a bitmap. 610b9ef22deSFeifei Xu * Confirm. 611b9ef22deSFeifei Xu */ 61220005523SFilipe Manana ret = check_num_extents_and_bitmaps(cache, 1, 1); 61320005523SFilipe Manana if (ret) 61420005523SFilipe Manana return ret; 61520005523SFilipe Manana 616b9ef22deSFeifei Xu if (cache->free_space_ctl->free_space != sectorsize) { 6173c7251f2SDavid Sterba test_err("cache free space is not %u", sectorsize); 61820005523SFilipe Manana return -EINVAL; 61920005523SFilipe Manana } 62020005523SFilipe Manana 62120005523SFilipe Manana offset = btrfs_find_space_for_alloc(cache, 622b9ef22deSFeifei Xu 0, sectorsize, 0, 62320005523SFilipe Manana &max_extent_size); 624ee22184bSByongho Lee if (offset != (SZ_128M + SZ_16M)) { 6253c7251f2SDavid Sterba test_err("failed to allocate %u, returned offset : %llu", 626b9ef22deSFeifei Xu sectorsize, offset); 62720005523SFilipe Manana return -EINVAL; 62820005523SFilipe Manana } 62920005523SFilipe Manana 63020005523SFilipe Manana ret = check_cache_empty(cache); 63120005523SFilipe Manana if (ret) 63220005523SFilipe Manana return ret; 63320005523SFilipe Manana 63420005523SFilipe Manana __btrfs_remove_free_space_cache(cache->free_space_ctl); 63520005523SFilipe Manana 63620005523SFilipe Manana /* 63720005523SFilipe Manana * Now test a similar scenario, but where our extent entry is located 63820005523SFilipe Manana * to the right of the bitmap entry, so that we can check that stealing 63920005523SFilipe Manana * space from a bitmap to the front of an extent entry works. 64020005523SFilipe Manana */ 64120005523SFilipe Manana 64220005523SFilipe Manana /* 64320005523SFilipe Manana * Extent entry covering free space range [128Mb + 128Kb, 128Mb + 256Kb[ 64420005523SFilipe Manana */ 645ee22184bSByongho Lee ret = test_add_free_space_entry(cache, SZ_128M + SZ_128K, SZ_128K, 0); 64620005523SFilipe Manana if (ret) { 6473c7251f2SDavid Sterba test_err("couldn't add extent entry %d", ret); 64820005523SFilipe Manana return ret; 64920005523SFilipe Manana } 65020005523SFilipe Manana 65120005523SFilipe Manana /* Bitmap entry covering free space range [0, 128Mb - 512Kb[ */ 652ee22184bSByongho Lee ret = test_add_free_space_entry(cache, 0, SZ_128M - SZ_512K, 1); 65320005523SFilipe Manana if (ret) { 6543c7251f2SDavid Sterba test_err("couldn't add bitmap entry %d", ret); 65520005523SFilipe Manana return ret; 65620005523SFilipe Manana } 65720005523SFilipe Manana 65820005523SFilipe Manana ret = check_num_extents_and_bitmaps(cache, 2, 1); 65920005523SFilipe Manana if (ret) 66020005523SFilipe Manana return ret; 66120005523SFilipe Manana 66220005523SFilipe Manana /* 66320005523SFilipe Manana * Now make only the last 256Kb of the bitmap marked as free, so that 66420005523SFilipe Manana * we end up with only the following ranges marked as free space: 66520005523SFilipe Manana * 66620005523SFilipe Manana * [128Mb + 128b, 128Mb + 256Kb[ 66720005523SFilipe Manana * [128Mb - 768Kb, 128Mb - 512Kb[ 66820005523SFilipe Manana */ 669ee22184bSByongho Lee ret = btrfs_remove_free_space(cache, 0, SZ_128M - 768 * SZ_1K); 67020005523SFilipe Manana if (ret) { 6713c7251f2SDavid Sterba test_err("failed to free part of bitmap space %d", ret); 67220005523SFilipe Manana return ret; 67320005523SFilipe Manana } 67420005523SFilipe Manana 67520005523SFilipe Manana /* Confirm that only those 2 ranges are marked as free. */ 676ee22184bSByongho Lee if (!test_check_exists(cache, SZ_128M + SZ_128K, SZ_128K)) { 6773c7251f2SDavid Sterba test_err("free space range missing"); 67820005523SFilipe Manana return -ENOENT; 67920005523SFilipe Manana } 680ee22184bSByongho Lee if (!test_check_exists(cache, SZ_128M - 768 * SZ_1K, SZ_256K)) { 6813c7251f2SDavid Sterba test_err("free space range missing"); 68220005523SFilipe Manana return -ENOENT; 68320005523SFilipe Manana } 68420005523SFilipe Manana 68520005523SFilipe Manana /* 68620005523SFilipe Manana * Confirm that the bitmap range [0, 128Mb - 768Kb[ isn't marked 68720005523SFilipe Manana * as free anymore. 68820005523SFilipe Manana */ 689ee22184bSByongho Lee if (test_check_exists(cache, 0, SZ_128M - 768 * SZ_1K)) { 6903c7251f2SDavid Sterba test_err("bitmap region not removed from space cache"); 69120005523SFilipe Manana return -EINVAL; 69220005523SFilipe Manana } 69320005523SFilipe Manana 69420005523SFilipe Manana /* 69520005523SFilipe Manana * Confirm that the region [128Mb - 512Kb, 128Mb[, which is 69620005523SFilipe Manana * covered by the bitmap, isn't marked as free. 69720005523SFilipe Manana */ 698ee22184bSByongho Lee if (test_check_exists(cache, SZ_128M - SZ_512K, SZ_512K)) { 6993c7251f2SDavid Sterba test_err("invalid bitmap region marked as free"); 70020005523SFilipe Manana return -EINVAL; 70120005523SFilipe Manana } 70220005523SFilipe Manana 70320005523SFilipe Manana /* 70420005523SFilipe Manana * Now lets mark the region [128Mb - 512Kb, 128Mb[ as free too. But, 70520005523SFilipe Manana * lets make sure the free space cache marks it as free in the bitmap, 70620005523SFilipe Manana * and doesn't insert a new extent entry to represent this region. 70720005523SFilipe Manana */ 708ee22184bSByongho Lee ret = btrfs_add_free_space(cache, SZ_128M - SZ_512K, SZ_512K); 70920005523SFilipe Manana if (ret) { 7103c7251f2SDavid Sterba test_err("error adding free space: %d", ret); 71120005523SFilipe Manana return ret; 71220005523SFilipe Manana } 71320005523SFilipe Manana /* Confirm the region is marked as free. */ 714ee22184bSByongho Lee if (!test_check_exists(cache, SZ_128M - SZ_512K, SZ_512K)) { 7153c7251f2SDavid Sterba test_err("bitmap region not marked as free"); 71620005523SFilipe Manana return -ENOENT; 71720005523SFilipe Manana } 71820005523SFilipe Manana 71920005523SFilipe Manana /* 72020005523SFilipe Manana * Confirm that no new extent entries or bitmap entries were added to 72120005523SFilipe Manana * the cache after adding that free space region. 72220005523SFilipe Manana */ 72320005523SFilipe Manana ret = check_num_extents_and_bitmaps(cache, 2, 1); 72420005523SFilipe Manana if (ret) 72520005523SFilipe Manana return ret; 72620005523SFilipe Manana 72720005523SFilipe Manana /* 72820005523SFilipe Manana * Now lets add a small free space region to the left of the previous 72920005523SFilipe Manana * one, which is not contiguous with it and is part of the bitmap too. 73020005523SFilipe Manana * The goal is to test that the bitmap entry space stealing doesn't 73120005523SFilipe Manana * steal this space region. 73220005523SFilipe Manana */ 733b9ef22deSFeifei Xu ret = btrfs_add_free_space(cache, SZ_32M, 2 * sectorsize); 73420005523SFilipe Manana if (ret) { 7353c7251f2SDavid Sterba test_err("error adding free space: %d", ret); 73620005523SFilipe Manana return ret; 73720005523SFilipe Manana } 73820005523SFilipe Manana 73920005523SFilipe Manana /* 74020005523SFilipe Manana * Now mark the region [128Mb, 128Mb + 128Kb[ as free too. This will 74120005523SFilipe Manana * expand the range covered by the existing extent entry that represents 74220005523SFilipe Manana * the free space [128Mb + 128Kb, 128Mb + 256Kb[. 74320005523SFilipe Manana */ 744ee22184bSByongho Lee ret = btrfs_add_free_space(cache, SZ_128M, SZ_128K); 74520005523SFilipe Manana if (ret) { 7463c7251f2SDavid Sterba test_err("error adding free space: %d", ret); 74720005523SFilipe Manana return ret; 74820005523SFilipe Manana } 74920005523SFilipe Manana /* Confirm the region is marked as free. */ 750ee22184bSByongho Lee if (!test_check_exists(cache, SZ_128M, SZ_128K)) { 7513c7251f2SDavid Sterba test_err("extent region not marked as free"); 75220005523SFilipe Manana return -ENOENT; 75320005523SFilipe Manana } 75420005523SFilipe Manana 75520005523SFilipe Manana /* 75620005523SFilipe Manana * Confirm that our extent entry didn't stole all free space from the 757b9ef22deSFeifei Xu * bitmap, because of the small 2 * sectorsize free space region. 75820005523SFilipe Manana */ 75920005523SFilipe Manana ret = check_num_extents_and_bitmaps(cache, 2, 1); 76020005523SFilipe Manana if (ret) 76120005523SFilipe Manana return ret; 76220005523SFilipe Manana 76320005523SFilipe Manana /* 76420005523SFilipe Manana * So now we have the range [128Mb - 768Kb, 128Mb + 256Kb[ as free 76520005523SFilipe Manana * space. Without stealing bitmap free space into extent entry space, 76620005523SFilipe Manana * we would have all this free space represented by 2 entries in the 76720005523SFilipe Manana * cache: 76820005523SFilipe Manana * 76920005523SFilipe Manana * extent entry covering range: [128Mb, 128Mb + 256Kb[ 77020005523SFilipe Manana * bitmap entry covering range: [128Mb - 768Kb, 128Mb[ 77120005523SFilipe Manana * 77220005523SFilipe Manana * Attempting to allocate the whole free space (1Mb) would fail, because 77320005523SFilipe Manana * we can't allocate from multiple entries. 77420005523SFilipe Manana * With the bitmap free space stealing, we get a single extent entry 77520005523SFilipe Manana * that represents the 1Mb free space, and therefore we're able to 77620005523SFilipe Manana * allocate the whole free space at once. 77720005523SFilipe Manana */ 778ee22184bSByongho Lee if (!test_check_exists(cache, SZ_128M - 768 * SZ_1K, SZ_1M)) { 7793c7251f2SDavid Sterba test_err("expected region not marked as free"); 78020005523SFilipe Manana return -ENOENT; 78120005523SFilipe Manana } 78220005523SFilipe Manana 783b9ef22deSFeifei Xu if (cache->free_space_ctl->free_space != (SZ_1M + 2 * sectorsize)) { 7843c7251f2SDavid Sterba test_err("cache free space is not 1Mb + %u", 2 * sectorsize); 78520005523SFilipe Manana return -EINVAL; 78620005523SFilipe Manana } 78720005523SFilipe Manana 788ee22184bSByongho Lee offset = btrfs_find_space_for_alloc(cache, 0, SZ_1M, 0, 78920005523SFilipe Manana &max_extent_size); 790ee22184bSByongho Lee if (offset != (SZ_128M - 768 * SZ_1K)) { 7913c7251f2SDavid Sterba test_err( 7923c7251f2SDavid Sterba "failed to allocate 1Mb from space cache, returned offset is: %llu", 79320005523SFilipe Manana offset); 79420005523SFilipe Manana return -EINVAL; 79520005523SFilipe Manana } 79620005523SFilipe Manana 797b9ef22deSFeifei Xu /* 798b9ef22deSFeifei Xu * All that remains is 2 * sectorsize free space region 799b9ef22deSFeifei Xu * in a bitmap. Confirm. 800b9ef22deSFeifei Xu */ 80120005523SFilipe Manana ret = check_num_extents_and_bitmaps(cache, 1, 1); 80220005523SFilipe Manana if (ret) 80320005523SFilipe Manana return ret; 80420005523SFilipe Manana 805b9ef22deSFeifei Xu if (cache->free_space_ctl->free_space != 2 * sectorsize) { 8063c7251f2SDavid Sterba test_err("cache free space is not %u", 2 * sectorsize); 80720005523SFilipe Manana return -EINVAL; 80820005523SFilipe Manana } 80920005523SFilipe Manana 81020005523SFilipe Manana offset = btrfs_find_space_for_alloc(cache, 811b9ef22deSFeifei Xu 0, 2 * sectorsize, 0, 81220005523SFilipe Manana &max_extent_size); 813ee22184bSByongho Lee if (offset != SZ_32M) { 8143c7251f2SDavid Sterba test_err("failed to allocate %u, offset: %llu", 8153c7251f2SDavid Sterba 2 * sectorsize, offset); 81620005523SFilipe Manana return -EINVAL; 81720005523SFilipe Manana } 81820005523SFilipe Manana 81920005523SFilipe Manana ret = check_cache_empty(cache); 82020005523SFilipe Manana if (ret) 82120005523SFilipe Manana return ret; 82220005523SFilipe Manana 82328f0779aSDavid Sterba cache->free_space_ctl->op = orig_free_space_ops; 82420005523SFilipe Manana __btrfs_remove_free_space_cache(cache->free_space_ctl); 82520005523SFilipe Manana 82620005523SFilipe Manana return 0; 82720005523SFilipe Manana } 82820005523SFilipe Manana 829b9ef22deSFeifei Xu int btrfs_test_free_space_cache(u32 sectorsize, u32 nodesize) 830dc11dd5dSJosef Bacik { 8317c0260eeSJeff Mahoney struct btrfs_fs_info *fs_info; 832dc11dd5dSJosef Bacik struct btrfs_block_group_cache *cache; 833d0bd4560SJosef Bacik struct btrfs_root *root = NULL; 834d0bd4560SJosef Bacik int ret = -ENOMEM; 835dc11dd5dSJosef Bacik 836315b76b4SDavid Sterba test_msg("running btrfs free space cache tests"); 837da17066cSJeff Mahoney fs_info = btrfs_alloc_dummy_fs_info(nodesize, sectorsize); 83837b2a7bcSDavid Sterba if (!fs_info) { 83937b2a7bcSDavid Sterba test_std_err(TEST_ALLOC_FS_INFO); 840da17066cSJeff Mahoney return -ENOMEM; 84137b2a7bcSDavid Sterba } 842dc11dd5dSJosef Bacik 84336b3dc05SFeifei Xu /* 84436b3dc05SFeifei Xu * For ppc64 (with 64k page size), bytes per bitmap might be 84536b3dc05SFeifei Xu * larger than 1G. To make bitmap test available in ppc64, 84636b3dc05SFeifei Xu * alloc dummy block group whose size cross bitmaps. 84736b3dc05SFeifei Xu */ 848da17066cSJeff Mahoney cache = btrfs_alloc_dummy_block_group(fs_info, 849da17066cSJeff Mahoney BITS_PER_BITMAP * sectorsize + PAGE_SIZE); 850dc11dd5dSJosef Bacik if (!cache) { 8513199366dSDavid Sterba test_std_err(TEST_ALLOC_BLOCK_GROUP); 852da17066cSJeff Mahoney btrfs_free_dummy_fs_info(fs_info); 853dc11dd5dSJosef Bacik return 0; 854dc11dd5dSJosef Bacik } 855dc11dd5dSJosef Bacik 856da17066cSJeff Mahoney root = btrfs_alloc_dummy_root(fs_info); 85789b6c8d1SDan Carpenter if (IS_ERR(root)) { 85852ab7bcaSDavid Sterba test_std_err(TEST_ALLOC_ROOT); 85989b6c8d1SDan Carpenter ret = PTR_ERR(root); 860d0bd4560SJosef Bacik goto out; 86189b6c8d1SDan Carpenter } 862d0bd4560SJosef Bacik 863d0bd4560SJosef Bacik root->fs_info->extent_root = root; 864d0bd4560SJosef Bacik 865dc11dd5dSJosef Bacik ret = test_extents(cache); 866dc11dd5dSJosef Bacik if (ret) 867dc11dd5dSJosef Bacik goto out; 868b9ef22deSFeifei Xu ret = test_bitmaps(cache, sectorsize); 869dc11dd5dSJosef Bacik if (ret) 870dc11dd5dSJosef Bacik goto out; 871b9ef22deSFeifei Xu ret = test_bitmaps_and_extents(cache, sectorsize); 872dc11dd5dSJosef Bacik if (ret) 873dc11dd5dSJosef Bacik goto out; 87420005523SFilipe Manana 875b9ef22deSFeifei Xu ret = test_steal_space_from_bitmap_to_extent(cache, sectorsize); 876dc11dd5dSJosef Bacik out: 8777c55ee0cSOmar Sandoval btrfs_free_dummy_block_group(cache); 878d0bd4560SJosef Bacik btrfs_free_dummy_root(root); 8797c0260eeSJeff Mahoney btrfs_free_dummy_fs_info(fs_info); 880dc11dd5dSJosef Bacik return ret; 881dc11dd5dSJosef Bacik } 882