1dc11dd5dSJosef Bacik /* 2dc11dd5dSJosef Bacik * Copyright (C) 2013 Fusion IO. All rights reserved. 3dc11dd5dSJosef Bacik * 4dc11dd5dSJosef Bacik * This program is free software; you can redistribute it and/or 5dc11dd5dSJosef Bacik * modify it under the terms of the GNU General Public 6dc11dd5dSJosef Bacik * License v2 as published by the Free Software Foundation. 7dc11dd5dSJosef Bacik * 8dc11dd5dSJosef Bacik * This program is distributed in the hope that it will be useful, 9dc11dd5dSJosef Bacik * but WITHOUT ANY WARRANTY; without even the implied warranty of 10dc11dd5dSJosef Bacik * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 11dc11dd5dSJosef Bacik * General Public License for more details. 12dc11dd5dSJosef Bacik * 13dc11dd5dSJosef Bacik * You should have received a copy of the GNU General Public 14dc11dd5dSJosef Bacik * License along with this program; if not, write to the 15dc11dd5dSJosef Bacik * Free Software Foundation, Inc., 59 Temple Place - Suite 330, 16dc11dd5dSJosef Bacik * Boston, MA 021110-1307, USA. 17dc11dd5dSJosef Bacik */ 18dc11dd5dSJosef Bacik 19dc11dd5dSJosef Bacik #include <linux/slab.h> 20dc11dd5dSJosef Bacik #include "btrfs-tests.h" 21dc11dd5dSJosef Bacik #include "../ctree.h" 22d0bd4560SJosef Bacik #include "../disk-io.h" 23dc11dd5dSJosef Bacik #include "../free-space-cache.h" 24dc11dd5dSJosef Bacik 250ef6447aSFeifei Xu #define BITS_PER_BITMAP (PAGE_SIZE * 8UL) 26dc11dd5dSJosef Bacik 27dc11dd5dSJosef Bacik /* 2801327610SNicholas D Steeves * This test just does basic sanity checking, making sure we can add an extent 29dc11dd5dSJosef Bacik * entry and remove space from either end and the middle, and make sure we can 30dc11dd5dSJosef Bacik * remove space that covers adjacent extent entries. 31dc11dd5dSJosef Bacik */ 32dc11dd5dSJosef Bacik static int test_extents(struct btrfs_block_group_cache *cache) 33dc11dd5dSJosef Bacik { 34dc11dd5dSJosef Bacik int ret = 0; 35dc11dd5dSJosef Bacik 36dc11dd5dSJosef Bacik test_msg("Running extent only tests\n"); 37dc11dd5dSJosef Bacik 38dc11dd5dSJosef Bacik /* First just make sure we can remove an entire entry */ 39ee22184bSByongho Lee ret = btrfs_add_free_space(cache, 0, SZ_4M); 40dc11dd5dSJosef Bacik if (ret) { 41dc11dd5dSJosef Bacik test_msg("Error adding initial extents %d\n", ret); 42dc11dd5dSJosef Bacik return ret; 43dc11dd5dSJosef Bacik } 44dc11dd5dSJosef Bacik 45ee22184bSByongho Lee ret = btrfs_remove_free_space(cache, 0, SZ_4M); 46dc11dd5dSJosef Bacik if (ret) { 47dc11dd5dSJosef Bacik test_msg("Error removing extent %d\n", ret); 48dc11dd5dSJosef Bacik return ret; 49dc11dd5dSJosef Bacik } 50dc11dd5dSJosef Bacik 51ee22184bSByongho Lee if (test_check_exists(cache, 0, SZ_4M)) { 52dc11dd5dSJosef Bacik test_msg("Full remove left some lingering space\n"); 53dc11dd5dSJosef Bacik return -1; 54dc11dd5dSJosef Bacik } 55dc11dd5dSJosef Bacik 56dc11dd5dSJosef Bacik /* Ok edge and middle cases now */ 57ee22184bSByongho Lee ret = btrfs_add_free_space(cache, 0, SZ_4M); 58dc11dd5dSJosef Bacik if (ret) { 59dc11dd5dSJosef Bacik test_msg("Error adding half extent %d\n", ret); 60dc11dd5dSJosef Bacik return ret; 61dc11dd5dSJosef Bacik } 62dc11dd5dSJosef Bacik 63ee22184bSByongho Lee ret = btrfs_remove_free_space(cache, 3 * SZ_1M, SZ_1M); 64dc11dd5dSJosef Bacik if (ret) { 65dc11dd5dSJosef Bacik test_msg("Error removing tail end %d\n", ret); 66dc11dd5dSJosef Bacik return ret; 67dc11dd5dSJosef Bacik } 68dc11dd5dSJosef Bacik 69ee22184bSByongho Lee ret = btrfs_remove_free_space(cache, 0, SZ_1M); 70dc11dd5dSJosef Bacik if (ret) { 71dc11dd5dSJosef Bacik test_msg("Error removing front end %d\n", ret); 72dc11dd5dSJosef Bacik return ret; 73dc11dd5dSJosef Bacik } 74dc11dd5dSJosef Bacik 75ee22184bSByongho Lee ret = btrfs_remove_free_space(cache, SZ_2M, 4096); 76dc11dd5dSJosef Bacik if (ret) { 7777d84ff8SMasanari Iida test_msg("Error removing middle piece %d\n", ret); 78dc11dd5dSJosef Bacik return ret; 79dc11dd5dSJosef Bacik } 80dc11dd5dSJosef Bacik 81ee22184bSByongho Lee if (test_check_exists(cache, 0, SZ_1M)) { 82dc11dd5dSJosef Bacik test_msg("Still have space at the front\n"); 83dc11dd5dSJosef Bacik return -1; 84dc11dd5dSJosef Bacik } 85dc11dd5dSJosef Bacik 86ee22184bSByongho Lee if (test_check_exists(cache, SZ_2M, 4096)) { 87dc11dd5dSJosef Bacik test_msg("Still have space in the middle\n"); 88dc11dd5dSJosef Bacik return -1; 89dc11dd5dSJosef Bacik } 90dc11dd5dSJosef Bacik 91ee22184bSByongho Lee if (test_check_exists(cache, 3 * SZ_1M, SZ_1M)) { 92dc11dd5dSJosef Bacik test_msg("Still have space at the end\n"); 93dc11dd5dSJosef Bacik return -1; 94dc11dd5dSJosef Bacik } 95dc11dd5dSJosef Bacik 96dc11dd5dSJosef Bacik /* Cleanup */ 97dc11dd5dSJosef Bacik __btrfs_remove_free_space_cache(cache->free_space_ctl); 98dc11dd5dSJosef Bacik 99dc11dd5dSJosef Bacik return 0; 100dc11dd5dSJosef Bacik } 101dc11dd5dSJosef Bacik 102*b9ef22deSFeifei Xu static int test_bitmaps(struct btrfs_block_group_cache *cache, 103*b9ef22deSFeifei Xu u32 sectorsize) 104dc11dd5dSJosef Bacik { 105dc11dd5dSJosef Bacik u64 next_bitmap_offset; 106dc11dd5dSJosef Bacik int ret; 107dc11dd5dSJosef Bacik 108dc11dd5dSJosef Bacik test_msg("Running bitmap only tests\n"); 109dc11dd5dSJosef Bacik 110ee22184bSByongho Lee ret = test_add_free_space_entry(cache, 0, SZ_4M, 1); 111dc11dd5dSJosef Bacik if (ret) { 112dc11dd5dSJosef Bacik test_msg("Couldn't create a bitmap entry %d\n", ret); 113dc11dd5dSJosef Bacik return ret; 114dc11dd5dSJosef Bacik } 115dc11dd5dSJosef Bacik 116ee22184bSByongho Lee ret = btrfs_remove_free_space(cache, 0, SZ_4M); 117dc11dd5dSJosef Bacik if (ret) { 118dc11dd5dSJosef Bacik test_msg("Error removing bitmap full range %d\n", ret); 119dc11dd5dSJosef Bacik return ret; 120dc11dd5dSJosef Bacik } 121dc11dd5dSJosef Bacik 122ee22184bSByongho Lee if (test_check_exists(cache, 0, SZ_4M)) { 123dc11dd5dSJosef Bacik test_msg("Left some space in bitmap\n"); 124dc11dd5dSJosef Bacik return -1; 125dc11dd5dSJosef Bacik } 126dc11dd5dSJosef Bacik 127ee22184bSByongho Lee ret = test_add_free_space_entry(cache, 0, SZ_4M, 1); 128dc11dd5dSJosef Bacik if (ret) { 129dc11dd5dSJosef Bacik test_msg("Couldn't add to our bitmap entry %d\n", ret); 130dc11dd5dSJosef Bacik return ret; 131dc11dd5dSJosef Bacik } 132dc11dd5dSJosef Bacik 133ee22184bSByongho Lee ret = btrfs_remove_free_space(cache, SZ_1M, SZ_2M); 134dc11dd5dSJosef Bacik if (ret) { 135dc11dd5dSJosef Bacik test_msg("Couldn't remove middle chunk %d\n", ret); 136dc11dd5dSJosef Bacik return ret; 137dc11dd5dSJosef Bacik } 138dc11dd5dSJosef Bacik 139dc11dd5dSJosef Bacik /* 140dc11dd5dSJosef Bacik * The first bitmap we have starts at offset 0 so the next one is just 141dc11dd5dSJosef Bacik * at the end of the first bitmap. 142dc11dd5dSJosef Bacik */ 143*b9ef22deSFeifei Xu next_bitmap_offset = (u64)(BITS_PER_BITMAP * sectorsize); 144dc11dd5dSJosef Bacik 145dc11dd5dSJosef Bacik /* Test a bit straddling two bitmaps */ 146ee22184bSByongho Lee ret = test_add_free_space_entry(cache, next_bitmap_offset - SZ_2M, 147ee22184bSByongho Lee SZ_4M, 1); 148dc11dd5dSJosef Bacik if (ret) { 149dc11dd5dSJosef Bacik test_msg("Couldn't add space that straddles two bitmaps %d\n", 150dc11dd5dSJosef Bacik ret); 151dc11dd5dSJosef Bacik return ret; 152dc11dd5dSJosef Bacik } 153dc11dd5dSJosef Bacik 154ee22184bSByongho Lee ret = btrfs_remove_free_space(cache, next_bitmap_offset - SZ_1M, SZ_2M); 155dc11dd5dSJosef Bacik if (ret) { 156dc11dd5dSJosef Bacik test_msg("Couldn't remove overlapping space %d\n", ret); 157dc11dd5dSJosef Bacik return ret; 158dc11dd5dSJosef Bacik } 159dc11dd5dSJosef Bacik 160ee22184bSByongho Lee if (test_check_exists(cache, next_bitmap_offset - SZ_1M, SZ_2M)) { 161dc11dd5dSJosef Bacik test_msg("Left some space when removing overlapping\n"); 162dc11dd5dSJosef Bacik return -1; 163dc11dd5dSJosef Bacik } 164dc11dd5dSJosef Bacik 165dc11dd5dSJosef Bacik __btrfs_remove_free_space_cache(cache->free_space_ctl); 166dc11dd5dSJosef Bacik 167dc11dd5dSJosef Bacik return 0; 168dc11dd5dSJosef Bacik } 169dc11dd5dSJosef Bacik 170dc11dd5dSJosef Bacik /* This is the high grade jackassery */ 171*b9ef22deSFeifei Xu static int test_bitmaps_and_extents(struct btrfs_block_group_cache *cache, 172*b9ef22deSFeifei Xu u32 sectorsize) 173dc11dd5dSJosef Bacik { 174*b9ef22deSFeifei Xu u64 bitmap_offset = (u64)(BITS_PER_BITMAP * sectorsize); 175dc11dd5dSJosef Bacik int ret; 176dc11dd5dSJosef Bacik 177dc11dd5dSJosef Bacik test_msg("Running bitmap and extent tests\n"); 178dc11dd5dSJosef Bacik 179dc11dd5dSJosef Bacik /* 180dc11dd5dSJosef Bacik * First let's do something simple, an extent at the same offset as the 181dc11dd5dSJosef Bacik * bitmap, but the free space completely in the extent and then 182dc11dd5dSJosef Bacik * completely in the bitmap. 183dc11dd5dSJosef Bacik */ 184ee22184bSByongho Lee ret = test_add_free_space_entry(cache, SZ_4M, SZ_1M, 1); 185dc11dd5dSJosef Bacik if (ret) { 186dc11dd5dSJosef Bacik test_msg("Couldn't create bitmap entry %d\n", ret); 187dc11dd5dSJosef Bacik return ret; 188dc11dd5dSJosef Bacik } 189dc11dd5dSJosef Bacik 190ee22184bSByongho Lee ret = test_add_free_space_entry(cache, 0, SZ_1M, 0); 191dc11dd5dSJosef Bacik if (ret) { 192dc11dd5dSJosef Bacik test_msg("Couldn't add extent entry %d\n", ret); 193dc11dd5dSJosef Bacik return ret; 194dc11dd5dSJosef Bacik } 195dc11dd5dSJosef Bacik 196ee22184bSByongho Lee ret = btrfs_remove_free_space(cache, 0, SZ_1M); 197dc11dd5dSJosef Bacik if (ret) { 198dc11dd5dSJosef Bacik test_msg("Couldn't remove extent entry %d\n", ret); 199dc11dd5dSJosef Bacik return ret; 200dc11dd5dSJosef Bacik } 201dc11dd5dSJosef Bacik 202ee22184bSByongho Lee if (test_check_exists(cache, 0, SZ_1M)) { 203dc11dd5dSJosef Bacik test_msg("Left remnants after our remove\n"); 204dc11dd5dSJosef Bacik return -1; 205dc11dd5dSJosef Bacik } 206dc11dd5dSJosef Bacik 207dc11dd5dSJosef Bacik /* Now to add back the extent entry and remove from the bitmap */ 208ee22184bSByongho Lee ret = test_add_free_space_entry(cache, 0, SZ_1M, 0); 209dc11dd5dSJosef Bacik if (ret) { 210dc11dd5dSJosef Bacik test_msg("Couldn't re-add extent entry %d\n", ret); 211dc11dd5dSJosef Bacik return ret; 212dc11dd5dSJosef Bacik } 213dc11dd5dSJosef Bacik 214ee22184bSByongho Lee ret = btrfs_remove_free_space(cache, SZ_4M, SZ_1M); 215dc11dd5dSJosef Bacik if (ret) { 216dc11dd5dSJosef Bacik test_msg("Couldn't remove from bitmap %d\n", ret); 217dc11dd5dSJosef Bacik return ret; 218dc11dd5dSJosef Bacik } 219dc11dd5dSJosef Bacik 220ee22184bSByongho Lee if (test_check_exists(cache, SZ_4M, SZ_1M)) { 221dc11dd5dSJosef Bacik test_msg("Left remnants in the bitmap\n"); 222dc11dd5dSJosef Bacik return -1; 223dc11dd5dSJosef Bacik } 224dc11dd5dSJosef Bacik 225dc11dd5dSJosef Bacik /* 226dc11dd5dSJosef Bacik * Ok so a little more evil, extent entry and bitmap at the same offset, 227dc11dd5dSJosef Bacik * removing an overlapping chunk. 228dc11dd5dSJosef Bacik */ 229ee22184bSByongho Lee ret = test_add_free_space_entry(cache, SZ_1M, SZ_4M, 1); 230dc11dd5dSJosef Bacik if (ret) { 231dc11dd5dSJosef Bacik test_msg("Couldn't add to a bitmap %d\n", ret); 232dc11dd5dSJosef Bacik return ret; 233dc11dd5dSJosef Bacik } 234dc11dd5dSJosef Bacik 235ee22184bSByongho Lee ret = btrfs_remove_free_space(cache, SZ_512K, 3 * SZ_1M); 236dc11dd5dSJosef Bacik if (ret) { 237dc11dd5dSJosef Bacik test_msg("Couldn't remove overlapping space %d\n", ret); 238dc11dd5dSJosef Bacik return ret; 239dc11dd5dSJosef Bacik } 240dc11dd5dSJosef Bacik 241ee22184bSByongho Lee if (test_check_exists(cache, SZ_512K, 3 * SZ_1M)) { 2428faaaeadSMasanari Iida test_msg("Left over pieces after removing overlapping\n"); 243dc11dd5dSJosef Bacik return -1; 244dc11dd5dSJosef Bacik } 245dc11dd5dSJosef Bacik 246dc11dd5dSJosef Bacik __btrfs_remove_free_space_cache(cache->free_space_ctl); 247dc11dd5dSJosef Bacik 248dc11dd5dSJosef Bacik /* Now with the extent entry offset into the bitmap */ 249ee22184bSByongho Lee ret = test_add_free_space_entry(cache, SZ_4M, SZ_4M, 1); 250dc11dd5dSJosef Bacik if (ret) { 251dc11dd5dSJosef Bacik test_msg("Couldn't add space to the bitmap %d\n", ret); 252dc11dd5dSJosef Bacik return ret; 253dc11dd5dSJosef Bacik } 254dc11dd5dSJosef Bacik 255ee22184bSByongho Lee ret = test_add_free_space_entry(cache, SZ_2M, SZ_2M, 0); 256dc11dd5dSJosef Bacik if (ret) { 257dc11dd5dSJosef Bacik test_msg("Couldn't add extent to the cache %d\n", ret); 258dc11dd5dSJosef Bacik return ret; 259dc11dd5dSJosef Bacik } 260dc11dd5dSJosef Bacik 261ee22184bSByongho Lee ret = btrfs_remove_free_space(cache, 3 * SZ_1M, SZ_4M); 262dc11dd5dSJosef Bacik if (ret) { 263dc11dd5dSJosef Bacik test_msg("Problem removing overlapping space %d\n", ret); 264dc11dd5dSJosef Bacik return ret; 265dc11dd5dSJosef Bacik } 266dc11dd5dSJosef Bacik 267ee22184bSByongho Lee if (test_check_exists(cache, 3 * SZ_1M, SZ_4M)) { 268dc11dd5dSJosef Bacik test_msg("Left something behind when removing space"); 269dc11dd5dSJosef Bacik return -1; 270dc11dd5dSJosef Bacik } 271dc11dd5dSJosef Bacik 272dc11dd5dSJosef Bacik /* 273dc11dd5dSJosef Bacik * This has blown up in the past, the extent entry starts before the 274dc11dd5dSJosef Bacik * bitmap entry, but we're trying to remove an offset that falls 275dc11dd5dSJosef Bacik * completely within the bitmap range and is in both the extent entry 276dc11dd5dSJosef Bacik * and the bitmap entry, looks like this 277dc11dd5dSJosef Bacik * 278dc11dd5dSJosef Bacik * [ extent ] 279dc11dd5dSJosef Bacik * [ bitmap ] 280dc11dd5dSJosef Bacik * [ del ] 281dc11dd5dSJosef Bacik */ 282dc11dd5dSJosef Bacik __btrfs_remove_free_space_cache(cache->free_space_ctl); 283ee22184bSByongho Lee ret = test_add_free_space_entry(cache, bitmap_offset + SZ_4M, SZ_4M, 1); 284dc11dd5dSJosef Bacik if (ret) { 285dc11dd5dSJosef Bacik test_msg("Couldn't add bitmap %d\n", ret); 286dc11dd5dSJosef Bacik return ret; 287dc11dd5dSJosef Bacik } 288dc11dd5dSJosef Bacik 289ee22184bSByongho Lee ret = test_add_free_space_entry(cache, bitmap_offset - SZ_1M, 290ee22184bSByongho Lee 5 * SZ_1M, 0); 291dc11dd5dSJosef Bacik if (ret) { 292dc11dd5dSJosef Bacik test_msg("Couldn't add extent entry %d\n", ret); 293dc11dd5dSJosef Bacik return ret; 294dc11dd5dSJosef Bacik } 295dc11dd5dSJosef Bacik 296ee22184bSByongho Lee ret = btrfs_remove_free_space(cache, bitmap_offset + SZ_1M, 5 * SZ_1M); 297dc11dd5dSJosef Bacik if (ret) { 298dc11dd5dSJosef Bacik test_msg("Failed to free our space %d\n", ret); 299dc11dd5dSJosef Bacik return ret; 300dc11dd5dSJosef Bacik } 301dc11dd5dSJosef Bacik 302ee22184bSByongho Lee if (test_check_exists(cache, bitmap_offset + SZ_1M, 5 * SZ_1M)) { 303dc11dd5dSJosef Bacik test_msg("Left stuff over\n"); 304dc11dd5dSJosef Bacik return -1; 305dc11dd5dSJosef Bacik } 306dc11dd5dSJosef Bacik 307dc11dd5dSJosef Bacik __btrfs_remove_free_space_cache(cache->free_space_ctl); 308dc11dd5dSJosef Bacik 309dc11dd5dSJosef Bacik /* 310dc11dd5dSJosef Bacik * This blew up before, we have part of the free space in a bitmap and 311dc11dd5dSJosef Bacik * then the entirety of the rest of the space in an extent. This used 312dc11dd5dSJosef Bacik * to return -EAGAIN back from btrfs_remove_extent, make sure this 313dc11dd5dSJosef Bacik * doesn't happen. 314dc11dd5dSJosef Bacik */ 315ee22184bSByongho Lee ret = test_add_free_space_entry(cache, SZ_1M, SZ_2M, 1); 316dc11dd5dSJosef Bacik if (ret) { 317dc11dd5dSJosef Bacik test_msg("Couldn't add bitmap entry %d\n", ret); 318dc11dd5dSJosef Bacik return ret; 319dc11dd5dSJosef Bacik } 320dc11dd5dSJosef Bacik 321ee22184bSByongho Lee ret = test_add_free_space_entry(cache, 3 * SZ_1M, SZ_1M, 0); 322dc11dd5dSJosef Bacik if (ret) { 323dc11dd5dSJosef Bacik test_msg("Couldn't add extent entry %d\n", ret); 324dc11dd5dSJosef Bacik return ret; 325dc11dd5dSJosef Bacik } 326dc11dd5dSJosef Bacik 327ee22184bSByongho Lee ret = btrfs_remove_free_space(cache, SZ_1M, 3 * SZ_1M); 328dc11dd5dSJosef Bacik if (ret) { 329dc11dd5dSJosef Bacik test_msg("Error removing bitmap and extent overlapping %d\n", ret); 330dc11dd5dSJosef Bacik return ret; 331dc11dd5dSJosef Bacik } 332dc11dd5dSJosef Bacik 333dc11dd5dSJosef Bacik __btrfs_remove_free_space_cache(cache->free_space_ctl); 334dc11dd5dSJosef Bacik return 0; 335dc11dd5dSJosef Bacik } 336dc11dd5dSJosef Bacik 33720005523SFilipe Manana /* Used by test_steal_space_from_bitmap_to_extent(). */ 33820005523SFilipe Manana static bool test_use_bitmap(struct btrfs_free_space_ctl *ctl, 33920005523SFilipe Manana struct btrfs_free_space *info) 34020005523SFilipe Manana { 34120005523SFilipe Manana return ctl->free_extents > 0; 34220005523SFilipe Manana } 34320005523SFilipe Manana 34420005523SFilipe Manana /* Used by test_steal_space_from_bitmap_to_extent(). */ 34520005523SFilipe Manana static int 34620005523SFilipe Manana check_num_extents_and_bitmaps(const struct btrfs_block_group_cache *cache, 34720005523SFilipe Manana const int num_extents, 34820005523SFilipe Manana const int num_bitmaps) 34920005523SFilipe Manana { 35020005523SFilipe Manana if (cache->free_space_ctl->free_extents != num_extents) { 35120005523SFilipe Manana test_msg("Incorrect # of extent entries in the cache: %d, expected %d\n", 35220005523SFilipe Manana cache->free_space_ctl->free_extents, num_extents); 35320005523SFilipe Manana return -EINVAL; 35420005523SFilipe Manana } 35520005523SFilipe Manana if (cache->free_space_ctl->total_bitmaps != num_bitmaps) { 35620005523SFilipe Manana test_msg("Incorrect # of extent entries in the cache: %d, expected %d\n", 35720005523SFilipe Manana cache->free_space_ctl->total_bitmaps, num_bitmaps); 35820005523SFilipe Manana return -EINVAL; 35920005523SFilipe Manana } 36020005523SFilipe Manana return 0; 36120005523SFilipe Manana } 36220005523SFilipe Manana 36320005523SFilipe Manana /* Used by test_steal_space_from_bitmap_to_extent(). */ 36420005523SFilipe Manana static int check_cache_empty(struct btrfs_block_group_cache *cache) 36520005523SFilipe Manana { 36620005523SFilipe Manana u64 offset; 36720005523SFilipe Manana u64 max_extent_size; 36820005523SFilipe Manana 36920005523SFilipe Manana /* 37020005523SFilipe Manana * Now lets confirm that there's absolutely no free space left to 37120005523SFilipe Manana * allocate. 37220005523SFilipe Manana */ 37320005523SFilipe Manana if (cache->free_space_ctl->free_space != 0) { 37420005523SFilipe Manana test_msg("Cache free space is not 0\n"); 37520005523SFilipe Manana return -EINVAL; 37620005523SFilipe Manana } 37720005523SFilipe Manana 37820005523SFilipe Manana /* And any allocation request, no matter how small, should fail now. */ 37920005523SFilipe Manana offset = btrfs_find_space_for_alloc(cache, 0, 4096, 0, 38020005523SFilipe Manana &max_extent_size); 38120005523SFilipe Manana if (offset != 0) { 38220005523SFilipe Manana test_msg("Space allocation did not fail, returned offset: %llu", 38320005523SFilipe Manana offset); 38420005523SFilipe Manana return -EINVAL; 38520005523SFilipe Manana } 38620005523SFilipe Manana 38720005523SFilipe Manana /* And no extent nor bitmap entries in the cache anymore. */ 38820005523SFilipe Manana return check_num_extents_and_bitmaps(cache, 0, 0); 38920005523SFilipe Manana } 39020005523SFilipe Manana 39120005523SFilipe Manana /* 39220005523SFilipe Manana * Before we were able to steal free space from a bitmap entry to an extent 39320005523SFilipe Manana * entry, we could end up with 2 entries representing a contiguous free space. 39420005523SFilipe Manana * One would be an extent entry and the other a bitmap entry. Since in order 39520005523SFilipe Manana * to allocate space to a caller we use only 1 entry, we couldn't return that 39620005523SFilipe Manana * whole range to the caller if it was requested. This forced the caller to 39720005523SFilipe Manana * either assume ENOSPC or perform several smaller space allocations, which 39820005523SFilipe Manana * wasn't optimal as they could be spread all over the block group while under 39920005523SFilipe Manana * concurrency (extra overhead and fragmentation). 40020005523SFilipe Manana * 40101327610SNicholas D Steeves * This stealing approach is beneficial, since we always prefer to allocate 40201327610SNicholas D Steeves * from extent entries, both for clustered and non-clustered allocation 40301327610SNicholas D Steeves * requests. 40420005523SFilipe Manana */ 40520005523SFilipe Manana static int 406*b9ef22deSFeifei Xu test_steal_space_from_bitmap_to_extent(struct btrfs_block_group_cache *cache, 407*b9ef22deSFeifei Xu u32 sectorsize) 40820005523SFilipe Manana { 40920005523SFilipe Manana int ret; 41020005523SFilipe Manana u64 offset; 41120005523SFilipe Manana u64 max_extent_size; 41220e5506bSDavid Sterba const struct btrfs_free_space_op test_free_space_ops = { 41328f0779aSDavid Sterba .recalc_thresholds = cache->free_space_ctl->op->recalc_thresholds, 41428f0779aSDavid Sterba .use_bitmap = test_use_bitmap, 41528f0779aSDavid Sterba }; 41620e5506bSDavid Sterba const struct btrfs_free_space_op *orig_free_space_ops; 41720005523SFilipe Manana 41820005523SFilipe Manana test_msg("Running space stealing from bitmap to extent\n"); 41920005523SFilipe Manana 42020005523SFilipe Manana /* 42120005523SFilipe Manana * For this test, we want to ensure we end up with an extent entry 42220005523SFilipe Manana * immediately adjacent to a bitmap entry, where the bitmap starts 42320005523SFilipe Manana * at an offset where the extent entry ends. We keep adding and 42420005523SFilipe Manana * removing free space to reach into this state, but to get there 42520005523SFilipe Manana * we need to reach a point where marking new free space doesn't 42620005523SFilipe Manana * result in adding new extent entries or merging the new space 42720005523SFilipe Manana * with existing extent entries - the space ends up being marked 42820005523SFilipe Manana * in an existing bitmap that covers the new free space range. 42920005523SFilipe Manana * 43020005523SFilipe Manana * To get there, we need to reach the threshold defined set at 43120005523SFilipe Manana * cache->free_space_ctl->extents_thresh, which currently is 43220005523SFilipe Manana * 256 extents on a x86_64 system at least, and a few other 43320005523SFilipe Manana * conditions (check free_space_cache.c). Instead of making the 43420005523SFilipe Manana * test much longer and complicated, use a "use_bitmap" operation 43520005523SFilipe Manana * that forces use of bitmaps as soon as we have at least 1 43620005523SFilipe Manana * extent entry. 43720005523SFilipe Manana */ 43828f0779aSDavid Sterba orig_free_space_ops = cache->free_space_ctl->op; 43928f0779aSDavid Sterba cache->free_space_ctl->op = &test_free_space_ops; 44020005523SFilipe Manana 44120005523SFilipe Manana /* 44220005523SFilipe Manana * Extent entry covering free space range [128Mb - 256Kb, 128Mb - 128Kb[ 44320005523SFilipe Manana */ 444ee22184bSByongho Lee ret = test_add_free_space_entry(cache, SZ_128M - SZ_256K, SZ_128K, 0); 44520005523SFilipe Manana if (ret) { 44620005523SFilipe Manana test_msg("Couldn't add extent entry %d\n", ret); 44720005523SFilipe Manana return ret; 44820005523SFilipe Manana } 44920005523SFilipe Manana 45020005523SFilipe Manana /* Bitmap entry covering free space range [128Mb + 512Kb, 256Mb[ */ 451ee22184bSByongho Lee ret = test_add_free_space_entry(cache, SZ_128M + SZ_512K, 452ee22184bSByongho Lee SZ_128M - SZ_512K, 1); 45320005523SFilipe Manana if (ret) { 45420005523SFilipe Manana test_msg("Couldn't add bitmap entry %d\n", ret); 45520005523SFilipe Manana return ret; 45620005523SFilipe Manana } 45720005523SFilipe Manana 45820005523SFilipe Manana ret = check_num_extents_and_bitmaps(cache, 2, 1); 45920005523SFilipe Manana if (ret) 46020005523SFilipe Manana return ret; 46120005523SFilipe Manana 46220005523SFilipe Manana /* 46320005523SFilipe Manana * Now make only the first 256Kb of the bitmap marked as free, so that 46420005523SFilipe Manana * we end up with only the following ranges marked as free space: 46520005523SFilipe Manana * 46620005523SFilipe Manana * [128Mb - 256Kb, 128Mb - 128Kb[ 46720005523SFilipe Manana * [128Mb + 512Kb, 128Mb + 768Kb[ 46820005523SFilipe Manana */ 46920005523SFilipe Manana ret = btrfs_remove_free_space(cache, 470ee22184bSByongho Lee SZ_128M + 768 * SZ_1K, 471ee22184bSByongho Lee SZ_128M - 768 * SZ_1K); 47220005523SFilipe Manana if (ret) { 47320005523SFilipe Manana test_msg("Failed to free part of bitmap space %d\n", ret); 47420005523SFilipe Manana return ret; 47520005523SFilipe Manana } 47620005523SFilipe Manana 47720005523SFilipe Manana /* Confirm that only those 2 ranges are marked as free. */ 478ee22184bSByongho Lee if (!test_check_exists(cache, SZ_128M - SZ_256K, SZ_128K)) { 47920005523SFilipe Manana test_msg("Free space range missing\n"); 48020005523SFilipe Manana return -ENOENT; 48120005523SFilipe Manana } 482ee22184bSByongho Lee if (!test_check_exists(cache, SZ_128M + SZ_512K, SZ_256K)) { 48320005523SFilipe Manana test_msg("Free space range missing\n"); 48420005523SFilipe Manana return -ENOENT; 48520005523SFilipe Manana } 48620005523SFilipe Manana 48720005523SFilipe Manana /* 48820005523SFilipe Manana * Confirm that the bitmap range [128Mb + 768Kb, 256Mb[ isn't marked 48920005523SFilipe Manana * as free anymore. 49020005523SFilipe Manana */ 491ee22184bSByongho Lee if (test_check_exists(cache, SZ_128M + 768 * SZ_1K, 492ee22184bSByongho Lee SZ_128M - 768 * SZ_1K)) { 49320005523SFilipe Manana test_msg("Bitmap region not removed from space cache\n"); 49420005523SFilipe Manana return -EINVAL; 49520005523SFilipe Manana } 49620005523SFilipe Manana 49720005523SFilipe Manana /* 49820005523SFilipe Manana * Confirm that the region [128Mb + 256Kb, 128Mb + 512Kb[, which is 49920005523SFilipe Manana * covered by the bitmap, isn't marked as free. 50020005523SFilipe Manana */ 501ee22184bSByongho Lee if (test_check_exists(cache, SZ_128M + SZ_256K, SZ_256K)) { 50220005523SFilipe Manana test_msg("Invalid bitmap region marked as free\n"); 50320005523SFilipe Manana return -EINVAL; 50420005523SFilipe Manana } 50520005523SFilipe Manana 50620005523SFilipe Manana /* 50720005523SFilipe Manana * Confirm that the region [128Mb, 128Mb + 256Kb[, which is covered 50820005523SFilipe Manana * by the bitmap too, isn't marked as free either. 50920005523SFilipe Manana */ 510ee22184bSByongho Lee if (test_check_exists(cache, SZ_128M, SZ_256K)) { 51120005523SFilipe Manana test_msg("Invalid bitmap region marked as free\n"); 51220005523SFilipe Manana return -EINVAL; 51320005523SFilipe Manana } 51420005523SFilipe Manana 51520005523SFilipe Manana /* 51620005523SFilipe Manana * Now lets mark the region [128Mb, 128Mb + 512Kb[ as free too. But, 51720005523SFilipe Manana * lets make sure the free space cache marks it as free in the bitmap, 51820005523SFilipe Manana * and doesn't insert a new extent entry to represent this region. 51920005523SFilipe Manana */ 520ee22184bSByongho Lee ret = btrfs_add_free_space(cache, SZ_128M, SZ_512K); 52120005523SFilipe Manana if (ret) { 52220005523SFilipe Manana test_msg("Error adding free space: %d\n", ret); 52320005523SFilipe Manana return ret; 52420005523SFilipe Manana } 52520005523SFilipe Manana /* Confirm the region is marked as free. */ 526ee22184bSByongho Lee if (!test_check_exists(cache, SZ_128M, SZ_512K)) { 52720005523SFilipe Manana test_msg("Bitmap region not marked as free\n"); 52820005523SFilipe Manana return -ENOENT; 52920005523SFilipe Manana } 53020005523SFilipe Manana 53120005523SFilipe Manana /* 53220005523SFilipe Manana * Confirm that no new extent entries or bitmap entries were added to 53320005523SFilipe Manana * the cache after adding that free space region. 53420005523SFilipe Manana */ 53520005523SFilipe Manana ret = check_num_extents_and_bitmaps(cache, 2, 1); 53620005523SFilipe Manana if (ret) 53720005523SFilipe Manana return ret; 53820005523SFilipe Manana 53920005523SFilipe Manana /* 54020005523SFilipe Manana * Now lets add a small free space region to the right of the previous 54120005523SFilipe Manana * one, which is not contiguous with it and is part of the bitmap too. 54220005523SFilipe Manana * The goal is to test that the bitmap entry space stealing doesn't 54320005523SFilipe Manana * steal this space region. 54420005523SFilipe Manana */ 545*b9ef22deSFeifei Xu ret = btrfs_add_free_space(cache, SZ_128M + SZ_16M, sectorsize); 54620005523SFilipe Manana if (ret) { 54720005523SFilipe Manana test_msg("Error adding free space: %d\n", ret); 54820005523SFilipe Manana return ret; 54920005523SFilipe Manana } 55020005523SFilipe Manana 55120005523SFilipe Manana /* 55220005523SFilipe Manana * Confirm that no new extent entries or bitmap entries were added to 55320005523SFilipe Manana * the cache after adding that free space region. 55420005523SFilipe Manana */ 55520005523SFilipe Manana ret = check_num_extents_and_bitmaps(cache, 2, 1); 55620005523SFilipe Manana if (ret) 55720005523SFilipe Manana return ret; 55820005523SFilipe Manana 55920005523SFilipe Manana /* 56020005523SFilipe Manana * Now mark the region [128Mb - 128Kb, 128Mb[ as free too. This will 56120005523SFilipe Manana * expand the range covered by the existing extent entry that represents 56220005523SFilipe Manana * the free space [128Mb - 256Kb, 128Mb - 128Kb[. 56320005523SFilipe Manana */ 564ee22184bSByongho Lee ret = btrfs_add_free_space(cache, SZ_128M - SZ_128K, SZ_128K); 56520005523SFilipe Manana if (ret) { 56620005523SFilipe Manana test_msg("Error adding free space: %d\n", ret); 56720005523SFilipe Manana return ret; 56820005523SFilipe Manana } 56920005523SFilipe Manana /* Confirm the region is marked as free. */ 570ee22184bSByongho Lee if (!test_check_exists(cache, SZ_128M - SZ_128K, SZ_128K)) { 57120005523SFilipe Manana test_msg("Extent region not marked as free\n"); 57220005523SFilipe Manana return -ENOENT; 57320005523SFilipe Manana } 57420005523SFilipe Manana 57520005523SFilipe Manana /* 57620005523SFilipe Manana * Confirm that our extent entry didn't stole all free space from the 57720005523SFilipe Manana * bitmap, because of the small 4Kb free space region. 57820005523SFilipe Manana */ 57920005523SFilipe Manana ret = check_num_extents_and_bitmaps(cache, 2, 1); 58020005523SFilipe Manana if (ret) 58120005523SFilipe Manana return ret; 58220005523SFilipe Manana 58320005523SFilipe Manana /* 58420005523SFilipe Manana * So now we have the range [128Mb - 256Kb, 128Mb + 768Kb[ as free 58520005523SFilipe Manana * space. Without stealing bitmap free space into extent entry space, 58620005523SFilipe Manana * we would have all this free space represented by 2 entries in the 58720005523SFilipe Manana * cache: 58820005523SFilipe Manana * 58920005523SFilipe Manana * extent entry covering range: [128Mb - 256Kb, 128Mb[ 59020005523SFilipe Manana * bitmap entry covering range: [128Mb, 128Mb + 768Kb[ 59120005523SFilipe Manana * 59220005523SFilipe Manana * Attempting to allocate the whole free space (1Mb) would fail, because 59320005523SFilipe Manana * we can't allocate from multiple entries. 59420005523SFilipe Manana * With the bitmap free space stealing, we get a single extent entry 59520005523SFilipe Manana * that represents the 1Mb free space, and therefore we're able to 59620005523SFilipe Manana * allocate the whole free space at once. 59720005523SFilipe Manana */ 598ee22184bSByongho Lee if (!test_check_exists(cache, SZ_128M - SZ_256K, SZ_1M)) { 59920005523SFilipe Manana test_msg("Expected region not marked as free\n"); 60020005523SFilipe Manana return -ENOENT; 60120005523SFilipe Manana } 60220005523SFilipe Manana 603*b9ef22deSFeifei Xu if (cache->free_space_ctl->free_space != (SZ_1M + sectorsize)) { 604*b9ef22deSFeifei Xu test_msg("Cache free space is not 1Mb + %u\n", sectorsize); 60520005523SFilipe Manana return -EINVAL; 60620005523SFilipe Manana } 60720005523SFilipe Manana 60820005523SFilipe Manana offset = btrfs_find_space_for_alloc(cache, 609ee22184bSByongho Lee 0, SZ_1M, 0, 61020005523SFilipe Manana &max_extent_size); 611ee22184bSByongho Lee if (offset != (SZ_128M - SZ_256K)) { 61220005523SFilipe Manana test_msg("Failed to allocate 1Mb from space cache, returned offset is: %llu\n", 61320005523SFilipe Manana offset); 61420005523SFilipe Manana return -EINVAL; 61520005523SFilipe Manana } 61620005523SFilipe Manana 617*b9ef22deSFeifei Xu /* 618*b9ef22deSFeifei Xu * All that remains is a sectorsize free space region in a bitmap. 619*b9ef22deSFeifei Xu * Confirm. 620*b9ef22deSFeifei Xu */ 62120005523SFilipe Manana ret = check_num_extents_and_bitmaps(cache, 1, 1); 62220005523SFilipe Manana if (ret) 62320005523SFilipe Manana return ret; 62420005523SFilipe Manana 625*b9ef22deSFeifei Xu if (cache->free_space_ctl->free_space != sectorsize) { 626*b9ef22deSFeifei Xu test_msg("Cache free space is not %u\n", sectorsize); 62720005523SFilipe Manana return -EINVAL; 62820005523SFilipe Manana } 62920005523SFilipe Manana 63020005523SFilipe Manana offset = btrfs_find_space_for_alloc(cache, 631*b9ef22deSFeifei Xu 0, sectorsize, 0, 63220005523SFilipe Manana &max_extent_size); 633ee22184bSByongho Lee if (offset != (SZ_128M + SZ_16M)) { 634*b9ef22deSFeifei Xu test_msg("Failed to allocate %u, returned offset : %llu\n", 635*b9ef22deSFeifei Xu sectorsize, offset); 63620005523SFilipe Manana return -EINVAL; 63720005523SFilipe Manana } 63820005523SFilipe Manana 63920005523SFilipe Manana ret = check_cache_empty(cache); 64020005523SFilipe Manana if (ret) 64120005523SFilipe Manana return ret; 64220005523SFilipe Manana 64320005523SFilipe Manana __btrfs_remove_free_space_cache(cache->free_space_ctl); 64420005523SFilipe Manana 64520005523SFilipe Manana /* 64620005523SFilipe Manana * Now test a similar scenario, but where our extent entry is located 64720005523SFilipe Manana * to the right of the bitmap entry, so that we can check that stealing 64820005523SFilipe Manana * space from a bitmap to the front of an extent entry works. 64920005523SFilipe Manana */ 65020005523SFilipe Manana 65120005523SFilipe Manana /* 65220005523SFilipe Manana * Extent entry covering free space range [128Mb + 128Kb, 128Mb + 256Kb[ 65320005523SFilipe Manana */ 654ee22184bSByongho Lee ret = test_add_free_space_entry(cache, SZ_128M + SZ_128K, SZ_128K, 0); 65520005523SFilipe Manana if (ret) { 65620005523SFilipe Manana test_msg("Couldn't add extent entry %d\n", ret); 65720005523SFilipe Manana return ret; 65820005523SFilipe Manana } 65920005523SFilipe Manana 66020005523SFilipe Manana /* Bitmap entry covering free space range [0, 128Mb - 512Kb[ */ 661ee22184bSByongho Lee ret = test_add_free_space_entry(cache, 0, SZ_128M - SZ_512K, 1); 66220005523SFilipe Manana if (ret) { 66320005523SFilipe Manana test_msg("Couldn't add bitmap entry %d\n", ret); 66420005523SFilipe Manana return ret; 66520005523SFilipe Manana } 66620005523SFilipe Manana 66720005523SFilipe Manana ret = check_num_extents_and_bitmaps(cache, 2, 1); 66820005523SFilipe Manana if (ret) 66920005523SFilipe Manana return ret; 67020005523SFilipe Manana 67120005523SFilipe Manana /* 67220005523SFilipe Manana * Now make only the last 256Kb of the bitmap marked as free, so that 67320005523SFilipe Manana * we end up with only the following ranges marked as free space: 67420005523SFilipe Manana * 67520005523SFilipe Manana * [128Mb + 128b, 128Mb + 256Kb[ 67620005523SFilipe Manana * [128Mb - 768Kb, 128Mb - 512Kb[ 67720005523SFilipe Manana */ 678ee22184bSByongho Lee ret = btrfs_remove_free_space(cache, 0, SZ_128M - 768 * SZ_1K); 67920005523SFilipe Manana if (ret) { 68020005523SFilipe Manana test_msg("Failed to free part of bitmap space %d\n", ret); 68120005523SFilipe Manana return ret; 68220005523SFilipe Manana } 68320005523SFilipe Manana 68420005523SFilipe Manana /* Confirm that only those 2 ranges are marked as free. */ 685ee22184bSByongho Lee if (!test_check_exists(cache, SZ_128M + SZ_128K, SZ_128K)) { 68620005523SFilipe Manana test_msg("Free space range missing\n"); 68720005523SFilipe Manana return -ENOENT; 68820005523SFilipe Manana } 689ee22184bSByongho Lee if (!test_check_exists(cache, SZ_128M - 768 * SZ_1K, SZ_256K)) { 69020005523SFilipe Manana test_msg("Free space range missing\n"); 69120005523SFilipe Manana return -ENOENT; 69220005523SFilipe Manana } 69320005523SFilipe Manana 69420005523SFilipe Manana /* 69520005523SFilipe Manana * Confirm that the bitmap range [0, 128Mb - 768Kb[ isn't marked 69620005523SFilipe Manana * as free anymore. 69720005523SFilipe Manana */ 698ee22184bSByongho Lee if (test_check_exists(cache, 0, SZ_128M - 768 * SZ_1K)) { 69920005523SFilipe Manana test_msg("Bitmap region not removed from space cache\n"); 70020005523SFilipe Manana return -EINVAL; 70120005523SFilipe Manana } 70220005523SFilipe Manana 70320005523SFilipe Manana /* 70420005523SFilipe Manana * Confirm that the region [128Mb - 512Kb, 128Mb[, which is 70520005523SFilipe Manana * covered by the bitmap, isn't marked as free. 70620005523SFilipe Manana */ 707ee22184bSByongho Lee if (test_check_exists(cache, SZ_128M - SZ_512K, SZ_512K)) { 70820005523SFilipe Manana test_msg("Invalid bitmap region marked as free\n"); 70920005523SFilipe Manana return -EINVAL; 71020005523SFilipe Manana } 71120005523SFilipe Manana 71220005523SFilipe Manana /* 71320005523SFilipe Manana * Now lets mark the region [128Mb - 512Kb, 128Mb[ as free too. But, 71420005523SFilipe Manana * lets make sure the free space cache marks it as free in the bitmap, 71520005523SFilipe Manana * and doesn't insert a new extent entry to represent this region. 71620005523SFilipe Manana */ 717ee22184bSByongho Lee ret = btrfs_add_free_space(cache, SZ_128M - SZ_512K, SZ_512K); 71820005523SFilipe Manana if (ret) { 71920005523SFilipe Manana test_msg("Error adding free space: %d\n", ret); 72020005523SFilipe Manana return ret; 72120005523SFilipe Manana } 72220005523SFilipe Manana /* Confirm the region is marked as free. */ 723ee22184bSByongho Lee if (!test_check_exists(cache, SZ_128M - SZ_512K, SZ_512K)) { 72420005523SFilipe Manana test_msg("Bitmap region not marked as free\n"); 72520005523SFilipe Manana return -ENOENT; 72620005523SFilipe Manana } 72720005523SFilipe Manana 72820005523SFilipe Manana /* 72920005523SFilipe Manana * Confirm that no new extent entries or bitmap entries were added to 73020005523SFilipe Manana * the cache after adding that free space region. 73120005523SFilipe Manana */ 73220005523SFilipe Manana ret = check_num_extents_and_bitmaps(cache, 2, 1); 73320005523SFilipe Manana if (ret) 73420005523SFilipe Manana return ret; 73520005523SFilipe Manana 73620005523SFilipe Manana /* 73720005523SFilipe Manana * Now lets add a small free space region to the left of the previous 73820005523SFilipe Manana * one, which is not contiguous with it and is part of the bitmap too. 73920005523SFilipe Manana * The goal is to test that the bitmap entry space stealing doesn't 74020005523SFilipe Manana * steal this space region. 74120005523SFilipe Manana */ 742*b9ef22deSFeifei Xu ret = btrfs_add_free_space(cache, SZ_32M, 2 * sectorsize); 74320005523SFilipe Manana if (ret) { 74420005523SFilipe Manana test_msg("Error adding free space: %d\n", ret); 74520005523SFilipe Manana return ret; 74620005523SFilipe Manana } 74720005523SFilipe Manana 74820005523SFilipe Manana /* 74920005523SFilipe Manana * Now mark the region [128Mb, 128Mb + 128Kb[ as free too. This will 75020005523SFilipe Manana * expand the range covered by the existing extent entry that represents 75120005523SFilipe Manana * the free space [128Mb + 128Kb, 128Mb + 256Kb[. 75220005523SFilipe Manana */ 753ee22184bSByongho Lee ret = btrfs_add_free_space(cache, SZ_128M, SZ_128K); 75420005523SFilipe Manana if (ret) { 75520005523SFilipe Manana test_msg("Error adding free space: %d\n", ret); 75620005523SFilipe Manana return ret; 75720005523SFilipe Manana } 75820005523SFilipe Manana /* Confirm the region is marked as free. */ 759ee22184bSByongho Lee if (!test_check_exists(cache, SZ_128M, SZ_128K)) { 76020005523SFilipe Manana test_msg("Extent region not marked as free\n"); 76120005523SFilipe Manana return -ENOENT; 76220005523SFilipe Manana } 76320005523SFilipe Manana 76420005523SFilipe Manana /* 76520005523SFilipe Manana * Confirm that our extent entry didn't stole all free space from the 766*b9ef22deSFeifei Xu * bitmap, because of the small 2 * sectorsize free space region. 76720005523SFilipe Manana */ 76820005523SFilipe Manana ret = check_num_extents_and_bitmaps(cache, 2, 1); 76920005523SFilipe Manana if (ret) 77020005523SFilipe Manana return ret; 77120005523SFilipe Manana 77220005523SFilipe Manana /* 77320005523SFilipe Manana * So now we have the range [128Mb - 768Kb, 128Mb + 256Kb[ as free 77420005523SFilipe Manana * space. Without stealing bitmap free space into extent entry space, 77520005523SFilipe Manana * we would have all this free space represented by 2 entries in the 77620005523SFilipe Manana * cache: 77720005523SFilipe Manana * 77820005523SFilipe Manana * extent entry covering range: [128Mb, 128Mb + 256Kb[ 77920005523SFilipe Manana * bitmap entry covering range: [128Mb - 768Kb, 128Mb[ 78020005523SFilipe Manana * 78120005523SFilipe Manana * Attempting to allocate the whole free space (1Mb) would fail, because 78220005523SFilipe Manana * we can't allocate from multiple entries. 78320005523SFilipe Manana * With the bitmap free space stealing, we get a single extent entry 78420005523SFilipe Manana * that represents the 1Mb free space, and therefore we're able to 78520005523SFilipe Manana * allocate the whole free space at once. 78620005523SFilipe Manana */ 787ee22184bSByongho Lee if (!test_check_exists(cache, SZ_128M - 768 * SZ_1K, SZ_1M)) { 78820005523SFilipe Manana test_msg("Expected region not marked as free\n"); 78920005523SFilipe Manana return -ENOENT; 79020005523SFilipe Manana } 79120005523SFilipe Manana 792*b9ef22deSFeifei Xu if (cache->free_space_ctl->free_space != (SZ_1M + 2 * sectorsize)) { 793*b9ef22deSFeifei Xu test_msg("Cache free space is not 1Mb + %u\n", 2 * sectorsize); 79420005523SFilipe Manana return -EINVAL; 79520005523SFilipe Manana } 79620005523SFilipe Manana 797ee22184bSByongho Lee offset = btrfs_find_space_for_alloc(cache, 0, SZ_1M, 0, 79820005523SFilipe Manana &max_extent_size); 799ee22184bSByongho Lee if (offset != (SZ_128M - 768 * SZ_1K)) { 80020005523SFilipe Manana test_msg("Failed to allocate 1Mb from space cache, returned offset is: %llu\n", 80120005523SFilipe Manana offset); 80220005523SFilipe Manana return -EINVAL; 80320005523SFilipe Manana } 80420005523SFilipe Manana 805*b9ef22deSFeifei Xu /* 806*b9ef22deSFeifei Xu * All that remains is 2 * sectorsize free space region 807*b9ef22deSFeifei Xu * in a bitmap. Confirm. 808*b9ef22deSFeifei Xu */ 80920005523SFilipe Manana ret = check_num_extents_and_bitmaps(cache, 1, 1); 81020005523SFilipe Manana if (ret) 81120005523SFilipe Manana return ret; 81220005523SFilipe Manana 813*b9ef22deSFeifei Xu if (cache->free_space_ctl->free_space != 2 * sectorsize) { 814*b9ef22deSFeifei Xu test_msg("Cache free space is not %u\n", 2 * sectorsize); 81520005523SFilipe Manana return -EINVAL; 81620005523SFilipe Manana } 81720005523SFilipe Manana 81820005523SFilipe Manana offset = btrfs_find_space_for_alloc(cache, 819*b9ef22deSFeifei Xu 0, 2 * sectorsize, 0, 82020005523SFilipe Manana &max_extent_size); 821ee22184bSByongho Lee if (offset != SZ_32M) { 822*b9ef22deSFeifei Xu test_msg("Failed to allocate %u, offset: %llu\n", 823*b9ef22deSFeifei Xu 2 * sectorsize, 82420005523SFilipe Manana offset); 82520005523SFilipe Manana return -EINVAL; 82620005523SFilipe Manana } 82720005523SFilipe Manana 82820005523SFilipe Manana ret = check_cache_empty(cache); 82920005523SFilipe Manana if (ret) 83020005523SFilipe Manana return ret; 83120005523SFilipe Manana 83228f0779aSDavid Sterba cache->free_space_ctl->op = orig_free_space_ops; 83320005523SFilipe Manana __btrfs_remove_free_space_cache(cache->free_space_ctl); 83420005523SFilipe Manana 83520005523SFilipe Manana return 0; 83620005523SFilipe Manana } 83720005523SFilipe Manana 838*b9ef22deSFeifei Xu int btrfs_test_free_space_cache(u32 sectorsize, u32 nodesize) 839dc11dd5dSJosef Bacik { 840dc11dd5dSJosef Bacik struct btrfs_block_group_cache *cache; 841d0bd4560SJosef Bacik struct btrfs_root *root = NULL; 842d0bd4560SJosef Bacik int ret = -ENOMEM; 843dc11dd5dSJosef Bacik 844dc11dd5dSJosef Bacik test_msg("Running btrfs free space cache tests\n"); 845dc11dd5dSJosef Bacik 846*b9ef22deSFeifei Xu cache = btrfs_alloc_dummy_block_group(1024 * 1024 * 1024, sectorsize); 847dc11dd5dSJosef Bacik if (!cache) { 848dc11dd5dSJosef Bacik test_msg("Couldn't run the tests\n"); 849dc11dd5dSJosef Bacik return 0; 850dc11dd5dSJosef Bacik } 851dc11dd5dSJosef Bacik 852*b9ef22deSFeifei Xu root = btrfs_alloc_dummy_root(sectorsize, nodesize); 85389b6c8d1SDan Carpenter if (IS_ERR(root)) { 85489b6c8d1SDan Carpenter ret = PTR_ERR(root); 855d0bd4560SJosef Bacik goto out; 85689b6c8d1SDan Carpenter } 857d0bd4560SJosef Bacik 858d0bd4560SJosef Bacik root->fs_info = btrfs_alloc_dummy_fs_info(); 859d0bd4560SJosef Bacik if (!root->fs_info) 860d0bd4560SJosef Bacik goto out; 861d0bd4560SJosef Bacik 862d0bd4560SJosef Bacik root->fs_info->extent_root = root; 863d0bd4560SJosef Bacik cache->fs_info = root->fs_info; 864d0bd4560SJosef Bacik 865dc11dd5dSJosef Bacik ret = test_extents(cache); 866dc11dd5dSJosef Bacik if (ret) 867dc11dd5dSJosef Bacik goto out; 868*b9ef22deSFeifei Xu ret = test_bitmaps(cache, sectorsize); 869dc11dd5dSJosef Bacik if (ret) 870dc11dd5dSJosef Bacik goto out; 871*b9ef22deSFeifei Xu ret = test_bitmaps_and_extents(cache, sectorsize); 872dc11dd5dSJosef Bacik if (ret) 873dc11dd5dSJosef Bacik goto out; 87420005523SFilipe Manana 875*b9ef22deSFeifei 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); 879dc11dd5dSJosef Bacik test_msg("Free space cache tests finished\n"); 880dc11dd5dSJosef Bacik return ret; 881dc11dd5dSJosef Bacik } 882