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" 11dc11dd5dSJosef Bacik 120ef6447aSFeifei Xu #define BITS_PER_BITMAP (PAGE_SIZE * 8UL) 13dc11dd5dSJosef Bacik 14dc11dd5dSJosef Bacik /* 1501327610SNicholas D Steeves * This test just does basic sanity checking, making sure we can add an extent 16dc11dd5dSJosef Bacik * entry and remove space from either end and the middle, and make sure we can 17dc11dd5dSJosef Bacik * remove space that covers adjacent extent entries. 18dc11dd5dSJosef Bacik */ 19dc11dd5dSJosef Bacik static int test_extents(struct btrfs_block_group_cache *cache) 20dc11dd5dSJosef Bacik { 21dc11dd5dSJosef Bacik int ret = 0; 22dc11dd5dSJosef Bacik 23*3c7251f2SDavid Sterba test_msg("running extent only tests\n"); 24dc11dd5dSJosef Bacik 25dc11dd5dSJosef Bacik /* First just make sure we can remove an entire entry */ 26ee22184bSByongho Lee ret = btrfs_add_free_space(cache, 0, SZ_4M); 27dc11dd5dSJosef Bacik if (ret) { 28*3c7251f2SDavid Sterba test_err("error adding initial extents %d", ret); 29dc11dd5dSJosef Bacik return ret; 30dc11dd5dSJosef Bacik } 31dc11dd5dSJosef Bacik 32ee22184bSByongho Lee ret = btrfs_remove_free_space(cache, 0, SZ_4M); 33dc11dd5dSJosef Bacik if (ret) { 34*3c7251f2SDavid Sterba test_err("error removing extent %d", ret); 35dc11dd5dSJosef Bacik return ret; 36dc11dd5dSJosef Bacik } 37dc11dd5dSJosef Bacik 38ee22184bSByongho Lee if (test_check_exists(cache, 0, SZ_4M)) { 39*3c7251f2SDavid Sterba test_err("full remove left some lingering space"); 40dc11dd5dSJosef Bacik return -1; 41dc11dd5dSJosef Bacik } 42dc11dd5dSJosef Bacik 43dc11dd5dSJosef Bacik /* Ok edge and middle cases now */ 44ee22184bSByongho Lee ret = btrfs_add_free_space(cache, 0, SZ_4M); 45dc11dd5dSJosef Bacik if (ret) { 46*3c7251f2SDavid Sterba test_err("error adding half extent %d", ret); 47dc11dd5dSJosef Bacik return ret; 48dc11dd5dSJosef Bacik } 49dc11dd5dSJosef Bacik 50ee22184bSByongho Lee ret = btrfs_remove_free_space(cache, 3 * SZ_1M, SZ_1M); 51dc11dd5dSJosef Bacik if (ret) { 52*3c7251f2SDavid Sterba test_err("error removing tail end %d", ret); 53dc11dd5dSJosef Bacik return ret; 54dc11dd5dSJosef Bacik } 55dc11dd5dSJosef Bacik 56ee22184bSByongho Lee ret = btrfs_remove_free_space(cache, 0, SZ_1M); 57dc11dd5dSJosef Bacik if (ret) { 58*3c7251f2SDavid Sterba test_err("error removing front end %d", ret); 59dc11dd5dSJosef Bacik return ret; 60dc11dd5dSJosef Bacik } 61dc11dd5dSJosef Bacik 62ee22184bSByongho Lee ret = btrfs_remove_free_space(cache, SZ_2M, 4096); 63dc11dd5dSJosef Bacik if (ret) { 64*3c7251f2SDavid Sterba test_err("error removing middle piece %d", ret); 65dc11dd5dSJosef Bacik return ret; 66dc11dd5dSJosef Bacik } 67dc11dd5dSJosef Bacik 68ee22184bSByongho Lee if (test_check_exists(cache, 0, SZ_1M)) { 69*3c7251f2SDavid Sterba test_err("still have space at the front"); 70dc11dd5dSJosef Bacik return -1; 71dc11dd5dSJosef Bacik } 72dc11dd5dSJosef Bacik 73ee22184bSByongho Lee if (test_check_exists(cache, SZ_2M, 4096)) { 74*3c7251f2SDavid Sterba test_err("still have space in the middle"); 75dc11dd5dSJosef Bacik return -1; 76dc11dd5dSJosef Bacik } 77dc11dd5dSJosef Bacik 78ee22184bSByongho Lee if (test_check_exists(cache, 3 * SZ_1M, SZ_1M)) { 79*3c7251f2SDavid Sterba test_err("still have space at the end"); 80dc11dd5dSJosef Bacik return -1; 81dc11dd5dSJosef Bacik } 82dc11dd5dSJosef Bacik 83dc11dd5dSJosef Bacik /* Cleanup */ 84dc11dd5dSJosef Bacik __btrfs_remove_free_space_cache(cache->free_space_ctl); 85dc11dd5dSJosef Bacik 86dc11dd5dSJosef Bacik return 0; 87dc11dd5dSJosef Bacik } 88dc11dd5dSJosef Bacik 89b9ef22deSFeifei Xu static int test_bitmaps(struct btrfs_block_group_cache *cache, 90b9ef22deSFeifei Xu u32 sectorsize) 91dc11dd5dSJosef Bacik { 92dc11dd5dSJosef Bacik u64 next_bitmap_offset; 93dc11dd5dSJosef Bacik int ret; 94dc11dd5dSJosef Bacik 95*3c7251f2SDavid Sterba test_msg("running bitmap only tests\n"); 96dc11dd5dSJosef Bacik 97ee22184bSByongho Lee ret = test_add_free_space_entry(cache, 0, SZ_4M, 1); 98dc11dd5dSJosef Bacik if (ret) { 99*3c7251f2SDavid Sterba test_err("couldn't create a bitmap entry %d", ret); 100dc11dd5dSJosef Bacik return ret; 101dc11dd5dSJosef Bacik } 102dc11dd5dSJosef Bacik 103ee22184bSByongho Lee ret = btrfs_remove_free_space(cache, 0, SZ_4M); 104dc11dd5dSJosef Bacik if (ret) { 105*3c7251f2SDavid Sterba test_err("error removing bitmap full range %d", ret); 106dc11dd5dSJosef Bacik return ret; 107dc11dd5dSJosef Bacik } 108dc11dd5dSJosef Bacik 109ee22184bSByongho Lee if (test_check_exists(cache, 0, SZ_4M)) { 110*3c7251f2SDavid Sterba test_err("left some space in bitmap"); 111dc11dd5dSJosef Bacik return -1; 112dc11dd5dSJosef Bacik } 113dc11dd5dSJosef Bacik 114ee22184bSByongho Lee ret = test_add_free_space_entry(cache, 0, SZ_4M, 1); 115dc11dd5dSJosef Bacik if (ret) { 116*3c7251f2SDavid Sterba test_err("couldn't add to our bitmap entry %d", ret); 117dc11dd5dSJosef Bacik return ret; 118dc11dd5dSJosef Bacik } 119dc11dd5dSJosef Bacik 120ee22184bSByongho Lee ret = btrfs_remove_free_space(cache, SZ_1M, SZ_2M); 121dc11dd5dSJosef Bacik if (ret) { 122*3c7251f2SDavid Sterba test_err("couldn't remove middle chunk %d", ret); 123dc11dd5dSJosef Bacik return ret; 124dc11dd5dSJosef Bacik } 125dc11dd5dSJosef Bacik 126dc11dd5dSJosef Bacik /* 127dc11dd5dSJosef Bacik * The first bitmap we have starts at offset 0 so the next one is just 128dc11dd5dSJosef Bacik * at the end of the first bitmap. 129dc11dd5dSJosef Bacik */ 130b9ef22deSFeifei Xu next_bitmap_offset = (u64)(BITS_PER_BITMAP * sectorsize); 131dc11dd5dSJosef Bacik 132dc11dd5dSJosef Bacik /* Test a bit straddling two bitmaps */ 133ee22184bSByongho Lee ret = test_add_free_space_entry(cache, next_bitmap_offset - SZ_2M, 134ee22184bSByongho Lee SZ_4M, 1); 135dc11dd5dSJosef Bacik if (ret) { 136*3c7251f2SDavid Sterba test_err("couldn't add space that straddles two bitmaps %d", 137dc11dd5dSJosef Bacik ret); 138dc11dd5dSJosef Bacik return ret; 139dc11dd5dSJosef Bacik } 140dc11dd5dSJosef Bacik 141ee22184bSByongho Lee ret = btrfs_remove_free_space(cache, next_bitmap_offset - SZ_1M, SZ_2M); 142dc11dd5dSJosef Bacik if (ret) { 143*3c7251f2SDavid Sterba test_err("couldn't remove overlapping space %d", ret); 144dc11dd5dSJosef Bacik return ret; 145dc11dd5dSJosef Bacik } 146dc11dd5dSJosef Bacik 147ee22184bSByongho Lee if (test_check_exists(cache, next_bitmap_offset - SZ_1M, SZ_2M)) { 148*3c7251f2SDavid Sterba test_err("left some space when removing overlapping"); 149dc11dd5dSJosef Bacik return -1; 150dc11dd5dSJosef Bacik } 151dc11dd5dSJosef Bacik 152dc11dd5dSJosef Bacik __btrfs_remove_free_space_cache(cache->free_space_ctl); 153dc11dd5dSJosef Bacik 154dc11dd5dSJosef Bacik return 0; 155dc11dd5dSJosef Bacik } 156dc11dd5dSJosef Bacik 157dc11dd5dSJosef Bacik /* This is the high grade jackassery */ 158b9ef22deSFeifei Xu static int test_bitmaps_and_extents(struct btrfs_block_group_cache *cache, 159b9ef22deSFeifei Xu u32 sectorsize) 160dc11dd5dSJosef Bacik { 161b9ef22deSFeifei Xu u64 bitmap_offset = (u64)(BITS_PER_BITMAP * sectorsize); 162dc11dd5dSJosef Bacik int ret; 163dc11dd5dSJosef Bacik 164*3c7251f2SDavid Sterba test_msg("running bitmap and extent tests\n"); 165dc11dd5dSJosef Bacik 166dc11dd5dSJosef Bacik /* 167dc11dd5dSJosef Bacik * First let's do something simple, an extent at the same offset as the 168dc11dd5dSJosef Bacik * bitmap, but the free space completely in the extent and then 169dc11dd5dSJosef Bacik * completely in the bitmap. 170dc11dd5dSJosef Bacik */ 171ee22184bSByongho Lee ret = test_add_free_space_entry(cache, SZ_4M, SZ_1M, 1); 172dc11dd5dSJosef Bacik if (ret) { 173*3c7251f2SDavid Sterba test_err("couldn't create bitmap entry %d", ret); 174dc11dd5dSJosef Bacik return ret; 175dc11dd5dSJosef Bacik } 176dc11dd5dSJosef Bacik 177ee22184bSByongho Lee ret = test_add_free_space_entry(cache, 0, SZ_1M, 0); 178dc11dd5dSJosef Bacik if (ret) { 179*3c7251f2SDavid Sterba test_err("couldn't add extent entry %d", ret); 180dc11dd5dSJosef Bacik return ret; 181dc11dd5dSJosef Bacik } 182dc11dd5dSJosef Bacik 183ee22184bSByongho Lee ret = btrfs_remove_free_space(cache, 0, SZ_1M); 184dc11dd5dSJosef Bacik if (ret) { 185*3c7251f2SDavid Sterba test_err("couldn't remove extent entry %d", ret); 186dc11dd5dSJosef Bacik return ret; 187dc11dd5dSJosef Bacik } 188dc11dd5dSJosef Bacik 189ee22184bSByongho Lee if (test_check_exists(cache, 0, SZ_1M)) { 190*3c7251f2SDavid Sterba test_err("left remnants after our remove"); 191dc11dd5dSJosef Bacik return -1; 192dc11dd5dSJosef Bacik } 193dc11dd5dSJosef Bacik 194dc11dd5dSJosef Bacik /* Now to add back the extent entry and remove from the bitmap */ 195ee22184bSByongho Lee ret = test_add_free_space_entry(cache, 0, SZ_1M, 0); 196dc11dd5dSJosef Bacik if (ret) { 197*3c7251f2SDavid Sterba test_err("couldn't re-add extent entry %d", ret); 198dc11dd5dSJosef Bacik return ret; 199dc11dd5dSJosef Bacik } 200dc11dd5dSJosef Bacik 201ee22184bSByongho Lee ret = btrfs_remove_free_space(cache, SZ_4M, SZ_1M); 202dc11dd5dSJosef Bacik if (ret) { 203*3c7251f2SDavid Sterba test_err("couldn't remove from bitmap %d", ret); 204dc11dd5dSJosef Bacik return ret; 205dc11dd5dSJosef Bacik } 206dc11dd5dSJosef Bacik 207ee22184bSByongho Lee if (test_check_exists(cache, SZ_4M, SZ_1M)) { 208*3c7251f2SDavid Sterba test_err("left remnants in the bitmap"); 209dc11dd5dSJosef Bacik return -1; 210dc11dd5dSJosef Bacik } 211dc11dd5dSJosef Bacik 212dc11dd5dSJosef Bacik /* 213dc11dd5dSJosef Bacik * Ok so a little more evil, extent entry and bitmap at the same offset, 214dc11dd5dSJosef Bacik * removing an overlapping chunk. 215dc11dd5dSJosef Bacik */ 216ee22184bSByongho Lee ret = test_add_free_space_entry(cache, SZ_1M, SZ_4M, 1); 217dc11dd5dSJosef Bacik if (ret) { 218*3c7251f2SDavid Sterba test_err("couldn't add to a bitmap %d", ret); 219dc11dd5dSJosef Bacik return ret; 220dc11dd5dSJosef Bacik } 221dc11dd5dSJosef Bacik 222ee22184bSByongho Lee ret = btrfs_remove_free_space(cache, SZ_512K, 3 * SZ_1M); 223dc11dd5dSJosef Bacik if (ret) { 224*3c7251f2SDavid Sterba test_err("couldn't remove overlapping space %d", ret); 225dc11dd5dSJosef Bacik return ret; 226dc11dd5dSJosef Bacik } 227dc11dd5dSJosef Bacik 228ee22184bSByongho Lee if (test_check_exists(cache, SZ_512K, 3 * SZ_1M)) { 229*3c7251f2SDavid Sterba test_err("left over pieces after removing overlapping"); 230dc11dd5dSJosef Bacik return -1; 231dc11dd5dSJosef Bacik } 232dc11dd5dSJosef Bacik 233dc11dd5dSJosef Bacik __btrfs_remove_free_space_cache(cache->free_space_ctl); 234dc11dd5dSJosef Bacik 235dc11dd5dSJosef Bacik /* Now with the extent entry offset into the bitmap */ 236ee22184bSByongho Lee ret = test_add_free_space_entry(cache, SZ_4M, SZ_4M, 1); 237dc11dd5dSJosef Bacik if (ret) { 238*3c7251f2SDavid Sterba test_err("couldn't add space to the bitmap %d", ret); 239dc11dd5dSJosef Bacik return ret; 240dc11dd5dSJosef Bacik } 241dc11dd5dSJosef Bacik 242ee22184bSByongho Lee ret = test_add_free_space_entry(cache, SZ_2M, SZ_2M, 0); 243dc11dd5dSJosef Bacik if (ret) { 244*3c7251f2SDavid Sterba test_err("couldn't add extent to the cache %d", ret); 245dc11dd5dSJosef Bacik return ret; 246dc11dd5dSJosef Bacik } 247dc11dd5dSJosef Bacik 248ee22184bSByongho Lee ret = btrfs_remove_free_space(cache, 3 * SZ_1M, SZ_4M); 249dc11dd5dSJosef Bacik if (ret) { 250*3c7251f2SDavid Sterba test_err("problem removing overlapping space %d", ret); 251dc11dd5dSJosef Bacik return ret; 252dc11dd5dSJosef Bacik } 253dc11dd5dSJosef Bacik 254ee22184bSByongho Lee if (test_check_exists(cache, 3 * SZ_1M, SZ_4M)) { 255*3c7251f2SDavid Sterba test_err("left something behind when removing space"); 256dc11dd5dSJosef Bacik return -1; 257dc11dd5dSJosef Bacik } 258dc11dd5dSJosef Bacik 259dc11dd5dSJosef Bacik /* 260dc11dd5dSJosef Bacik * This has blown up in the past, the extent entry starts before the 261dc11dd5dSJosef Bacik * bitmap entry, but we're trying to remove an offset that falls 262dc11dd5dSJosef Bacik * completely within the bitmap range and is in both the extent entry 263dc11dd5dSJosef Bacik * and the bitmap entry, looks like this 264dc11dd5dSJosef Bacik * 265dc11dd5dSJosef Bacik * [ extent ] 266dc11dd5dSJosef Bacik * [ bitmap ] 267dc11dd5dSJosef Bacik * [ del ] 268dc11dd5dSJosef Bacik */ 269dc11dd5dSJosef Bacik __btrfs_remove_free_space_cache(cache->free_space_ctl); 270ee22184bSByongho Lee ret = test_add_free_space_entry(cache, bitmap_offset + SZ_4M, SZ_4M, 1); 271dc11dd5dSJosef Bacik if (ret) { 272*3c7251f2SDavid Sterba test_err("couldn't add bitmap %d", ret); 273dc11dd5dSJosef Bacik return ret; 274dc11dd5dSJosef Bacik } 275dc11dd5dSJosef Bacik 276ee22184bSByongho Lee ret = test_add_free_space_entry(cache, bitmap_offset - SZ_1M, 277ee22184bSByongho Lee 5 * SZ_1M, 0); 278dc11dd5dSJosef Bacik if (ret) { 279*3c7251f2SDavid Sterba test_err("couldn't add extent entry %d", ret); 280dc11dd5dSJosef Bacik return ret; 281dc11dd5dSJosef Bacik } 282dc11dd5dSJosef Bacik 283ee22184bSByongho Lee ret = btrfs_remove_free_space(cache, bitmap_offset + SZ_1M, 5 * SZ_1M); 284dc11dd5dSJosef Bacik if (ret) { 285*3c7251f2SDavid Sterba test_err("failed to free our space %d", ret); 286dc11dd5dSJosef Bacik return ret; 287dc11dd5dSJosef Bacik } 288dc11dd5dSJosef Bacik 289ee22184bSByongho Lee if (test_check_exists(cache, bitmap_offset + SZ_1M, 5 * SZ_1M)) { 290*3c7251f2SDavid Sterba test_err("left stuff over"); 291dc11dd5dSJosef Bacik return -1; 292dc11dd5dSJosef Bacik } 293dc11dd5dSJosef Bacik 294dc11dd5dSJosef Bacik __btrfs_remove_free_space_cache(cache->free_space_ctl); 295dc11dd5dSJosef Bacik 296dc11dd5dSJosef Bacik /* 297dc11dd5dSJosef Bacik * This blew up before, we have part of the free space in a bitmap and 298dc11dd5dSJosef Bacik * then the entirety of the rest of the space in an extent. This used 299dc11dd5dSJosef Bacik * to return -EAGAIN back from btrfs_remove_extent, make sure this 300dc11dd5dSJosef Bacik * doesn't happen. 301dc11dd5dSJosef Bacik */ 302ee22184bSByongho Lee ret = test_add_free_space_entry(cache, SZ_1M, SZ_2M, 1); 303dc11dd5dSJosef Bacik if (ret) { 304*3c7251f2SDavid Sterba test_err("couldn't add bitmap entry %d", ret); 305dc11dd5dSJosef Bacik return ret; 306dc11dd5dSJosef Bacik } 307dc11dd5dSJosef Bacik 308ee22184bSByongho Lee ret = test_add_free_space_entry(cache, 3 * SZ_1M, SZ_1M, 0); 309dc11dd5dSJosef Bacik if (ret) { 310*3c7251f2SDavid Sterba test_err("couldn't add extent entry %d", ret); 311dc11dd5dSJosef Bacik return ret; 312dc11dd5dSJosef Bacik } 313dc11dd5dSJosef Bacik 314ee22184bSByongho Lee ret = btrfs_remove_free_space(cache, SZ_1M, 3 * SZ_1M); 315dc11dd5dSJosef Bacik if (ret) { 316*3c7251f2SDavid Sterba test_err("error removing bitmap and extent overlapping %d", ret); 317dc11dd5dSJosef Bacik return ret; 318dc11dd5dSJosef Bacik } 319dc11dd5dSJosef Bacik 320dc11dd5dSJosef Bacik __btrfs_remove_free_space_cache(cache->free_space_ctl); 321dc11dd5dSJosef Bacik return 0; 322dc11dd5dSJosef Bacik } 323dc11dd5dSJosef Bacik 32420005523SFilipe Manana /* Used by test_steal_space_from_bitmap_to_extent(). */ 32520005523SFilipe Manana static bool test_use_bitmap(struct btrfs_free_space_ctl *ctl, 32620005523SFilipe Manana struct btrfs_free_space *info) 32720005523SFilipe Manana { 32820005523SFilipe Manana return ctl->free_extents > 0; 32920005523SFilipe Manana } 33020005523SFilipe Manana 33120005523SFilipe Manana /* Used by test_steal_space_from_bitmap_to_extent(). */ 33220005523SFilipe Manana static int 33320005523SFilipe Manana check_num_extents_and_bitmaps(const struct btrfs_block_group_cache *cache, 33420005523SFilipe Manana const int num_extents, 33520005523SFilipe Manana const int num_bitmaps) 33620005523SFilipe Manana { 33720005523SFilipe Manana if (cache->free_space_ctl->free_extents != num_extents) { 338*3c7251f2SDavid Sterba test_err( 339*3c7251f2SDavid Sterba "incorrect # of extent entries in the cache: %d, expected %d", 34020005523SFilipe Manana cache->free_space_ctl->free_extents, num_extents); 34120005523SFilipe Manana return -EINVAL; 34220005523SFilipe Manana } 34320005523SFilipe Manana if (cache->free_space_ctl->total_bitmaps != num_bitmaps) { 344*3c7251f2SDavid Sterba test_err( 345*3c7251f2SDavid Sterba "incorrect # of extent entries in the cache: %d, expected %d", 34620005523SFilipe Manana cache->free_space_ctl->total_bitmaps, num_bitmaps); 34720005523SFilipe Manana return -EINVAL; 34820005523SFilipe Manana } 34920005523SFilipe Manana return 0; 35020005523SFilipe Manana } 35120005523SFilipe Manana 35220005523SFilipe Manana /* Used by test_steal_space_from_bitmap_to_extent(). */ 35320005523SFilipe Manana static int check_cache_empty(struct btrfs_block_group_cache *cache) 35420005523SFilipe Manana { 35520005523SFilipe Manana u64 offset; 35620005523SFilipe Manana u64 max_extent_size; 35720005523SFilipe Manana 35820005523SFilipe Manana /* 35920005523SFilipe Manana * Now lets confirm that there's absolutely no free space left to 36020005523SFilipe Manana * allocate. 36120005523SFilipe Manana */ 36220005523SFilipe Manana if (cache->free_space_ctl->free_space != 0) { 363*3c7251f2SDavid Sterba test_err("cache free space is not 0"); 36420005523SFilipe Manana return -EINVAL; 36520005523SFilipe Manana } 36620005523SFilipe Manana 36720005523SFilipe Manana /* And any allocation request, no matter how small, should fail now. */ 36820005523SFilipe Manana offset = btrfs_find_space_for_alloc(cache, 0, 4096, 0, 36920005523SFilipe Manana &max_extent_size); 37020005523SFilipe Manana if (offset != 0) { 371*3c7251f2SDavid Sterba test_err("space allocation did not fail, returned offset: %llu", 37220005523SFilipe Manana offset); 37320005523SFilipe Manana return -EINVAL; 37420005523SFilipe Manana } 37520005523SFilipe Manana 37620005523SFilipe Manana /* And no extent nor bitmap entries in the cache anymore. */ 37720005523SFilipe Manana return check_num_extents_and_bitmaps(cache, 0, 0); 37820005523SFilipe Manana } 37920005523SFilipe Manana 38020005523SFilipe Manana /* 38120005523SFilipe Manana * Before we were able to steal free space from a bitmap entry to an extent 38220005523SFilipe Manana * entry, we could end up with 2 entries representing a contiguous free space. 38320005523SFilipe Manana * One would be an extent entry and the other a bitmap entry. Since in order 38420005523SFilipe Manana * to allocate space to a caller we use only 1 entry, we couldn't return that 38520005523SFilipe Manana * whole range to the caller if it was requested. This forced the caller to 38620005523SFilipe Manana * either assume ENOSPC or perform several smaller space allocations, which 38720005523SFilipe Manana * wasn't optimal as they could be spread all over the block group while under 38820005523SFilipe Manana * concurrency (extra overhead and fragmentation). 38920005523SFilipe Manana * 39001327610SNicholas D Steeves * This stealing approach is beneficial, since we always prefer to allocate 39101327610SNicholas D Steeves * from extent entries, both for clustered and non-clustered allocation 39201327610SNicholas D Steeves * requests. 39320005523SFilipe Manana */ 39420005523SFilipe Manana static int 395b9ef22deSFeifei Xu test_steal_space_from_bitmap_to_extent(struct btrfs_block_group_cache *cache, 396b9ef22deSFeifei Xu u32 sectorsize) 39720005523SFilipe Manana { 39820005523SFilipe Manana int ret; 39920005523SFilipe Manana u64 offset; 40020005523SFilipe Manana u64 max_extent_size; 40120e5506bSDavid Sterba const struct btrfs_free_space_op test_free_space_ops = { 40228f0779aSDavid Sterba .recalc_thresholds = cache->free_space_ctl->op->recalc_thresholds, 40328f0779aSDavid Sterba .use_bitmap = test_use_bitmap, 40428f0779aSDavid Sterba }; 40520e5506bSDavid Sterba const struct btrfs_free_space_op *orig_free_space_ops; 40620005523SFilipe Manana 407*3c7251f2SDavid Sterba test_msg("running space stealing from bitmap to extent\n"); 40820005523SFilipe Manana 40920005523SFilipe Manana /* 41020005523SFilipe Manana * For this test, we want to ensure we end up with an extent entry 41120005523SFilipe Manana * immediately adjacent to a bitmap entry, where the bitmap starts 41220005523SFilipe Manana * at an offset where the extent entry ends. We keep adding and 41320005523SFilipe Manana * removing free space to reach into this state, but to get there 41420005523SFilipe Manana * we need to reach a point where marking new free space doesn't 41520005523SFilipe Manana * result in adding new extent entries or merging the new space 41620005523SFilipe Manana * with existing extent entries - the space ends up being marked 41720005523SFilipe Manana * in an existing bitmap that covers the new free space range. 41820005523SFilipe Manana * 41920005523SFilipe Manana * To get there, we need to reach the threshold defined set at 42020005523SFilipe Manana * cache->free_space_ctl->extents_thresh, which currently is 42120005523SFilipe Manana * 256 extents on a x86_64 system at least, and a few other 42220005523SFilipe Manana * conditions (check free_space_cache.c). Instead of making the 42320005523SFilipe Manana * test much longer and complicated, use a "use_bitmap" operation 42420005523SFilipe Manana * that forces use of bitmaps as soon as we have at least 1 42520005523SFilipe Manana * extent entry. 42620005523SFilipe Manana */ 42728f0779aSDavid Sterba orig_free_space_ops = cache->free_space_ctl->op; 42828f0779aSDavid Sterba cache->free_space_ctl->op = &test_free_space_ops; 42920005523SFilipe Manana 43020005523SFilipe Manana /* 43120005523SFilipe Manana * Extent entry covering free space range [128Mb - 256Kb, 128Mb - 128Kb[ 43220005523SFilipe Manana */ 433ee22184bSByongho Lee ret = test_add_free_space_entry(cache, SZ_128M - SZ_256K, SZ_128K, 0); 43420005523SFilipe Manana if (ret) { 435*3c7251f2SDavid Sterba test_err("couldn't add extent entry %d", ret); 43620005523SFilipe Manana return ret; 43720005523SFilipe Manana } 43820005523SFilipe Manana 43920005523SFilipe Manana /* Bitmap entry covering free space range [128Mb + 512Kb, 256Mb[ */ 440ee22184bSByongho Lee ret = test_add_free_space_entry(cache, SZ_128M + SZ_512K, 441ee22184bSByongho Lee SZ_128M - SZ_512K, 1); 44220005523SFilipe Manana if (ret) { 443*3c7251f2SDavid Sterba test_err("couldn't add bitmap entry %d", ret); 44420005523SFilipe Manana return ret; 44520005523SFilipe Manana } 44620005523SFilipe Manana 44720005523SFilipe Manana ret = check_num_extents_and_bitmaps(cache, 2, 1); 44820005523SFilipe Manana if (ret) 44920005523SFilipe Manana return ret; 45020005523SFilipe Manana 45120005523SFilipe Manana /* 45220005523SFilipe Manana * Now make only the first 256Kb of the bitmap marked as free, so that 45320005523SFilipe Manana * we end up with only the following ranges marked as free space: 45420005523SFilipe Manana * 45520005523SFilipe Manana * [128Mb - 256Kb, 128Mb - 128Kb[ 45620005523SFilipe Manana * [128Mb + 512Kb, 128Mb + 768Kb[ 45720005523SFilipe Manana */ 45820005523SFilipe Manana ret = btrfs_remove_free_space(cache, 459ee22184bSByongho Lee SZ_128M + 768 * SZ_1K, 460ee22184bSByongho Lee SZ_128M - 768 * SZ_1K); 46120005523SFilipe Manana if (ret) { 462*3c7251f2SDavid Sterba test_err("failed to free part of bitmap space %d", ret); 46320005523SFilipe Manana return ret; 46420005523SFilipe Manana } 46520005523SFilipe Manana 46620005523SFilipe Manana /* Confirm that only those 2 ranges are marked as free. */ 467ee22184bSByongho Lee if (!test_check_exists(cache, SZ_128M - SZ_256K, SZ_128K)) { 468*3c7251f2SDavid Sterba test_err("free space range missing"); 46920005523SFilipe Manana return -ENOENT; 47020005523SFilipe Manana } 471ee22184bSByongho Lee if (!test_check_exists(cache, SZ_128M + SZ_512K, SZ_256K)) { 472*3c7251f2SDavid Sterba test_err("free space range missing"); 47320005523SFilipe Manana return -ENOENT; 47420005523SFilipe Manana } 47520005523SFilipe Manana 47620005523SFilipe Manana /* 47720005523SFilipe Manana * Confirm that the bitmap range [128Mb + 768Kb, 256Mb[ isn't marked 47820005523SFilipe Manana * as free anymore. 47920005523SFilipe Manana */ 480ee22184bSByongho Lee if (test_check_exists(cache, SZ_128M + 768 * SZ_1K, 481ee22184bSByongho Lee SZ_128M - 768 * SZ_1K)) { 482*3c7251f2SDavid Sterba test_err("bitmap region not removed from space cache"); 48320005523SFilipe Manana return -EINVAL; 48420005523SFilipe Manana } 48520005523SFilipe Manana 48620005523SFilipe Manana /* 48720005523SFilipe Manana * Confirm that the region [128Mb + 256Kb, 128Mb + 512Kb[, which is 48820005523SFilipe Manana * covered by the bitmap, isn't marked as free. 48920005523SFilipe Manana */ 490ee22184bSByongho Lee if (test_check_exists(cache, SZ_128M + SZ_256K, SZ_256K)) { 491*3c7251f2SDavid Sterba test_err("invalid bitmap region marked as free"); 49220005523SFilipe Manana return -EINVAL; 49320005523SFilipe Manana } 49420005523SFilipe Manana 49520005523SFilipe Manana /* 49620005523SFilipe Manana * Confirm that the region [128Mb, 128Mb + 256Kb[, which is covered 49720005523SFilipe Manana * by the bitmap too, isn't marked as free either. 49820005523SFilipe Manana */ 499ee22184bSByongho Lee if (test_check_exists(cache, SZ_128M, SZ_256K)) { 500*3c7251f2SDavid Sterba test_err("invalid bitmap region marked as free"); 50120005523SFilipe Manana return -EINVAL; 50220005523SFilipe Manana } 50320005523SFilipe Manana 50420005523SFilipe Manana /* 50520005523SFilipe Manana * Now lets mark the region [128Mb, 128Mb + 512Kb[ as free too. But, 50620005523SFilipe Manana * lets make sure the free space cache marks it as free in the bitmap, 50720005523SFilipe Manana * and doesn't insert a new extent entry to represent this region. 50820005523SFilipe Manana */ 509ee22184bSByongho Lee ret = btrfs_add_free_space(cache, SZ_128M, SZ_512K); 51020005523SFilipe Manana if (ret) { 511*3c7251f2SDavid Sterba test_err("error adding free space: %d", ret); 51220005523SFilipe Manana return ret; 51320005523SFilipe Manana } 51420005523SFilipe Manana /* Confirm the region is marked as free. */ 515ee22184bSByongho Lee if (!test_check_exists(cache, SZ_128M, SZ_512K)) { 516*3c7251f2SDavid Sterba test_err("bitmap region not marked as free"); 51720005523SFilipe Manana return -ENOENT; 51820005523SFilipe Manana } 51920005523SFilipe Manana 52020005523SFilipe Manana /* 52120005523SFilipe Manana * Confirm that no new extent entries or bitmap entries were added to 52220005523SFilipe Manana * the cache after adding that free space region. 52320005523SFilipe Manana */ 52420005523SFilipe Manana ret = check_num_extents_and_bitmaps(cache, 2, 1); 52520005523SFilipe Manana if (ret) 52620005523SFilipe Manana return ret; 52720005523SFilipe Manana 52820005523SFilipe Manana /* 52920005523SFilipe Manana * Now lets add a small free space region to the right of the previous 53020005523SFilipe Manana * one, which is not contiguous with it and is part of the bitmap too. 53120005523SFilipe Manana * The goal is to test that the bitmap entry space stealing doesn't 53220005523SFilipe Manana * steal this space region. 53320005523SFilipe Manana */ 534b9ef22deSFeifei Xu ret = btrfs_add_free_space(cache, SZ_128M + SZ_16M, sectorsize); 53520005523SFilipe Manana if (ret) { 536*3c7251f2SDavid Sterba test_err("error adding free space: %d", ret); 53720005523SFilipe Manana return ret; 53820005523SFilipe Manana } 53920005523SFilipe Manana 54020005523SFilipe Manana /* 54120005523SFilipe Manana * Confirm that no new extent entries or bitmap entries were added to 54220005523SFilipe Manana * the cache after adding that free space region. 54320005523SFilipe Manana */ 54420005523SFilipe Manana ret = check_num_extents_and_bitmaps(cache, 2, 1); 54520005523SFilipe Manana if (ret) 54620005523SFilipe Manana return ret; 54720005523SFilipe Manana 54820005523SFilipe Manana /* 54920005523SFilipe Manana * Now mark the region [128Mb - 128Kb, 128Mb[ as free too. This will 55020005523SFilipe Manana * expand the range covered by the existing extent entry that represents 55120005523SFilipe Manana * the free space [128Mb - 256Kb, 128Mb - 128Kb[. 55220005523SFilipe Manana */ 553ee22184bSByongho Lee ret = btrfs_add_free_space(cache, SZ_128M - SZ_128K, SZ_128K); 55420005523SFilipe Manana if (ret) { 555*3c7251f2SDavid Sterba test_err("error adding free space: %d", ret); 55620005523SFilipe Manana return ret; 55720005523SFilipe Manana } 55820005523SFilipe Manana /* Confirm the region is marked as free. */ 559ee22184bSByongho Lee if (!test_check_exists(cache, SZ_128M - SZ_128K, SZ_128K)) { 560*3c7251f2SDavid Sterba test_err("extent region not marked as free"); 56120005523SFilipe Manana return -ENOENT; 56220005523SFilipe Manana } 56320005523SFilipe Manana 56420005523SFilipe Manana /* 56520005523SFilipe Manana * Confirm that our extent entry didn't stole all free space from the 56620005523SFilipe Manana * bitmap, because of the small 4Kb free space region. 56720005523SFilipe Manana */ 56820005523SFilipe Manana ret = check_num_extents_and_bitmaps(cache, 2, 1); 56920005523SFilipe Manana if (ret) 57020005523SFilipe Manana return ret; 57120005523SFilipe Manana 57220005523SFilipe Manana /* 57320005523SFilipe Manana * So now we have the range [128Mb - 256Kb, 128Mb + 768Kb[ as free 57420005523SFilipe Manana * space. Without stealing bitmap free space into extent entry space, 57520005523SFilipe Manana * we would have all this free space represented by 2 entries in the 57620005523SFilipe Manana * cache: 57720005523SFilipe Manana * 57820005523SFilipe Manana * extent entry covering range: [128Mb - 256Kb, 128Mb[ 57920005523SFilipe Manana * bitmap entry covering range: [128Mb, 128Mb + 768Kb[ 58020005523SFilipe Manana * 58120005523SFilipe Manana * Attempting to allocate the whole free space (1Mb) would fail, because 58220005523SFilipe Manana * we can't allocate from multiple entries. 58320005523SFilipe Manana * With the bitmap free space stealing, we get a single extent entry 58420005523SFilipe Manana * that represents the 1Mb free space, and therefore we're able to 58520005523SFilipe Manana * allocate the whole free space at once. 58620005523SFilipe Manana */ 587ee22184bSByongho Lee if (!test_check_exists(cache, SZ_128M - SZ_256K, SZ_1M)) { 588*3c7251f2SDavid Sterba test_err("expected region not marked as free"); 58920005523SFilipe Manana return -ENOENT; 59020005523SFilipe Manana } 59120005523SFilipe Manana 592b9ef22deSFeifei Xu if (cache->free_space_ctl->free_space != (SZ_1M + sectorsize)) { 593*3c7251f2SDavid Sterba test_err("cache free space is not 1Mb + %u", sectorsize); 59420005523SFilipe Manana return -EINVAL; 59520005523SFilipe Manana } 59620005523SFilipe Manana 59720005523SFilipe Manana offset = btrfs_find_space_for_alloc(cache, 598ee22184bSByongho Lee 0, SZ_1M, 0, 59920005523SFilipe Manana &max_extent_size); 600ee22184bSByongho Lee if (offset != (SZ_128M - SZ_256K)) { 601*3c7251f2SDavid Sterba test_err( 602*3c7251f2SDavid Sterba "failed to allocate 1Mb from space cache, returned offset is: %llu", 60320005523SFilipe Manana offset); 60420005523SFilipe Manana return -EINVAL; 60520005523SFilipe Manana } 60620005523SFilipe Manana 607b9ef22deSFeifei Xu /* 608b9ef22deSFeifei Xu * All that remains is a sectorsize free space region in a bitmap. 609b9ef22deSFeifei Xu * Confirm. 610b9ef22deSFeifei Xu */ 61120005523SFilipe Manana ret = check_num_extents_and_bitmaps(cache, 1, 1); 61220005523SFilipe Manana if (ret) 61320005523SFilipe Manana return ret; 61420005523SFilipe Manana 615b9ef22deSFeifei Xu if (cache->free_space_ctl->free_space != sectorsize) { 616*3c7251f2SDavid Sterba test_err("cache free space is not %u", sectorsize); 61720005523SFilipe Manana return -EINVAL; 61820005523SFilipe Manana } 61920005523SFilipe Manana 62020005523SFilipe Manana offset = btrfs_find_space_for_alloc(cache, 621b9ef22deSFeifei Xu 0, sectorsize, 0, 62220005523SFilipe Manana &max_extent_size); 623ee22184bSByongho Lee if (offset != (SZ_128M + SZ_16M)) { 624*3c7251f2SDavid Sterba test_err("failed to allocate %u, returned offset : %llu", 625b9ef22deSFeifei Xu sectorsize, offset); 62620005523SFilipe Manana return -EINVAL; 62720005523SFilipe Manana } 62820005523SFilipe Manana 62920005523SFilipe Manana ret = check_cache_empty(cache); 63020005523SFilipe Manana if (ret) 63120005523SFilipe Manana return ret; 63220005523SFilipe Manana 63320005523SFilipe Manana __btrfs_remove_free_space_cache(cache->free_space_ctl); 63420005523SFilipe Manana 63520005523SFilipe Manana /* 63620005523SFilipe Manana * Now test a similar scenario, but where our extent entry is located 63720005523SFilipe Manana * to the right of the bitmap entry, so that we can check that stealing 63820005523SFilipe Manana * space from a bitmap to the front of an extent entry works. 63920005523SFilipe Manana */ 64020005523SFilipe Manana 64120005523SFilipe Manana /* 64220005523SFilipe Manana * Extent entry covering free space range [128Mb + 128Kb, 128Mb + 256Kb[ 64320005523SFilipe Manana */ 644ee22184bSByongho Lee ret = test_add_free_space_entry(cache, SZ_128M + SZ_128K, SZ_128K, 0); 64520005523SFilipe Manana if (ret) { 646*3c7251f2SDavid Sterba test_err("couldn't add extent entry %d", ret); 64720005523SFilipe Manana return ret; 64820005523SFilipe Manana } 64920005523SFilipe Manana 65020005523SFilipe Manana /* Bitmap entry covering free space range [0, 128Mb - 512Kb[ */ 651ee22184bSByongho Lee ret = test_add_free_space_entry(cache, 0, SZ_128M - SZ_512K, 1); 65220005523SFilipe Manana if (ret) { 653*3c7251f2SDavid Sterba test_err("couldn't add bitmap entry %d", ret); 65420005523SFilipe Manana return ret; 65520005523SFilipe Manana } 65620005523SFilipe Manana 65720005523SFilipe Manana ret = check_num_extents_and_bitmaps(cache, 2, 1); 65820005523SFilipe Manana if (ret) 65920005523SFilipe Manana return ret; 66020005523SFilipe Manana 66120005523SFilipe Manana /* 66220005523SFilipe Manana * Now make only the last 256Kb of the bitmap marked as free, so that 66320005523SFilipe Manana * we end up with only the following ranges marked as free space: 66420005523SFilipe Manana * 66520005523SFilipe Manana * [128Mb + 128b, 128Mb + 256Kb[ 66620005523SFilipe Manana * [128Mb - 768Kb, 128Mb - 512Kb[ 66720005523SFilipe Manana */ 668ee22184bSByongho Lee ret = btrfs_remove_free_space(cache, 0, SZ_128M - 768 * SZ_1K); 66920005523SFilipe Manana if (ret) { 670*3c7251f2SDavid Sterba test_err("failed to free part of bitmap space %d", ret); 67120005523SFilipe Manana return ret; 67220005523SFilipe Manana } 67320005523SFilipe Manana 67420005523SFilipe Manana /* Confirm that only those 2 ranges are marked as free. */ 675ee22184bSByongho Lee if (!test_check_exists(cache, SZ_128M + SZ_128K, SZ_128K)) { 676*3c7251f2SDavid Sterba test_err("free space range missing"); 67720005523SFilipe Manana return -ENOENT; 67820005523SFilipe Manana } 679ee22184bSByongho Lee if (!test_check_exists(cache, SZ_128M - 768 * SZ_1K, SZ_256K)) { 680*3c7251f2SDavid Sterba test_err("free space range missing"); 68120005523SFilipe Manana return -ENOENT; 68220005523SFilipe Manana } 68320005523SFilipe Manana 68420005523SFilipe Manana /* 68520005523SFilipe Manana * Confirm that the bitmap range [0, 128Mb - 768Kb[ isn't marked 68620005523SFilipe Manana * as free anymore. 68720005523SFilipe Manana */ 688ee22184bSByongho Lee if (test_check_exists(cache, 0, SZ_128M - 768 * SZ_1K)) { 689*3c7251f2SDavid Sterba test_err("bitmap region not removed from space cache"); 69020005523SFilipe Manana return -EINVAL; 69120005523SFilipe Manana } 69220005523SFilipe Manana 69320005523SFilipe Manana /* 69420005523SFilipe Manana * Confirm that the region [128Mb - 512Kb, 128Mb[, which is 69520005523SFilipe Manana * covered by the bitmap, isn't marked as free. 69620005523SFilipe Manana */ 697ee22184bSByongho Lee if (test_check_exists(cache, SZ_128M - SZ_512K, SZ_512K)) { 698*3c7251f2SDavid Sterba test_err("invalid bitmap region marked as free"); 69920005523SFilipe Manana return -EINVAL; 70020005523SFilipe Manana } 70120005523SFilipe Manana 70220005523SFilipe Manana /* 70320005523SFilipe Manana * Now lets mark the region [128Mb - 512Kb, 128Mb[ as free too. But, 70420005523SFilipe Manana * lets make sure the free space cache marks it as free in the bitmap, 70520005523SFilipe Manana * and doesn't insert a new extent entry to represent this region. 70620005523SFilipe Manana */ 707ee22184bSByongho Lee ret = btrfs_add_free_space(cache, SZ_128M - SZ_512K, SZ_512K); 70820005523SFilipe Manana if (ret) { 709*3c7251f2SDavid Sterba test_err("error adding free space: %d", ret); 71020005523SFilipe Manana return ret; 71120005523SFilipe Manana } 71220005523SFilipe Manana /* Confirm the region is marked as free. */ 713ee22184bSByongho Lee if (!test_check_exists(cache, SZ_128M - SZ_512K, SZ_512K)) { 714*3c7251f2SDavid Sterba test_err("bitmap region not marked as free"); 71520005523SFilipe Manana return -ENOENT; 71620005523SFilipe Manana } 71720005523SFilipe Manana 71820005523SFilipe Manana /* 71920005523SFilipe Manana * Confirm that no new extent entries or bitmap entries were added to 72020005523SFilipe Manana * the cache after adding that free space region. 72120005523SFilipe Manana */ 72220005523SFilipe Manana ret = check_num_extents_and_bitmaps(cache, 2, 1); 72320005523SFilipe Manana if (ret) 72420005523SFilipe Manana return ret; 72520005523SFilipe Manana 72620005523SFilipe Manana /* 72720005523SFilipe Manana * Now lets add a small free space region to the left of the previous 72820005523SFilipe Manana * one, which is not contiguous with it and is part of the bitmap too. 72920005523SFilipe Manana * The goal is to test that the bitmap entry space stealing doesn't 73020005523SFilipe Manana * steal this space region. 73120005523SFilipe Manana */ 732b9ef22deSFeifei Xu ret = btrfs_add_free_space(cache, SZ_32M, 2 * sectorsize); 73320005523SFilipe Manana if (ret) { 734*3c7251f2SDavid Sterba test_err("error adding free space: %d", ret); 73520005523SFilipe Manana return ret; 73620005523SFilipe Manana } 73720005523SFilipe Manana 73820005523SFilipe Manana /* 73920005523SFilipe Manana * Now mark the region [128Mb, 128Mb + 128Kb[ as free too. This will 74020005523SFilipe Manana * expand the range covered by the existing extent entry that represents 74120005523SFilipe Manana * the free space [128Mb + 128Kb, 128Mb + 256Kb[. 74220005523SFilipe Manana */ 743ee22184bSByongho Lee ret = btrfs_add_free_space(cache, SZ_128M, SZ_128K); 74420005523SFilipe Manana if (ret) { 745*3c7251f2SDavid Sterba test_err("error adding free space: %d", ret); 74620005523SFilipe Manana return ret; 74720005523SFilipe Manana } 74820005523SFilipe Manana /* Confirm the region is marked as free. */ 749ee22184bSByongho Lee if (!test_check_exists(cache, SZ_128M, SZ_128K)) { 750*3c7251f2SDavid Sterba test_err("extent region not marked as free"); 75120005523SFilipe Manana return -ENOENT; 75220005523SFilipe Manana } 75320005523SFilipe Manana 75420005523SFilipe Manana /* 75520005523SFilipe Manana * Confirm that our extent entry didn't stole all free space from the 756b9ef22deSFeifei Xu * bitmap, because of the small 2 * sectorsize free space region. 75720005523SFilipe Manana */ 75820005523SFilipe Manana ret = check_num_extents_and_bitmaps(cache, 2, 1); 75920005523SFilipe Manana if (ret) 76020005523SFilipe Manana return ret; 76120005523SFilipe Manana 76220005523SFilipe Manana /* 76320005523SFilipe Manana * So now we have the range [128Mb - 768Kb, 128Mb + 256Kb[ as free 76420005523SFilipe Manana * space. Without stealing bitmap free space into extent entry space, 76520005523SFilipe Manana * we would have all this free space represented by 2 entries in the 76620005523SFilipe Manana * cache: 76720005523SFilipe Manana * 76820005523SFilipe Manana * extent entry covering range: [128Mb, 128Mb + 256Kb[ 76920005523SFilipe Manana * bitmap entry covering range: [128Mb - 768Kb, 128Mb[ 77020005523SFilipe Manana * 77120005523SFilipe Manana * Attempting to allocate the whole free space (1Mb) would fail, because 77220005523SFilipe Manana * we can't allocate from multiple entries. 77320005523SFilipe Manana * With the bitmap free space stealing, we get a single extent entry 77420005523SFilipe Manana * that represents the 1Mb free space, and therefore we're able to 77520005523SFilipe Manana * allocate the whole free space at once. 77620005523SFilipe Manana */ 777ee22184bSByongho Lee if (!test_check_exists(cache, SZ_128M - 768 * SZ_1K, SZ_1M)) { 778*3c7251f2SDavid Sterba test_err("expected region not marked as free"); 77920005523SFilipe Manana return -ENOENT; 78020005523SFilipe Manana } 78120005523SFilipe Manana 782b9ef22deSFeifei Xu if (cache->free_space_ctl->free_space != (SZ_1M + 2 * sectorsize)) { 783*3c7251f2SDavid Sterba test_err("cache free space is not 1Mb + %u", 2 * sectorsize); 78420005523SFilipe Manana return -EINVAL; 78520005523SFilipe Manana } 78620005523SFilipe Manana 787ee22184bSByongho Lee offset = btrfs_find_space_for_alloc(cache, 0, SZ_1M, 0, 78820005523SFilipe Manana &max_extent_size); 789ee22184bSByongho Lee if (offset != (SZ_128M - 768 * SZ_1K)) { 790*3c7251f2SDavid Sterba test_err( 791*3c7251f2SDavid Sterba "failed to allocate 1Mb from space cache, returned offset is: %llu", 79220005523SFilipe Manana offset); 79320005523SFilipe Manana return -EINVAL; 79420005523SFilipe Manana } 79520005523SFilipe Manana 796b9ef22deSFeifei Xu /* 797b9ef22deSFeifei Xu * All that remains is 2 * sectorsize free space region 798b9ef22deSFeifei Xu * in a bitmap. Confirm. 799b9ef22deSFeifei Xu */ 80020005523SFilipe Manana ret = check_num_extents_and_bitmaps(cache, 1, 1); 80120005523SFilipe Manana if (ret) 80220005523SFilipe Manana return ret; 80320005523SFilipe Manana 804b9ef22deSFeifei Xu if (cache->free_space_ctl->free_space != 2 * sectorsize) { 805*3c7251f2SDavid Sterba test_err("cache free space is not %u", 2 * sectorsize); 80620005523SFilipe Manana return -EINVAL; 80720005523SFilipe Manana } 80820005523SFilipe Manana 80920005523SFilipe Manana offset = btrfs_find_space_for_alloc(cache, 810b9ef22deSFeifei Xu 0, 2 * sectorsize, 0, 81120005523SFilipe Manana &max_extent_size); 812ee22184bSByongho Lee if (offset != SZ_32M) { 813*3c7251f2SDavid Sterba test_err("failed to allocate %u, offset: %llu", 814*3c7251f2SDavid Sterba 2 * sectorsize, offset); 81520005523SFilipe Manana return -EINVAL; 81620005523SFilipe Manana } 81720005523SFilipe Manana 81820005523SFilipe Manana ret = check_cache_empty(cache); 81920005523SFilipe Manana if (ret) 82020005523SFilipe Manana return ret; 82120005523SFilipe Manana 82228f0779aSDavid Sterba cache->free_space_ctl->op = orig_free_space_ops; 82320005523SFilipe Manana __btrfs_remove_free_space_cache(cache->free_space_ctl); 82420005523SFilipe Manana 82520005523SFilipe Manana return 0; 82620005523SFilipe Manana } 82720005523SFilipe Manana 828b9ef22deSFeifei Xu int btrfs_test_free_space_cache(u32 sectorsize, u32 nodesize) 829dc11dd5dSJosef Bacik { 8307c0260eeSJeff Mahoney struct btrfs_fs_info *fs_info; 831dc11dd5dSJosef Bacik struct btrfs_block_group_cache *cache; 832d0bd4560SJosef Bacik struct btrfs_root *root = NULL; 833d0bd4560SJosef Bacik int ret = -ENOMEM; 834dc11dd5dSJosef Bacik 835*3c7251f2SDavid Sterba test_msg("running btrfs free space cache tests\n"); 836da17066cSJeff Mahoney fs_info = btrfs_alloc_dummy_fs_info(nodesize, sectorsize); 837da17066cSJeff Mahoney if (!fs_info) 838da17066cSJeff Mahoney return -ENOMEM; 839da17066cSJeff Mahoney 840dc11dd5dSJosef Bacik 84136b3dc05SFeifei Xu /* 84236b3dc05SFeifei Xu * For ppc64 (with 64k page size), bytes per bitmap might be 84336b3dc05SFeifei Xu * larger than 1G. To make bitmap test available in ppc64, 84436b3dc05SFeifei Xu * alloc dummy block group whose size cross bitmaps. 84536b3dc05SFeifei Xu */ 846da17066cSJeff Mahoney cache = btrfs_alloc_dummy_block_group(fs_info, 847da17066cSJeff Mahoney BITS_PER_BITMAP * sectorsize + PAGE_SIZE); 848dc11dd5dSJosef Bacik if (!cache) { 849*3c7251f2SDavid Sterba test_err("couldn't run the tests"); 850da17066cSJeff Mahoney btrfs_free_dummy_fs_info(fs_info); 851dc11dd5dSJosef Bacik return 0; 852dc11dd5dSJosef Bacik } 853dc11dd5dSJosef Bacik 854da17066cSJeff Mahoney root = btrfs_alloc_dummy_root(fs_info); 85589b6c8d1SDan Carpenter if (IS_ERR(root)) { 85689b6c8d1SDan Carpenter ret = PTR_ERR(root); 857d0bd4560SJosef Bacik goto out; 85889b6c8d1SDan Carpenter } 859d0bd4560SJosef Bacik 860d0bd4560SJosef Bacik root->fs_info->extent_root = root; 861d0bd4560SJosef Bacik 862dc11dd5dSJosef Bacik ret = test_extents(cache); 863dc11dd5dSJosef Bacik if (ret) 864dc11dd5dSJosef Bacik goto out; 865b9ef22deSFeifei Xu ret = test_bitmaps(cache, sectorsize); 866dc11dd5dSJosef Bacik if (ret) 867dc11dd5dSJosef Bacik goto out; 868b9ef22deSFeifei Xu ret = test_bitmaps_and_extents(cache, sectorsize); 869dc11dd5dSJosef Bacik if (ret) 870dc11dd5dSJosef Bacik goto out; 87120005523SFilipe Manana 872b9ef22deSFeifei Xu ret = test_steal_space_from_bitmap_to_extent(cache, sectorsize); 873dc11dd5dSJosef Bacik out: 8747c55ee0cSOmar Sandoval btrfs_free_dummy_block_group(cache); 875d0bd4560SJosef Bacik btrfs_free_dummy_root(root); 8767c0260eeSJeff Mahoney btrfs_free_dummy_fs_info(fs_info); 877*3c7251f2SDavid Sterba test_msg("free space cache tests finished\n"); 878dc11dd5dSJosef Bacik return ret; 879dc11dd5dSJosef Bacik } 880