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 25*0ef6447aSFeifei 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 102dc11dd5dSJosef Bacik static int test_bitmaps(struct btrfs_block_group_cache *cache) 103dc11dd5dSJosef Bacik { 104dc11dd5dSJosef Bacik u64 next_bitmap_offset; 105dc11dd5dSJosef Bacik int ret; 106dc11dd5dSJosef Bacik 107dc11dd5dSJosef Bacik test_msg("Running bitmap only tests\n"); 108dc11dd5dSJosef Bacik 109ee22184bSByongho Lee ret = test_add_free_space_entry(cache, 0, SZ_4M, 1); 110dc11dd5dSJosef Bacik if (ret) { 111dc11dd5dSJosef Bacik test_msg("Couldn't create a bitmap entry %d\n", ret); 112dc11dd5dSJosef Bacik return ret; 113dc11dd5dSJosef Bacik } 114dc11dd5dSJosef Bacik 115ee22184bSByongho Lee ret = btrfs_remove_free_space(cache, 0, SZ_4M); 116dc11dd5dSJosef Bacik if (ret) { 117dc11dd5dSJosef Bacik test_msg("Error removing bitmap full range %d\n", ret); 118dc11dd5dSJosef Bacik return ret; 119dc11dd5dSJosef Bacik } 120dc11dd5dSJosef Bacik 121ee22184bSByongho Lee if (test_check_exists(cache, 0, SZ_4M)) { 122dc11dd5dSJosef Bacik test_msg("Left some space in bitmap\n"); 123dc11dd5dSJosef Bacik return -1; 124dc11dd5dSJosef Bacik } 125dc11dd5dSJosef Bacik 126ee22184bSByongho Lee ret = test_add_free_space_entry(cache, 0, SZ_4M, 1); 127dc11dd5dSJosef Bacik if (ret) { 128dc11dd5dSJosef Bacik test_msg("Couldn't add to our bitmap entry %d\n", ret); 129dc11dd5dSJosef Bacik return ret; 130dc11dd5dSJosef Bacik } 131dc11dd5dSJosef Bacik 132ee22184bSByongho Lee ret = btrfs_remove_free_space(cache, SZ_1M, SZ_2M); 133dc11dd5dSJosef Bacik if (ret) { 134dc11dd5dSJosef Bacik test_msg("Couldn't remove middle chunk %d\n", ret); 135dc11dd5dSJosef Bacik return ret; 136dc11dd5dSJosef Bacik } 137dc11dd5dSJosef Bacik 138dc11dd5dSJosef Bacik /* 139dc11dd5dSJosef Bacik * The first bitmap we have starts at offset 0 so the next one is just 140dc11dd5dSJosef Bacik * at the end of the first bitmap. 141dc11dd5dSJosef Bacik */ 142dc11dd5dSJosef Bacik next_bitmap_offset = (u64)(BITS_PER_BITMAP * 4096); 143dc11dd5dSJosef Bacik 144dc11dd5dSJosef Bacik /* Test a bit straddling two bitmaps */ 145ee22184bSByongho Lee ret = test_add_free_space_entry(cache, next_bitmap_offset - SZ_2M, 146ee22184bSByongho Lee SZ_4M, 1); 147dc11dd5dSJosef Bacik if (ret) { 148dc11dd5dSJosef Bacik test_msg("Couldn't add space that straddles two bitmaps %d\n", 149dc11dd5dSJosef Bacik ret); 150dc11dd5dSJosef Bacik return ret; 151dc11dd5dSJosef Bacik } 152dc11dd5dSJosef Bacik 153ee22184bSByongho Lee ret = btrfs_remove_free_space(cache, next_bitmap_offset - SZ_1M, SZ_2M); 154dc11dd5dSJosef Bacik if (ret) { 155dc11dd5dSJosef Bacik test_msg("Couldn't remove overlapping space %d\n", ret); 156dc11dd5dSJosef Bacik return ret; 157dc11dd5dSJosef Bacik } 158dc11dd5dSJosef Bacik 159ee22184bSByongho Lee if (test_check_exists(cache, next_bitmap_offset - SZ_1M, SZ_2M)) { 160dc11dd5dSJosef Bacik test_msg("Left some space when removing overlapping\n"); 161dc11dd5dSJosef Bacik return -1; 162dc11dd5dSJosef Bacik } 163dc11dd5dSJosef Bacik 164dc11dd5dSJosef Bacik __btrfs_remove_free_space_cache(cache->free_space_ctl); 165dc11dd5dSJosef Bacik 166dc11dd5dSJosef Bacik return 0; 167dc11dd5dSJosef Bacik } 168dc11dd5dSJosef Bacik 169dc11dd5dSJosef Bacik /* This is the high grade jackassery */ 170dc11dd5dSJosef Bacik static int test_bitmaps_and_extents(struct btrfs_block_group_cache *cache) 171dc11dd5dSJosef Bacik { 172dc11dd5dSJosef Bacik u64 bitmap_offset = (u64)(BITS_PER_BITMAP * 4096); 173dc11dd5dSJosef Bacik int ret; 174dc11dd5dSJosef Bacik 175dc11dd5dSJosef Bacik test_msg("Running bitmap and extent tests\n"); 176dc11dd5dSJosef Bacik 177dc11dd5dSJosef Bacik /* 178dc11dd5dSJosef Bacik * First let's do something simple, an extent at the same offset as the 179dc11dd5dSJosef Bacik * bitmap, but the free space completely in the extent and then 180dc11dd5dSJosef Bacik * completely in the bitmap. 181dc11dd5dSJosef Bacik */ 182ee22184bSByongho Lee ret = test_add_free_space_entry(cache, SZ_4M, SZ_1M, 1); 183dc11dd5dSJosef Bacik if (ret) { 184dc11dd5dSJosef Bacik test_msg("Couldn't create bitmap entry %d\n", ret); 185dc11dd5dSJosef Bacik return ret; 186dc11dd5dSJosef Bacik } 187dc11dd5dSJosef Bacik 188ee22184bSByongho Lee ret = test_add_free_space_entry(cache, 0, SZ_1M, 0); 189dc11dd5dSJosef Bacik if (ret) { 190dc11dd5dSJosef Bacik test_msg("Couldn't add extent entry %d\n", ret); 191dc11dd5dSJosef Bacik return ret; 192dc11dd5dSJosef Bacik } 193dc11dd5dSJosef Bacik 194ee22184bSByongho Lee ret = btrfs_remove_free_space(cache, 0, SZ_1M); 195dc11dd5dSJosef Bacik if (ret) { 196dc11dd5dSJosef Bacik test_msg("Couldn't remove extent entry %d\n", ret); 197dc11dd5dSJosef Bacik return ret; 198dc11dd5dSJosef Bacik } 199dc11dd5dSJosef Bacik 200ee22184bSByongho Lee if (test_check_exists(cache, 0, SZ_1M)) { 201dc11dd5dSJosef Bacik test_msg("Left remnants after our remove\n"); 202dc11dd5dSJosef Bacik return -1; 203dc11dd5dSJosef Bacik } 204dc11dd5dSJosef Bacik 205dc11dd5dSJosef Bacik /* Now to add back the extent entry and remove from the bitmap */ 206ee22184bSByongho Lee ret = test_add_free_space_entry(cache, 0, SZ_1M, 0); 207dc11dd5dSJosef Bacik if (ret) { 208dc11dd5dSJosef Bacik test_msg("Couldn't re-add extent entry %d\n", ret); 209dc11dd5dSJosef Bacik return ret; 210dc11dd5dSJosef Bacik } 211dc11dd5dSJosef Bacik 212ee22184bSByongho Lee ret = btrfs_remove_free_space(cache, SZ_4M, SZ_1M); 213dc11dd5dSJosef Bacik if (ret) { 214dc11dd5dSJosef Bacik test_msg("Couldn't remove from bitmap %d\n", ret); 215dc11dd5dSJosef Bacik return ret; 216dc11dd5dSJosef Bacik } 217dc11dd5dSJosef Bacik 218ee22184bSByongho Lee if (test_check_exists(cache, SZ_4M, SZ_1M)) { 219dc11dd5dSJosef Bacik test_msg("Left remnants in the bitmap\n"); 220dc11dd5dSJosef Bacik return -1; 221dc11dd5dSJosef Bacik } 222dc11dd5dSJosef Bacik 223dc11dd5dSJosef Bacik /* 224dc11dd5dSJosef Bacik * Ok so a little more evil, extent entry and bitmap at the same offset, 225dc11dd5dSJosef Bacik * removing an overlapping chunk. 226dc11dd5dSJosef Bacik */ 227ee22184bSByongho Lee ret = test_add_free_space_entry(cache, SZ_1M, SZ_4M, 1); 228dc11dd5dSJosef Bacik if (ret) { 229dc11dd5dSJosef Bacik test_msg("Couldn't add to a bitmap %d\n", ret); 230dc11dd5dSJosef Bacik return ret; 231dc11dd5dSJosef Bacik } 232dc11dd5dSJosef Bacik 233ee22184bSByongho Lee ret = btrfs_remove_free_space(cache, SZ_512K, 3 * SZ_1M); 234dc11dd5dSJosef Bacik if (ret) { 235dc11dd5dSJosef Bacik test_msg("Couldn't remove overlapping space %d\n", ret); 236dc11dd5dSJosef Bacik return ret; 237dc11dd5dSJosef Bacik } 238dc11dd5dSJosef Bacik 239ee22184bSByongho Lee if (test_check_exists(cache, SZ_512K, 3 * SZ_1M)) { 2408faaaeadSMasanari Iida test_msg("Left over pieces after removing overlapping\n"); 241dc11dd5dSJosef Bacik return -1; 242dc11dd5dSJosef Bacik } 243dc11dd5dSJosef Bacik 244dc11dd5dSJosef Bacik __btrfs_remove_free_space_cache(cache->free_space_ctl); 245dc11dd5dSJosef Bacik 246dc11dd5dSJosef Bacik /* Now with the extent entry offset into the bitmap */ 247ee22184bSByongho Lee ret = test_add_free_space_entry(cache, SZ_4M, SZ_4M, 1); 248dc11dd5dSJosef Bacik if (ret) { 249dc11dd5dSJosef Bacik test_msg("Couldn't add space to the bitmap %d\n", ret); 250dc11dd5dSJosef Bacik return ret; 251dc11dd5dSJosef Bacik } 252dc11dd5dSJosef Bacik 253ee22184bSByongho Lee ret = test_add_free_space_entry(cache, SZ_2M, SZ_2M, 0); 254dc11dd5dSJosef Bacik if (ret) { 255dc11dd5dSJosef Bacik test_msg("Couldn't add extent to the cache %d\n", ret); 256dc11dd5dSJosef Bacik return ret; 257dc11dd5dSJosef Bacik } 258dc11dd5dSJosef Bacik 259ee22184bSByongho Lee ret = btrfs_remove_free_space(cache, 3 * SZ_1M, SZ_4M); 260dc11dd5dSJosef Bacik if (ret) { 261dc11dd5dSJosef Bacik test_msg("Problem removing overlapping space %d\n", ret); 262dc11dd5dSJosef Bacik return ret; 263dc11dd5dSJosef Bacik } 264dc11dd5dSJosef Bacik 265ee22184bSByongho Lee if (test_check_exists(cache, 3 * SZ_1M, SZ_4M)) { 266dc11dd5dSJosef Bacik test_msg("Left something behind when removing space"); 267dc11dd5dSJosef Bacik return -1; 268dc11dd5dSJosef Bacik } 269dc11dd5dSJosef Bacik 270dc11dd5dSJosef Bacik /* 271dc11dd5dSJosef Bacik * This has blown up in the past, the extent entry starts before the 272dc11dd5dSJosef Bacik * bitmap entry, but we're trying to remove an offset that falls 273dc11dd5dSJosef Bacik * completely within the bitmap range and is in both the extent entry 274dc11dd5dSJosef Bacik * and the bitmap entry, looks like this 275dc11dd5dSJosef Bacik * 276dc11dd5dSJosef Bacik * [ extent ] 277dc11dd5dSJosef Bacik * [ bitmap ] 278dc11dd5dSJosef Bacik * [ del ] 279dc11dd5dSJosef Bacik */ 280dc11dd5dSJosef Bacik __btrfs_remove_free_space_cache(cache->free_space_ctl); 281ee22184bSByongho Lee ret = test_add_free_space_entry(cache, bitmap_offset + SZ_4M, SZ_4M, 1); 282dc11dd5dSJosef Bacik if (ret) { 283dc11dd5dSJosef Bacik test_msg("Couldn't add bitmap %d\n", ret); 284dc11dd5dSJosef Bacik return ret; 285dc11dd5dSJosef Bacik } 286dc11dd5dSJosef Bacik 287ee22184bSByongho Lee ret = test_add_free_space_entry(cache, bitmap_offset - SZ_1M, 288ee22184bSByongho Lee 5 * SZ_1M, 0); 289dc11dd5dSJosef Bacik if (ret) { 290dc11dd5dSJosef Bacik test_msg("Couldn't add extent entry %d\n", ret); 291dc11dd5dSJosef Bacik return ret; 292dc11dd5dSJosef Bacik } 293dc11dd5dSJosef Bacik 294ee22184bSByongho Lee ret = btrfs_remove_free_space(cache, bitmap_offset + SZ_1M, 5 * SZ_1M); 295dc11dd5dSJosef Bacik if (ret) { 296dc11dd5dSJosef Bacik test_msg("Failed to free our space %d\n", ret); 297dc11dd5dSJosef Bacik return ret; 298dc11dd5dSJosef Bacik } 299dc11dd5dSJosef Bacik 300ee22184bSByongho Lee if (test_check_exists(cache, bitmap_offset + SZ_1M, 5 * SZ_1M)) { 301dc11dd5dSJosef Bacik test_msg("Left stuff over\n"); 302dc11dd5dSJosef Bacik return -1; 303dc11dd5dSJosef Bacik } 304dc11dd5dSJosef Bacik 305dc11dd5dSJosef Bacik __btrfs_remove_free_space_cache(cache->free_space_ctl); 306dc11dd5dSJosef Bacik 307dc11dd5dSJosef Bacik /* 308dc11dd5dSJosef Bacik * This blew up before, we have part of the free space in a bitmap and 309dc11dd5dSJosef Bacik * then the entirety of the rest of the space in an extent. This used 310dc11dd5dSJosef Bacik * to return -EAGAIN back from btrfs_remove_extent, make sure this 311dc11dd5dSJosef Bacik * doesn't happen. 312dc11dd5dSJosef Bacik */ 313ee22184bSByongho Lee ret = test_add_free_space_entry(cache, SZ_1M, SZ_2M, 1); 314dc11dd5dSJosef Bacik if (ret) { 315dc11dd5dSJosef Bacik test_msg("Couldn't add bitmap entry %d\n", ret); 316dc11dd5dSJosef Bacik return ret; 317dc11dd5dSJosef Bacik } 318dc11dd5dSJosef Bacik 319ee22184bSByongho Lee ret = test_add_free_space_entry(cache, 3 * SZ_1M, SZ_1M, 0); 320dc11dd5dSJosef Bacik if (ret) { 321dc11dd5dSJosef Bacik test_msg("Couldn't add extent entry %d\n", ret); 322dc11dd5dSJosef Bacik return ret; 323dc11dd5dSJosef Bacik } 324dc11dd5dSJosef Bacik 325ee22184bSByongho Lee ret = btrfs_remove_free_space(cache, SZ_1M, 3 * SZ_1M); 326dc11dd5dSJosef Bacik if (ret) { 327dc11dd5dSJosef Bacik test_msg("Error removing bitmap and extent overlapping %d\n", ret); 328dc11dd5dSJosef Bacik return ret; 329dc11dd5dSJosef Bacik } 330dc11dd5dSJosef Bacik 331dc11dd5dSJosef Bacik __btrfs_remove_free_space_cache(cache->free_space_ctl); 332dc11dd5dSJosef Bacik return 0; 333dc11dd5dSJosef Bacik } 334dc11dd5dSJosef Bacik 33520005523SFilipe Manana /* Used by test_steal_space_from_bitmap_to_extent(). */ 33620005523SFilipe Manana static bool test_use_bitmap(struct btrfs_free_space_ctl *ctl, 33720005523SFilipe Manana struct btrfs_free_space *info) 33820005523SFilipe Manana { 33920005523SFilipe Manana return ctl->free_extents > 0; 34020005523SFilipe Manana } 34120005523SFilipe Manana 34220005523SFilipe Manana /* Used by test_steal_space_from_bitmap_to_extent(). */ 34320005523SFilipe Manana static int 34420005523SFilipe Manana check_num_extents_and_bitmaps(const struct btrfs_block_group_cache *cache, 34520005523SFilipe Manana const int num_extents, 34620005523SFilipe Manana const int num_bitmaps) 34720005523SFilipe Manana { 34820005523SFilipe Manana if (cache->free_space_ctl->free_extents != num_extents) { 34920005523SFilipe Manana test_msg("Incorrect # of extent entries in the cache: %d, expected %d\n", 35020005523SFilipe Manana cache->free_space_ctl->free_extents, num_extents); 35120005523SFilipe Manana return -EINVAL; 35220005523SFilipe Manana } 35320005523SFilipe Manana if (cache->free_space_ctl->total_bitmaps != num_bitmaps) { 35420005523SFilipe Manana test_msg("Incorrect # of extent entries in the cache: %d, expected %d\n", 35520005523SFilipe Manana cache->free_space_ctl->total_bitmaps, num_bitmaps); 35620005523SFilipe Manana return -EINVAL; 35720005523SFilipe Manana } 35820005523SFilipe Manana return 0; 35920005523SFilipe Manana } 36020005523SFilipe Manana 36120005523SFilipe Manana /* Used by test_steal_space_from_bitmap_to_extent(). */ 36220005523SFilipe Manana static int check_cache_empty(struct btrfs_block_group_cache *cache) 36320005523SFilipe Manana { 36420005523SFilipe Manana u64 offset; 36520005523SFilipe Manana u64 max_extent_size; 36620005523SFilipe Manana 36720005523SFilipe Manana /* 36820005523SFilipe Manana * Now lets confirm that there's absolutely no free space left to 36920005523SFilipe Manana * allocate. 37020005523SFilipe Manana */ 37120005523SFilipe Manana if (cache->free_space_ctl->free_space != 0) { 37220005523SFilipe Manana test_msg("Cache free space is not 0\n"); 37320005523SFilipe Manana return -EINVAL; 37420005523SFilipe Manana } 37520005523SFilipe Manana 37620005523SFilipe Manana /* And any allocation request, no matter how small, should fail now. */ 37720005523SFilipe Manana offset = btrfs_find_space_for_alloc(cache, 0, 4096, 0, 37820005523SFilipe Manana &max_extent_size); 37920005523SFilipe Manana if (offset != 0) { 38020005523SFilipe Manana test_msg("Space allocation did not fail, returned offset: %llu", 38120005523SFilipe Manana offset); 38220005523SFilipe Manana return -EINVAL; 38320005523SFilipe Manana } 38420005523SFilipe Manana 38520005523SFilipe Manana /* And no extent nor bitmap entries in the cache anymore. */ 38620005523SFilipe Manana return check_num_extents_and_bitmaps(cache, 0, 0); 38720005523SFilipe Manana } 38820005523SFilipe Manana 38920005523SFilipe Manana /* 39020005523SFilipe Manana * Before we were able to steal free space from a bitmap entry to an extent 39120005523SFilipe Manana * entry, we could end up with 2 entries representing a contiguous free space. 39220005523SFilipe Manana * One would be an extent entry and the other a bitmap entry. Since in order 39320005523SFilipe Manana * to allocate space to a caller we use only 1 entry, we couldn't return that 39420005523SFilipe Manana * whole range to the caller if it was requested. This forced the caller to 39520005523SFilipe Manana * either assume ENOSPC or perform several smaller space allocations, which 39620005523SFilipe Manana * wasn't optimal as they could be spread all over the block group while under 39720005523SFilipe Manana * concurrency (extra overhead and fragmentation). 39820005523SFilipe Manana * 39901327610SNicholas D Steeves * This stealing approach is beneficial, since we always prefer to allocate 40001327610SNicholas D Steeves * from extent entries, both for clustered and non-clustered allocation 40101327610SNicholas D Steeves * requests. 40220005523SFilipe Manana */ 40320005523SFilipe Manana static int 40420005523SFilipe Manana test_steal_space_from_bitmap_to_extent(struct btrfs_block_group_cache *cache) 40520005523SFilipe Manana { 40620005523SFilipe Manana int ret; 40720005523SFilipe Manana u64 offset; 40820005523SFilipe Manana u64 max_extent_size; 40920e5506bSDavid Sterba const struct btrfs_free_space_op test_free_space_ops = { 41028f0779aSDavid Sterba .recalc_thresholds = cache->free_space_ctl->op->recalc_thresholds, 41128f0779aSDavid Sterba .use_bitmap = test_use_bitmap, 41228f0779aSDavid Sterba }; 41320e5506bSDavid Sterba const struct btrfs_free_space_op *orig_free_space_ops; 41420005523SFilipe Manana 41520005523SFilipe Manana test_msg("Running space stealing from bitmap to extent\n"); 41620005523SFilipe Manana 41720005523SFilipe Manana /* 41820005523SFilipe Manana * For this test, we want to ensure we end up with an extent entry 41920005523SFilipe Manana * immediately adjacent to a bitmap entry, where the bitmap starts 42020005523SFilipe Manana * at an offset where the extent entry ends. We keep adding and 42120005523SFilipe Manana * removing free space to reach into this state, but to get there 42220005523SFilipe Manana * we need to reach a point where marking new free space doesn't 42320005523SFilipe Manana * result in adding new extent entries or merging the new space 42420005523SFilipe Manana * with existing extent entries - the space ends up being marked 42520005523SFilipe Manana * in an existing bitmap that covers the new free space range. 42620005523SFilipe Manana * 42720005523SFilipe Manana * To get there, we need to reach the threshold defined set at 42820005523SFilipe Manana * cache->free_space_ctl->extents_thresh, which currently is 42920005523SFilipe Manana * 256 extents on a x86_64 system at least, and a few other 43020005523SFilipe Manana * conditions (check free_space_cache.c). Instead of making the 43120005523SFilipe Manana * test much longer and complicated, use a "use_bitmap" operation 43220005523SFilipe Manana * that forces use of bitmaps as soon as we have at least 1 43320005523SFilipe Manana * extent entry. 43420005523SFilipe Manana */ 43528f0779aSDavid Sterba orig_free_space_ops = cache->free_space_ctl->op; 43628f0779aSDavid Sterba cache->free_space_ctl->op = &test_free_space_ops; 43720005523SFilipe Manana 43820005523SFilipe Manana /* 43920005523SFilipe Manana * Extent entry covering free space range [128Mb - 256Kb, 128Mb - 128Kb[ 44020005523SFilipe Manana */ 441ee22184bSByongho Lee ret = test_add_free_space_entry(cache, SZ_128M - SZ_256K, SZ_128K, 0); 44220005523SFilipe Manana if (ret) { 44320005523SFilipe Manana test_msg("Couldn't add extent entry %d\n", ret); 44420005523SFilipe Manana return ret; 44520005523SFilipe Manana } 44620005523SFilipe Manana 44720005523SFilipe Manana /* Bitmap entry covering free space range [128Mb + 512Kb, 256Mb[ */ 448ee22184bSByongho Lee ret = test_add_free_space_entry(cache, SZ_128M + SZ_512K, 449ee22184bSByongho Lee SZ_128M - SZ_512K, 1); 45020005523SFilipe Manana if (ret) { 45120005523SFilipe Manana test_msg("Couldn't add bitmap entry %d\n", ret); 45220005523SFilipe Manana return ret; 45320005523SFilipe Manana } 45420005523SFilipe Manana 45520005523SFilipe Manana ret = check_num_extents_and_bitmaps(cache, 2, 1); 45620005523SFilipe Manana if (ret) 45720005523SFilipe Manana return ret; 45820005523SFilipe Manana 45920005523SFilipe Manana /* 46020005523SFilipe Manana * Now make only the first 256Kb of the bitmap marked as free, so that 46120005523SFilipe Manana * we end up with only the following ranges marked as free space: 46220005523SFilipe Manana * 46320005523SFilipe Manana * [128Mb - 256Kb, 128Mb - 128Kb[ 46420005523SFilipe Manana * [128Mb + 512Kb, 128Mb + 768Kb[ 46520005523SFilipe Manana */ 46620005523SFilipe Manana ret = btrfs_remove_free_space(cache, 467ee22184bSByongho Lee SZ_128M + 768 * SZ_1K, 468ee22184bSByongho Lee SZ_128M - 768 * SZ_1K); 46920005523SFilipe Manana if (ret) { 47020005523SFilipe Manana test_msg("Failed to free part of bitmap space %d\n", ret); 47120005523SFilipe Manana return ret; 47220005523SFilipe Manana } 47320005523SFilipe Manana 47420005523SFilipe Manana /* Confirm that only those 2 ranges are marked as free. */ 475ee22184bSByongho Lee if (!test_check_exists(cache, SZ_128M - SZ_256K, SZ_128K)) { 47620005523SFilipe Manana test_msg("Free space range missing\n"); 47720005523SFilipe Manana return -ENOENT; 47820005523SFilipe Manana } 479ee22184bSByongho Lee if (!test_check_exists(cache, SZ_128M + SZ_512K, SZ_256K)) { 48020005523SFilipe Manana test_msg("Free space range missing\n"); 48120005523SFilipe Manana return -ENOENT; 48220005523SFilipe Manana } 48320005523SFilipe Manana 48420005523SFilipe Manana /* 48520005523SFilipe Manana * Confirm that the bitmap range [128Mb + 768Kb, 256Mb[ isn't marked 48620005523SFilipe Manana * as free anymore. 48720005523SFilipe Manana */ 488ee22184bSByongho Lee if (test_check_exists(cache, SZ_128M + 768 * SZ_1K, 489ee22184bSByongho Lee SZ_128M - 768 * SZ_1K)) { 49020005523SFilipe Manana test_msg("Bitmap region not removed from space cache\n"); 49120005523SFilipe Manana return -EINVAL; 49220005523SFilipe Manana } 49320005523SFilipe Manana 49420005523SFilipe Manana /* 49520005523SFilipe Manana * Confirm that the region [128Mb + 256Kb, 128Mb + 512Kb[, which is 49620005523SFilipe Manana * covered by the bitmap, isn't marked as free. 49720005523SFilipe Manana */ 498ee22184bSByongho Lee if (test_check_exists(cache, SZ_128M + SZ_256K, SZ_256K)) { 49920005523SFilipe Manana test_msg("Invalid bitmap region marked as free\n"); 50020005523SFilipe Manana return -EINVAL; 50120005523SFilipe Manana } 50220005523SFilipe Manana 50320005523SFilipe Manana /* 50420005523SFilipe Manana * Confirm that the region [128Mb, 128Mb + 256Kb[, which is covered 50520005523SFilipe Manana * by the bitmap too, isn't marked as free either. 50620005523SFilipe Manana */ 507ee22184bSByongho Lee if (test_check_exists(cache, SZ_128M, SZ_256K)) { 50820005523SFilipe Manana test_msg("Invalid bitmap region marked as free\n"); 50920005523SFilipe Manana return -EINVAL; 51020005523SFilipe Manana } 51120005523SFilipe Manana 51220005523SFilipe Manana /* 51320005523SFilipe Manana * Now lets mark the region [128Mb, 128Mb + 512Kb[ as free too. But, 51420005523SFilipe Manana * lets make sure the free space cache marks it as free in the bitmap, 51520005523SFilipe Manana * and doesn't insert a new extent entry to represent this region. 51620005523SFilipe Manana */ 517ee22184bSByongho Lee ret = btrfs_add_free_space(cache, SZ_128M, SZ_512K); 51820005523SFilipe Manana if (ret) { 51920005523SFilipe Manana test_msg("Error adding free space: %d\n", ret); 52020005523SFilipe Manana return ret; 52120005523SFilipe Manana } 52220005523SFilipe Manana /* Confirm the region is marked as free. */ 523ee22184bSByongho Lee if (!test_check_exists(cache, SZ_128M, SZ_512K)) { 52420005523SFilipe Manana test_msg("Bitmap region not marked as free\n"); 52520005523SFilipe Manana return -ENOENT; 52620005523SFilipe Manana } 52720005523SFilipe Manana 52820005523SFilipe Manana /* 52920005523SFilipe Manana * Confirm that no new extent entries or bitmap entries were added to 53020005523SFilipe Manana * the cache after adding that free space region. 53120005523SFilipe Manana */ 53220005523SFilipe Manana ret = check_num_extents_and_bitmaps(cache, 2, 1); 53320005523SFilipe Manana if (ret) 53420005523SFilipe Manana return ret; 53520005523SFilipe Manana 53620005523SFilipe Manana /* 53720005523SFilipe Manana * Now lets add a small free space region to the right of the previous 53820005523SFilipe Manana * one, which is not contiguous with it and is part of the bitmap too. 53920005523SFilipe Manana * The goal is to test that the bitmap entry space stealing doesn't 54020005523SFilipe Manana * steal this space region. 54120005523SFilipe Manana */ 542ee22184bSByongho Lee ret = btrfs_add_free_space(cache, SZ_128M + SZ_16M, 4096); 54320005523SFilipe Manana if (ret) { 54420005523SFilipe Manana test_msg("Error adding free space: %d\n", ret); 54520005523SFilipe Manana return ret; 54620005523SFilipe Manana } 54720005523SFilipe Manana 54820005523SFilipe Manana /* 54920005523SFilipe Manana * Confirm that no new extent entries or bitmap entries were added to 55020005523SFilipe Manana * the cache after adding that free space region. 55120005523SFilipe Manana */ 55220005523SFilipe Manana ret = check_num_extents_and_bitmaps(cache, 2, 1); 55320005523SFilipe Manana if (ret) 55420005523SFilipe Manana return ret; 55520005523SFilipe Manana 55620005523SFilipe Manana /* 55720005523SFilipe Manana * Now mark the region [128Mb - 128Kb, 128Mb[ as free too. This will 55820005523SFilipe Manana * expand the range covered by the existing extent entry that represents 55920005523SFilipe Manana * the free space [128Mb - 256Kb, 128Mb - 128Kb[. 56020005523SFilipe Manana */ 561ee22184bSByongho Lee ret = btrfs_add_free_space(cache, SZ_128M - SZ_128K, SZ_128K); 56220005523SFilipe Manana if (ret) { 56320005523SFilipe Manana test_msg("Error adding free space: %d\n", ret); 56420005523SFilipe Manana return ret; 56520005523SFilipe Manana } 56620005523SFilipe Manana /* Confirm the region is marked as free. */ 567ee22184bSByongho Lee if (!test_check_exists(cache, SZ_128M - SZ_128K, SZ_128K)) { 56820005523SFilipe Manana test_msg("Extent region not marked as free\n"); 56920005523SFilipe Manana return -ENOENT; 57020005523SFilipe Manana } 57120005523SFilipe Manana 57220005523SFilipe Manana /* 57320005523SFilipe Manana * Confirm that our extent entry didn't stole all free space from the 57420005523SFilipe Manana * bitmap, because of the small 4Kb free space region. 57520005523SFilipe Manana */ 57620005523SFilipe Manana ret = check_num_extents_and_bitmaps(cache, 2, 1); 57720005523SFilipe Manana if (ret) 57820005523SFilipe Manana return ret; 57920005523SFilipe Manana 58020005523SFilipe Manana /* 58120005523SFilipe Manana * So now we have the range [128Mb - 256Kb, 128Mb + 768Kb[ as free 58220005523SFilipe Manana * space. Without stealing bitmap free space into extent entry space, 58320005523SFilipe Manana * we would have all this free space represented by 2 entries in the 58420005523SFilipe Manana * cache: 58520005523SFilipe Manana * 58620005523SFilipe Manana * extent entry covering range: [128Mb - 256Kb, 128Mb[ 58720005523SFilipe Manana * bitmap entry covering range: [128Mb, 128Mb + 768Kb[ 58820005523SFilipe Manana * 58920005523SFilipe Manana * Attempting to allocate the whole free space (1Mb) would fail, because 59020005523SFilipe Manana * we can't allocate from multiple entries. 59120005523SFilipe Manana * With the bitmap free space stealing, we get a single extent entry 59220005523SFilipe Manana * that represents the 1Mb free space, and therefore we're able to 59320005523SFilipe Manana * allocate the whole free space at once. 59420005523SFilipe Manana */ 595ee22184bSByongho Lee if (!test_check_exists(cache, SZ_128M - SZ_256K, SZ_1M)) { 59620005523SFilipe Manana test_msg("Expected region not marked as free\n"); 59720005523SFilipe Manana return -ENOENT; 59820005523SFilipe Manana } 59920005523SFilipe Manana 600ee22184bSByongho Lee if (cache->free_space_ctl->free_space != (SZ_1M + 4096)) { 60120005523SFilipe Manana test_msg("Cache free space is not 1Mb + 4Kb\n"); 60220005523SFilipe Manana return -EINVAL; 60320005523SFilipe Manana } 60420005523SFilipe Manana 60520005523SFilipe Manana offset = btrfs_find_space_for_alloc(cache, 606ee22184bSByongho Lee 0, SZ_1M, 0, 60720005523SFilipe Manana &max_extent_size); 608ee22184bSByongho Lee if (offset != (SZ_128M - SZ_256K)) { 60920005523SFilipe Manana test_msg("Failed to allocate 1Mb from space cache, returned offset is: %llu\n", 61020005523SFilipe Manana offset); 61120005523SFilipe Manana return -EINVAL; 61220005523SFilipe Manana } 61320005523SFilipe Manana 61420005523SFilipe Manana /* All that remains is a 4Kb free space region in a bitmap. Confirm. */ 61520005523SFilipe Manana ret = check_num_extents_and_bitmaps(cache, 1, 1); 61620005523SFilipe Manana if (ret) 61720005523SFilipe Manana return ret; 61820005523SFilipe Manana 61920005523SFilipe Manana if (cache->free_space_ctl->free_space != 4096) { 62020005523SFilipe Manana test_msg("Cache free space is not 4Kb\n"); 62120005523SFilipe Manana return -EINVAL; 62220005523SFilipe Manana } 62320005523SFilipe Manana 62420005523SFilipe Manana offset = btrfs_find_space_for_alloc(cache, 62520005523SFilipe Manana 0, 4096, 0, 62620005523SFilipe Manana &max_extent_size); 627ee22184bSByongho Lee if (offset != (SZ_128M + SZ_16M)) { 62820005523SFilipe Manana test_msg("Failed to allocate 4Kb from space cache, returned offset is: %llu\n", 62920005523SFilipe Manana offset); 63020005523SFilipe Manana return -EINVAL; 63120005523SFilipe Manana } 63220005523SFilipe Manana 63320005523SFilipe Manana ret = check_cache_empty(cache); 63420005523SFilipe Manana if (ret) 63520005523SFilipe Manana return ret; 63620005523SFilipe Manana 63720005523SFilipe Manana __btrfs_remove_free_space_cache(cache->free_space_ctl); 63820005523SFilipe Manana 63920005523SFilipe Manana /* 64020005523SFilipe Manana * Now test a similar scenario, but where our extent entry is located 64120005523SFilipe Manana * to the right of the bitmap entry, so that we can check that stealing 64220005523SFilipe Manana * space from a bitmap to the front of an extent entry works. 64320005523SFilipe Manana */ 64420005523SFilipe Manana 64520005523SFilipe Manana /* 64620005523SFilipe Manana * Extent entry covering free space range [128Mb + 128Kb, 128Mb + 256Kb[ 64720005523SFilipe Manana */ 648ee22184bSByongho Lee ret = test_add_free_space_entry(cache, SZ_128M + SZ_128K, SZ_128K, 0); 64920005523SFilipe Manana if (ret) { 65020005523SFilipe Manana test_msg("Couldn't add extent entry %d\n", ret); 65120005523SFilipe Manana return ret; 65220005523SFilipe Manana } 65320005523SFilipe Manana 65420005523SFilipe Manana /* Bitmap entry covering free space range [0, 128Mb - 512Kb[ */ 655ee22184bSByongho Lee ret = test_add_free_space_entry(cache, 0, SZ_128M - SZ_512K, 1); 65620005523SFilipe Manana if (ret) { 65720005523SFilipe Manana test_msg("Couldn't add bitmap entry %d\n", ret); 65820005523SFilipe Manana return ret; 65920005523SFilipe Manana } 66020005523SFilipe Manana 66120005523SFilipe Manana ret = check_num_extents_and_bitmaps(cache, 2, 1); 66220005523SFilipe Manana if (ret) 66320005523SFilipe Manana return ret; 66420005523SFilipe Manana 66520005523SFilipe Manana /* 66620005523SFilipe Manana * Now make only the last 256Kb of the bitmap marked as free, so that 66720005523SFilipe Manana * we end up with only the following ranges marked as free space: 66820005523SFilipe Manana * 66920005523SFilipe Manana * [128Mb + 128b, 128Mb + 256Kb[ 67020005523SFilipe Manana * [128Mb - 768Kb, 128Mb - 512Kb[ 67120005523SFilipe Manana */ 672ee22184bSByongho Lee ret = btrfs_remove_free_space(cache, 0, SZ_128M - 768 * SZ_1K); 67320005523SFilipe Manana if (ret) { 67420005523SFilipe Manana test_msg("Failed to free part of bitmap space %d\n", ret); 67520005523SFilipe Manana return ret; 67620005523SFilipe Manana } 67720005523SFilipe Manana 67820005523SFilipe Manana /* Confirm that only those 2 ranges are marked as free. */ 679ee22184bSByongho Lee if (!test_check_exists(cache, SZ_128M + SZ_128K, SZ_128K)) { 68020005523SFilipe Manana test_msg("Free space range missing\n"); 68120005523SFilipe Manana return -ENOENT; 68220005523SFilipe Manana } 683ee22184bSByongho Lee if (!test_check_exists(cache, SZ_128M - 768 * SZ_1K, SZ_256K)) { 68420005523SFilipe Manana test_msg("Free space range missing\n"); 68520005523SFilipe Manana return -ENOENT; 68620005523SFilipe Manana } 68720005523SFilipe Manana 68820005523SFilipe Manana /* 68920005523SFilipe Manana * Confirm that the bitmap range [0, 128Mb - 768Kb[ isn't marked 69020005523SFilipe Manana * as free anymore. 69120005523SFilipe Manana */ 692ee22184bSByongho Lee if (test_check_exists(cache, 0, SZ_128M - 768 * SZ_1K)) { 69320005523SFilipe Manana test_msg("Bitmap region not removed from space cache\n"); 69420005523SFilipe Manana return -EINVAL; 69520005523SFilipe Manana } 69620005523SFilipe Manana 69720005523SFilipe Manana /* 69820005523SFilipe Manana * Confirm that the region [128Mb - 512Kb, 128Mb[, which is 69920005523SFilipe Manana * covered by the bitmap, isn't marked as free. 70020005523SFilipe Manana */ 701ee22184bSByongho Lee if (test_check_exists(cache, SZ_128M - SZ_512K, SZ_512K)) { 70220005523SFilipe Manana test_msg("Invalid bitmap region marked as free\n"); 70320005523SFilipe Manana return -EINVAL; 70420005523SFilipe Manana } 70520005523SFilipe Manana 70620005523SFilipe Manana /* 70720005523SFilipe Manana * Now lets mark the region [128Mb - 512Kb, 128Mb[ as free too. But, 70820005523SFilipe Manana * lets make sure the free space cache marks it as free in the bitmap, 70920005523SFilipe Manana * and doesn't insert a new extent entry to represent this region. 71020005523SFilipe Manana */ 711ee22184bSByongho Lee ret = btrfs_add_free_space(cache, SZ_128M - SZ_512K, SZ_512K); 71220005523SFilipe Manana if (ret) { 71320005523SFilipe Manana test_msg("Error adding free space: %d\n", ret); 71420005523SFilipe Manana return ret; 71520005523SFilipe Manana } 71620005523SFilipe Manana /* Confirm the region is marked as free. */ 717ee22184bSByongho Lee if (!test_check_exists(cache, SZ_128M - SZ_512K, SZ_512K)) { 71820005523SFilipe Manana test_msg("Bitmap region not marked as free\n"); 71920005523SFilipe Manana return -ENOENT; 72020005523SFilipe Manana } 72120005523SFilipe Manana 72220005523SFilipe Manana /* 72320005523SFilipe Manana * Confirm that no new extent entries or bitmap entries were added to 72420005523SFilipe Manana * the cache after adding that free space region. 72520005523SFilipe Manana */ 72620005523SFilipe Manana ret = check_num_extents_and_bitmaps(cache, 2, 1); 72720005523SFilipe Manana if (ret) 72820005523SFilipe Manana return ret; 72920005523SFilipe Manana 73020005523SFilipe Manana /* 73120005523SFilipe Manana * Now lets add a small free space region to the left of the previous 73220005523SFilipe Manana * one, which is not contiguous with it and is part of the bitmap too. 73320005523SFilipe Manana * The goal is to test that the bitmap entry space stealing doesn't 73420005523SFilipe Manana * steal this space region. 73520005523SFilipe Manana */ 736ee22184bSByongho Lee ret = btrfs_add_free_space(cache, SZ_32M, 8192); 73720005523SFilipe Manana if (ret) { 73820005523SFilipe Manana test_msg("Error adding free space: %d\n", ret); 73920005523SFilipe Manana return ret; 74020005523SFilipe Manana } 74120005523SFilipe Manana 74220005523SFilipe Manana /* 74320005523SFilipe Manana * Now mark the region [128Mb, 128Mb + 128Kb[ as free too. This will 74420005523SFilipe Manana * expand the range covered by the existing extent entry that represents 74520005523SFilipe Manana * the free space [128Mb + 128Kb, 128Mb + 256Kb[. 74620005523SFilipe Manana */ 747ee22184bSByongho Lee ret = btrfs_add_free_space(cache, SZ_128M, SZ_128K); 74820005523SFilipe Manana if (ret) { 74920005523SFilipe Manana test_msg("Error adding free space: %d\n", ret); 75020005523SFilipe Manana return ret; 75120005523SFilipe Manana } 75220005523SFilipe Manana /* Confirm the region is marked as free. */ 753ee22184bSByongho Lee if (!test_check_exists(cache, SZ_128M, SZ_128K)) { 75420005523SFilipe Manana test_msg("Extent region not marked as free\n"); 75520005523SFilipe Manana return -ENOENT; 75620005523SFilipe Manana } 75720005523SFilipe Manana 75820005523SFilipe Manana /* 75920005523SFilipe Manana * Confirm that our extent entry didn't stole all free space from the 76020005523SFilipe Manana * bitmap, because of the small 8Kb free space region. 76120005523SFilipe Manana */ 76220005523SFilipe Manana ret = check_num_extents_and_bitmaps(cache, 2, 1); 76320005523SFilipe Manana if (ret) 76420005523SFilipe Manana return ret; 76520005523SFilipe Manana 76620005523SFilipe Manana /* 76720005523SFilipe Manana * So now we have the range [128Mb - 768Kb, 128Mb + 256Kb[ as free 76820005523SFilipe Manana * space. Without stealing bitmap free space into extent entry space, 76920005523SFilipe Manana * we would have all this free space represented by 2 entries in the 77020005523SFilipe Manana * cache: 77120005523SFilipe Manana * 77220005523SFilipe Manana * extent entry covering range: [128Mb, 128Mb + 256Kb[ 77320005523SFilipe Manana * bitmap entry covering range: [128Mb - 768Kb, 128Mb[ 77420005523SFilipe Manana * 77520005523SFilipe Manana * Attempting to allocate the whole free space (1Mb) would fail, because 77620005523SFilipe Manana * we can't allocate from multiple entries. 77720005523SFilipe Manana * With the bitmap free space stealing, we get a single extent entry 77820005523SFilipe Manana * that represents the 1Mb free space, and therefore we're able to 77920005523SFilipe Manana * allocate the whole free space at once. 78020005523SFilipe Manana */ 781ee22184bSByongho Lee if (!test_check_exists(cache, SZ_128M - 768 * SZ_1K, SZ_1M)) { 78220005523SFilipe Manana test_msg("Expected region not marked as free\n"); 78320005523SFilipe Manana return -ENOENT; 78420005523SFilipe Manana } 78520005523SFilipe Manana 786ee22184bSByongho Lee if (cache->free_space_ctl->free_space != (SZ_1M + 8192)) { 78720005523SFilipe Manana test_msg("Cache free space is not 1Mb + 8Kb\n"); 78820005523SFilipe Manana return -EINVAL; 78920005523SFilipe Manana } 79020005523SFilipe Manana 791ee22184bSByongho Lee offset = btrfs_find_space_for_alloc(cache, 0, SZ_1M, 0, 79220005523SFilipe Manana &max_extent_size); 793ee22184bSByongho Lee if (offset != (SZ_128M - 768 * SZ_1K)) { 79420005523SFilipe Manana test_msg("Failed to allocate 1Mb from space cache, returned offset is: %llu\n", 79520005523SFilipe Manana offset); 79620005523SFilipe Manana return -EINVAL; 79720005523SFilipe Manana } 79820005523SFilipe Manana 79920005523SFilipe Manana /* All that remains is a 8Kb free space region in a bitmap. Confirm. */ 80020005523SFilipe Manana ret = check_num_extents_and_bitmaps(cache, 1, 1); 80120005523SFilipe Manana if (ret) 80220005523SFilipe Manana return ret; 80320005523SFilipe Manana 80420005523SFilipe Manana if (cache->free_space_ctl->free_space != 8192) { 80520005523SFilipe Manana test_msg("Cache free space is not 8Kb\n"); 80620005523SFilipe Manana return -EINVAL; 80720005523SFilipe Manana } 80820005523SFilipe Manana 80920005523SFilipe Manana offset = btrfs_find_space_for_alloc(cache, 81020005523SFilipe Manana 0, 8192, 0, 81120005523SFilipe Manana &max_extent_size); 812ee22184bSByongho Lee if (offset != SZ_32M) { 81320005523SFilipe Manana test_msg("Failed to allocate 8Kb from space cache, returned offset is: %llu\n", 81420005523SFilipe Manana 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 828dc11dd5dSJosef Bacik int btrfs_test_free_space_cache(void) 829dc11dd5dSJosef Bacik { 830dc11dd5dSJosef Bacik struct btrfs_block_group_cache *cache; 831d0bd4560SJosef Bacik struct btrfs_root *root = NULL; 832d0bd4560SJosef Bacik int ret = -ENOMEM; 833dc11dd5dSJosef Bacik 834dc11dd5dSJosef Bacik test_msg("Running btrfs free space cache tests\n"); 835dc11dd5dSJosef Bacik 8367c55ee0cSOmar Sandoval cache = btrfs_alloc_dummy_block_group(1024 * 1024 * 1024); 837dc11dd5dSJosef Bacik if (!cache) { 838dc11dd5dSJosef Bacik test_msg("Couldn't run the tests\n"); 839dc11dd5dSJosef Bacik return 0; 840dc11dd5dSJosef Bacik } 841dc11dd5dSJosef Bacik 842d0bd4560SJosef Bacik root = btrfs_alloc_dummy_root(); 84389b6c8d1SDan Carpenter if (IS_ERR(root)) { 84489b6c8d1SDan Carpenter ret = PTR_ERR(root); 845d0bd4560SJosef Bacik goto out; 84689b6c8d1SDan Carpenter } 847d0bd4560SJosef Bacik 848d0bd4560SJosef Bacik root->fs_info = btrfs_alloc_dummy_fs_info(); 849d0bd4560SJosef Bacik if (!root->fs_info) 850d0bd4560SJosef Bacik goto out; 851d0bd4560SJosef Bacik 852d0bd4560SJosef Bacik root->fs_info->extent_root = root; 853d0bd4560SJosef Bacik cache->fs_info = root->fs_info; 854d0bd4560SJosef Bacik 855dc11dd5dSJosef Bacik ret = test_extents(cache); 856dc11dd5dSJosef Bacik if (ret) 857dc11dd5dSJosef Bacik goto out; 858dc11dd5dSJosef Bacik ret = test_bitmaps(cache); 859dc11dd5dSJosef Bacik if (ret) 860dc11dd5dSJosef Bacik goto out; 861dc11dd5dSJosef Bacik ret = test_bitmaps_and_extents(cache); 862dc11dd5dSJosef Bacik if (ret) 863dc11dd5dSJosef Bacik goto out; 86420005523SFilipe Manana 86520005523SFilipe Manana ret = test_steal_space_from_bitmap_to_extent(cache); 866dc11dd5dSJosef Bacik out: 8677c55ee0cSOmar Sandoval btrfs_free_dummy_block_group(cache); 868d0bd4560SJosef Bacik btrfs_free_dummy_root(root); 869dc11dd5dSJosef Bacik test_msg("Free space cache tests finished\n"); 870dc11dd5dSJosef Bacik return ret; 871dc11dd5dSJosef Bacik } 872