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" 22dc11dd5dSJosef Bacik #include "../free-space-cache.h" 23dc11dd5dSJosef Bacik 24dc11dd5dSJosef Bacik #define BITS_PER_BITMAP (PAGE_CACHE_SIZE * 8) 25dc11dd5dSJosef Bacik 26dc11dd5dSJosef Bacik /* 27dc11dd5dSJosef Bacik * This test just does basic sanity checking, making sure we can add an exten 28dc11dd5dSJosef Bacik * entry and remove space from either end and the middle, and make sure we can 29dc11dd5dSJosef Bacik * remove space that covers adjacent extent entries. 30dc11dd5dSJosef Bacik */ 31dc11dd5dSJosef Bacik static int test_extents(struct btrfs_block_group_cache *cache) 32dc11dd5dSJosef Bacik { 33dc11dd5dSJosef Bacik int ret = 0; 34dc11dd5dSJosef Bacik 35dc11dd5dSJosef Bacik test_msg("Running extent only tests\n"); 36dc11dd5dSJosef Bacik 37dc11dd5dSJosef Bacik /* First just make sure we can remove an entire entry */ 38dc11dd5dSJosef Bacik ret = btrfs_add_free_space(cache, 0, 4 * 1024 * 1024); 39dc11dd5dSJosef Bacik if (ret) { 40dc11dd5dSJosef Bacik test_msg("Error adding initial extents %d\n", ret); 41dc11dd5dSJosef Bacik return ret; 42dc11dd5dSJosef Bacik } 43dc11dd5dSJosef Bacik 44dc11dd5dSJosef Bacik ret = btrfs_remove_free_space(cache, 0, 4 * 1024 * 1024); 45dc11dd5dSJosef Bacik if (ret) { 46dc11dd5dSJosef Bacik test_msg("Error removing extent %d\n", ret); 47dc11dd5dSJosef Bacik return ret; 48dc11dd5dSJosef Bacik } 49dc11dd5dSJosef Bacik 50dc11dd5dSJosef Bacik if (test_check_exists(cache, 0, 4 * 1024 * 1024)) { 51dc11dd5dSJosef Bacik test_msg("Full remove left some lingering space\n"); 52dc11dd5dSJosef Bacik return -1; 53dc11dd5dSJosef Bacik } 54dc11dd5dSJosef Bacik 55dc11dd5dSJosef Bacik /* Ok edge and middle cases now */ 56dc11dd5dSJosef Bacik ret = btrfs_add_free_space(cache, 0, 4 * 1024 * 1024); 57dc11dd5dSJosef Bacik if (ret) { 58dc11dd5dSJosef Bacik test_msg("Error adding half extent %d\n", ret); 59dc11dd5dSJosef Bacik return ret; 60dc11dd5dSJosef Bacik } 61dc11dd5dSJosef Bacik 62dc11dd5dSJosef Bacik ret = btrfs_remove_free_space(cache, 3 * 1024 * 1024, 1 * 1024 * 1024); 63dc11dd5dSJosef Bacik if (ret) { 64dc11dd5dSJosef Bacik test_msg("Error removing tail end %d\n", ret); 65dc11dd5dSJosef Bacik return ret; 66dc11dd5dSJosef Bacik } 67dc11dd5dSJosef Bacik 68dc11dd5dSJosef Bacik ret = btrfs_remove_free_space(cache, 0, 1 * 1024 * 1024); 69dc11dd5dSJosef Bacik if (ret) { 70dc11dd5dSJosef Bacik test_msg("Error removing front end %d\n", ret); 71dc11dd5dSJosef Bacik return ret; 72dc11dd5dSJosef Bacik } 73dc11dd5dSJosef Bacik 74dc11dd5dSJosef Bacik ret = btrfs_remove_free_space(cache, 2 * 1024 * 1024, 4096); 75dc11dd5dSJosef Bacik if (ret) { 7677d84ff8SMasanari Iida test_msg("Error removing middle piece %d\n", ret); 77dc11dd5dSJosef Bacik return ret; 78dc11dd5dSJosef Bacik } 79dc11dd5dSJosef Bacik 80dc11dd5dSJosef Bacik if (test_check_exists(cache, 0, 1 * 1024 * 1024)) { 81dc11dd5dSJosef Bacik test_msg("Still have space at the front\n"); 82dc11dd5dSJosef Bacik return -1; 83dc11dd5dSJosef Bacik } 84dc11dd5dSJosef Bacik 85dc11dd5dSJosef Bacik if (test_check_exists(cache, 2 * 1024 * 1024, 4096)) { 86dc11dd5dSJosef Bacik test_msg("Still have space in the middle\n"); 87dc11dd5dSJosef Bacik return -1; 88dc11dd5dSJosef Bacik } 89dc11dd5dSJosef Bacik 90dc11dd5dSJosef Bacik if (test_check_exists(cache, 3 * 1024 * 1024, 1 * 1024 * 1024)) { 91dc11dd5dSJosef Bacik test_msg("Still have space at the end\n"); 92dc11dd5dSJosef Bacik return -1; 93dc11dd5dSJosef Bacik } 94dc11dd5dSJosef Bacik 95dc11dd5dSJosef Bacik /* Cleanup */ 96dc11dd5dSJosef Bacik __btrfs_remove_free_space_cache(cache->free_space_ctl); 97dc11dd5dSJosef Bacik 98dc11dd5dSJosef Bacik return 0; 99dc11dd5dSJosef Bacik } 100dc11dd5dSJosef Bacik 101dc11dd5dSJosef Bacik static int test_bitmaps(struct btrfs_block_group_cache *cache) 102dc11dd5dSJosef Bacik { 103dc11dd5dSJosef Bacik u64 next_bitmap_offset; 104dc11dd5dSJosef Bacik int ret; 105dc11dd5dSJosef Bacik 106dc11dd5dSJosef Bacik test_msg("Running bitmap only tests\n"); 107dc11dd5dSJosef Bacik 108dc11dd5dSJosef Bacik ret = test_add_free_space_entry(cache, 0, 4 * 1024 * 1024, 1); 109dc11dd5dSJosef Bacik if (ret) { 110dc11dd5dSJosef Bacik test_msg("Couldn't create a bitmap entry %d\n", ret); 111dc11dd5dSJosef Bacik return ret; 112dc11dd5dSJosef Bacik } 113dc11dd5dSJosef Bacik 114dc11dd5dSJosef Bacik ret = btrfs_remove_free_space(cache, 0, 4 * 1024 * 1024); 115dc11dd5dSJosef Bacik if (ret) { 116dc11dd5dSJosef Bacik test_msg("Error removing bitmap full range %d\n", ret); 117dc11dd5dSJosef Bacik return ret; 118dc11dd5dSJosef Bacik } 119dc11dd5dSJosef Bacik 120dc11dd5dSJosef Bacik if (test_check_exists(cache, 0, 4 * 1024 * 1024)) { 121dc11dd5dSJosef Bacik test_msg("Left some space in bitmap\n"); 122dc11dd5dSJosef Bacik return -1; 123dc11dd5dSJosef Bacik } 124dc11dd5dSJosef Bacik 125dc11dd5dSJosef Bacik ret = test_add_free_space_entry(cache, 0, 4 * 1024 * 1024, 1); 126dc11dd5dSJosef Bacik if (ret) { 127dc11dd5dSJosef Bacik test_msg("Couldn't add to our bitmap entry %d\n", ret); 128dc11dd5dSJosef Bacik return ret; 129dc11dd5dSJosef Bacik } 130dc11dd5dSJosef Bacik 131dc11dd5dSJosef Bacik ret = btrfs_remove_free_space(cache, 1 * 1024 * 1024, 2 * 1024 * 1024); 132dc11dd5dSJosef Bacik if (ret) { 133dc11dd5dSJosef Bacik test_msg("Couldn't remove middle chunk %d\n", ret); 134dc11dd5dSJosef Bacik return ret; 135dc11dd5dSJosef Bacik } 136dc11dd5dSJosef Bacik 137dc11dd5dSJosef Bacik /* 138dc11dd5dSJosef Bacik * The first bitmap we have starts at offset 0 so the next one is just 139dc11dd5dSJosef Bacik * at the end of the first bitmap. 140dc11dd5dSJosef Bacik */ 141dc11dd5dSJosef Bacik next_bitmap_offset = (u64)(BITS_PER_BITMAP * 4096); 142dc11dd5dSJosef Bacik 143dc11dd5dSJosef Bacik /* Test a bit straddling two bitmaps */ 144dc11dd5dSJosef Bacik ret = test_add_free_space_entry(cache, next_bitmap_offset - 145dc11dd5dSJosef Bacik (2 * 1024 * 1024), 4 * 1024 * 1024, 1); 146dc11dd5dSJosef Bacik if (ret) { 147dc11dd5dSJosef Bacik test_msg("Couldn't add space that straddles two bitmaps %d\n", 148dc11dd5dSJosef Bacik ret); 149dc11dd5dSJosef Bacik return ret; 150dc11dd5dSJosef Bacik } 151dc11dd5dSJosef Bacik 152dc11dd5dSJosef Bacik ret = btrfs_remove_free_space(cache, next_bitmap_offset - 153dc11dd5dSJosef Bacik (1 * 1024 * 1024), 2 * 1024 * 1024); 154dc11dd5dSJosef Bacik if (ret) { 155dc11dd5dSJosef Bacik test_msg("Couldn't remove overlapping space %d\n", ret); 156dc11dd5dSJosef Bacik return ret; 157dc11dd5dSJosef Bacik } 158dc11dd5dSJosef Bacik 159dc11dd5dSJosef Bacik if (test_check_exists(cache, next_bitmap_offset - (1 * 1024 * 1024), 160dc11dd5dSJosef Bacik 2 * 1024 * 1024)) { 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 */ 171dc11dd5dSJosef Bacik static int test_bitmaps_and_extents(struct btrfs_block_group_cache *cache) 172dc11dd5dSJosef Bacik { 173dc11dd5dSJosef Bacik u64 bitmap_offset = (u64)(BITS_PER_BITMAP * 4096); 174dc11dd5dSJosef Bacik int ret; 175dc11dd5dSJosef Bacik 176dc11dd5dSJosef Bacik test_msg("Running bitmap and extent tests\n"); 177dc11dd5dSJosef Bacik 178dc11dd5dSJosef Bacik /* 179dc11dd5dSJosef Bacik * First let's do something simple, an extent at the same offset as the 180dc11dd5dSJosef Bacik * bitmap, but the free space completely in the extent and then 181dc11dd5dSJosef Bacik * completely in the bitmap. 182dc11dd5dSJosef Bacik */ 183dc11dd5dSJosef Bacik ret = test_add_free_space_entry(cache, 4 * 1024 * 1024, 1 * 1024 * 1024, 1); 184dc11dd5dSJosef Bacik if (ret) { 185dc11dd5dSJosef Bacik test_msg("Couldn't create bitmap entry %d\n", ret); 186dc11dd5dSJosef Bacik return ret; 187dc11dd5dSJosef Bacik } 188dc11dd5dSJosef Bacik 189dc11dd5dSJosef Bacik ret = test_add_free_space_entry(cache, 0, 1 * 1024 * 1024, 0); 190dc11dd5dSJosef Bacik if (ret) { 191dc11dd5dSJosef Bacik test_msg("Couldn't add extent entry %d\n", ret); 192dc11dd5dSJosef Bacik return ret; 193dc11dd5dSJosef Bacik } 194dc11dd5dSJosef Bacik 195dc11dd5dSJosef Bacik ret = btrfs_remove_free_space(cache, 0, 1 * 1024 * 1024); 196dc11dd5dSJosef Bacik if (ret) { 197dc11dd5dSJosef Bacik test_msg("Couldn't remove extent entry %d\n", ret); 198dc11dd5dSJosef Bacik return ret; 199dc11dd5dSJosef Bacik } 200dc11dd5dSJosef Bacik 201dc11dd5dSJosef Bacik if (test_check_exists(cache, 0, 1 * 1024 * 1024)) { 202dc11dd5dSJosef Bacik test_msg("Left remnants after our remove\n"); 203dc11dd5dSJosef Bacik return -1; 204dc11dd5dSJosef Bacik } 205dc11dd5dSJosef Bacik 206dc11dd5dSJosef Bacik /* Now to add back the extent entry and remove from the bitmap */ 207dc11dd5dSJosef Bacik ret = test_add_free_space_entry(cache, 0, 1 * 1024 * 1024, 0); 208dc11dd5dSJosef Bacik if (ret) { 209dc11dd5dSJosef Bacik test_msg("Couldn't re-add extent entry %d\n", ret); 210dc11dd5dSJosef Bacik return ret; 211dc11dd5dSJosef Bacik } 212dc11dd5dSJosef Bacik 213dc11dd5dSJosef Bacik ret = btrfs_remove_free_space(cache, 4 * 1024 * 1024, 1 * 1024 * 1024); 214dc11dd5dSJosef Bacik if (ret) { 215dc11dd5dSJosef Bacik test_msg("Couldn't remove from bitmap %d\n", ret); 216dc11dd5dSJosef Bacik return ret; 217dc11dd5dSJosef Bacik } 218dc11dd5dSJosef Bacik 219dc11dd5dSJosef Bacik if (test_check_exists(cache, 4 * 1024 * 1024, 1 * 1024 * 1024)) { 220dc11dd5dSJosef Bacik test_msg("Left remnants in the bitmap\n"); 221dc11dd5dSJosef Bacik return -1; 222dc11dd5dSJosef Bacik } 223dc11dd5dSJosef Bacik 224dc11dd5dSJosef Bacik /* 225dc11dd5dSJosef Bacik * Ok so a little more evil, extent entry and bitmap at the same offset, 226dc11dd5dSJosef Bacik * removing an overlapping chunk. 227dc11dd5dSJosef Bacik */ 228dc11dd5dSJosef Bacik ret = test_add_free_space_entry(cache, 1 * 1024 * 1024, 4 * 1024 * 1024, 1); 229dc11dd5dSJosef Bacik if (ret) { 230dc11dd5dSJosef Bacik test_msg("Couldn't add to a bitmap %d\n", ret); 231dc11dd5dSJosef Bacik return ret; 232dc11dd5dSJosef Bacik } 233dc11dd5dSJosef Bacik 234dc11dd5dSJosef Bacik ret = btrfs_remove_free_space(cache, 512 * 1024, 3 * 1024 * 1024); 235dc11dd5dSJosef Bacik if (ret) { 236dc11dd5dSJosef Bacik test_msg("Couldn't remove overlapping space %d\n", ret); 237dc11dd5dSJosef Bacik return ret; 238dc11dd5dSJosef Bacik } 239dc11dd5dSJosef Bacik 240dc11dd5dSJosef Bacik if (test_check_exists(cache, 512 * 1024, 3 * 1024 * 1024)) { 2418faaaeadSMasanari Iida test_msg("Left over pieces after removing overlapping\n"); 242dc11dd5dSJosef Bacik return -1; 243dc11dd5dSJosef Bacik } 244dc11dd5dSJosef Bacik 245dc11dd5dSJosef Bacik __btrfs_remove_free_space_cache(cache->free_space_ctl); 246dc11dd5dSJosef Bacik 247dc11dd5dSJosef Bacik /* Now with the extent entry offset into the bitmap */ 248dc11dd5dSJosef Bacik ret = test_add_free_space_entry(cache, 4 * 1024 * 1024, 4 * 1024 * 1024, 1); 249dc11dd5dSJosef Bacik if (ret) { 250dc11dd5dSJosef Bacik test_msg("Couldn't add space to the bitmap %d\n", ret); 251dc11dd5dSJosef Bacik return ret; 252dc11dd5dSJosef Bacik } 253dc11dd5dSJosef Bacik 254dc11dd5dSJosef Bacik ret = test_add_free_space_entry(cache, 2 * 1024 * 1024, 2 * 1024 * 1024, 0); 255dc11dd5dSJosef Bacik if (ret) { 256dc11dd5dSJosef Bacik test_msg("Couldn't add extent to the cache %d\n", ret); 257dc11dd5dSJosef Bacik return ret; 258dc11dd5dSJosef Bacik } 259dc11dd5dSJosef Bacik 260dc11dd5dSJosef Bacik ret = btrfs_remove_free_space(cache, 3 * 1024 * 1024, 4 * 1024 * 1024); 261dc11dd5dSJosef Bacik if (ret) { 262dc11dd5dSJosef Bacik test_msg("Problem removing overlapping space %d\n", ret); 263dc11dd5dSJosef Bacik return ret; 264dc11dd5dSJosef Bacik } 265dc11dd5dSJosef Bacik 266dc11dd5dSJosef Bacik if (test_check_exists(cache, 3 * 1024 * 1024, 4 * 1024 * 1024)) { 267dc11dd5dSJosef Bacik test_msg("Left something behind when removing space"); 268dc11dd5dSJosef Bacik return -1; 269dc11dd5dSJosef Bacik } 270dc11dd5dSJosef Bacik 271dc11dd5dSJosef Bacik /* 272dc11dd5dSJosef Bacik * This has blown up in the past, the extent entry starts before the 273dc11dd5dSJosef Bacik * bitmap entry, but we're trying to remove an offset that falls 274dc11dd5dSJosef Bacik * completely within the bitmap range and is in both the extent entry 275dc11dd5dSJosef Bacik * and the bitmap entry, looks like this 276dc11dd5dSJosef Bacik * 277dc11dd5dSJosef Bacik * [ extent ] 278dc11dd5dSJosef Bacik * [ bitmap ] 279dc11dd5dSJosef Bacik * [ del ] 280dc11dd5dSJosef Bacik */ 281dc11dd5dSJosef Bacik __btrfs_remove_free_space_cache(cache->free_space_ctl); 282dc11dd5dSJosef Bacik ret = test_add_free_space_entry(cache, bitmap_offset + 4 * 1024 * 1024, 283dc11dd5dSJosef Bacik 4 * 1024 * 1024, 1); 284dc11dd5dSJosef Bacik if (ret) { 285dc11dd5dSJosef Bacik test_msg("Couldn't add bitmap %d\n", ret); 286dc11dd5dSJosef Bacik return ret; 287dc11dd5dSJosef Bacik } 288dc11dd5dSJosef Bacik 289dc11dd5dSJosef Bacik ret = test_add_free_space_entry(cache, bitmap_offset - 1 * 1024 * 1024, 290dc11dd5dSJosef Bacik 5 * 1024 * 1024, 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 296dc11dd5dSJosef Bacik ret = btrfs_remove_free_space(cache, bitmap_offset + 1 * 1024 * 1024, 297dc11dd5dSJosef Bacik 5 * 1024 * 1024); 298dc11dd5dSJosef Bacik if (ret) { 299dc11dd5dSJosef Bacik test_msg("Failed to free our space %d\n", ret); 300dc11dd5dSJosef Bacik return ret; 301dc11dd5dSJosef Bacik } 302dc11dd5dSJosef Bacik 303dc11dd5dSJosef Bacik if (test_check_exists(cache, bitmap_offset + 1 * 1024 * 1024, 304dc11dd5dSJosef Bacik 5 * 1024 * 1024)) { 305dc11dd5dSJosef Bacik test_msg("Left stuff over\n"); 306dc11dd5dSJosef Bacik return -1; 307dc11dd5dSJosef Bacik } 308dc11dd5dSJosef Bacik 309dc11dd5dSJosef Bacik __btrfs_remove_free_space_cache(cache->free_space_ctl); 310dc11dd5dSJosef Bacik 311dc11dd5dSJosef Bacik /* 312dc11dd5dSJosef Bacik * This blew up before, we have part of the free space in a bitmap and 313dc11dd5dSJosef Bacik * then the entirety of the rest of the space in an extent. This used 314dc11dd5dSJosef Bacik * to return -EAGAIN back from btrfs_remove_extent, make sure this 315dc11dd5dSJosef Bacik * doesn't happen. 316dc11dd5dSJosef Bacik */ 317dc11dd5dSJosef Bacik ret = test_add_free_space_entry(cache, 1 * 1024 * 1024, 2 * 1024 * 1024, 1); 318dc11dd5dSJosef Bacik if (ret) { 319dc11dd5dSJosef Bacik test_msg("Couldn't add bitmap entry %d\n", ret); 320dc11dd5dSJosef Bacik return ret; 321dc11dd5dSJosef Bacik } 322dc11dd5dSJosef Bacik 323dc11dd5dSJosef Bacik ret = test_add_free_space_entry(cache, 3 * 1024 * 1024, 1 * 1024 * 1024, 0); 324dc11dd5dSJosef Bacik if (ret) { 325dc11dd5dSJosef Bacik test_msg("Couldn't add extent entry %d\n", ret); 326dc11dd5dSJosef Bacik return ret; 327dc11dd5dSJosef Bacik } 328dc11dd5dSJosef Bacik 329dc11dd5dSJosef Bacik ret = btrfs_remove_free_space(cache, 1 * 1024 * 1024, 3 * 1024 * 1024); 330dc11dd5dSJosef Bacik if (ret) { 331dc11dd5dSJosef Bacik test_msg("Error removing bitmap and extent overlapping %d\n", ret); 332dc11dd5dSJosef Bacik return ret; 333dc11dd5dSJosef Bacik } 334dc11dd5dSJosef Bacik 335dc11dd5dSJosef Bacik __btrfs_remove_free_space_cache(cache->free_space_ctl); 336dc11dd5dSJosef Bacik return 0; 337dc11dd5dSJosef Bacik } 338dc11dd5dSJosef Bacik 33920005523SFilipe Manana /* Used by test_steal_space_from_bitmap_to_extent(). */ 34020005523SFilipe Manana static bool test_use_bitmap(struct btrfs_free_space_ctl *ctl, 34120005523SFilipe Manana struct btrfs_free_space *info) 34220005523SFilipe Manana { 34320005523SFilipe Manana return ctl->free_extents > 0; 34420005523SFilipe Manana } 34520005523SFilipe Manana 34620005523SFilipe Manana /* Used by test_steal_space_from_bitmap_to_extent(). */ 34720005523SFilipe Manana static int 34820005523SFilipe Manana check_num_extents_and_bitmaps(const struct btrfs_block_group_cache *cache, 34920005523SFilipe Manana const int num_extents, 35020005523SFilipe Manana const int num_bitmaps) 35120005523SFilipe Manana { 35220005523SFilipe Manana if (cache->free_space_ctl->free_extents != num_extents) { 35320005523SFilipe Manana test_msg("Incorrect # of extent entries in the cache: %d, expected %d\n", 35420005523SFilipe Manana cache->free_space_ctl->free_extents, num_extents); 35520005523SFilipe Manana return -EINVAL; 35620005523SFilipe Manana } 35720005523SFilipe Manana if (cache->free_space_ctl->total_bitmaps != num_bitmaps) { 35820005523SFilipe Manana test_msg("Incorrect # of extent entries in the cache: %d, expected %d\n", 35920005523SFilipe Manana cache->free_space_ctl->total_bitmaps, num_bitmaps); 36020005523SFilipe Manana return -EINVAL; 36120005523SFilipe Manana } 36220005523SFilipe Manana return 0; 36320005523SFilipe Manana } 36420005523SFilipe Manana 36520005523SFilipe Manana /* Used by test_steal_space_from_bitmap_to_extent(). */ 36620005523SFilipe Manana static int check_cache_empty(struct btrfs_block_group_cache *cache) 36720005523SFilipe Manana { 36820005523SFilipe Manana u64 offset; 36920005523SFilipe Manana u64 max_extent_size; 37020005523SFilipe Manana 37120005523SFilipe Manana /* 37220005523SFilipe Manana * Now lets confirm that there's absolutely no free space left to 37320005523SFilipe Manana * allocate. 37420005523SFilipe Manana */ 37520005523SFilipe Manana if (cache->free_space_ctl->free_space != 0) { 37620005523SFilipe Manana test_msg("Cache free space is not 0\n"); 37720005523SFilipe Manana return -EINVAL; 37820005523SFilipe Manana } 37920005523SFilipe Manana 38020005523SFilipe Manana /* And any allocation request, no matter how small, should fail now. */ 38120005523SFilipe Manana offset = btrfs_find_space_for_alloc(cache, 0, 4096, 0, 38220005523SFilipe Manana &max_extent_size); 38320005523SFilipe Manana if (offset != 0) { 38420005523SFilipe Manana test_msg("Space allocation did not fail, returned offset: %llu", 38520005523SFilipe Manana offset); 38620005523SFilipe Manana return -EINVAL; 38720005523SFilipe Manana } 38820005523SFilipe Manana 38920005523SFilipe Manana /* And no extent nor bitmap entries in the cache anymore. */ 39020005523SFilipe Manana return check_num_extents_and_bitmaps(cache, 0, 0); 39120005523SFilipe Manana } 39220005523SFilipe Manana 39320005523SFilipe Manana /* 39420005523SFilipe Manana * Before we were able to steal free space from a bitmap entry to an extent 39520005523SFilipe Manana * entry, we could end up with 2 entries representing a contiguous free space. 39620005523SFilipe Manana * One would be an extent entry and the other a bitmap entry. Since in order 39720005523SFilipe Manana * to allocate space to a caller we use only 1 entry, we couldn't return that 39820005523SFilipe Manana * whole range to the caller if it was requested. This forced the caller to 39920005523SFilipe Manana * either assume ENOSPC or perform several smaller space allocations, which 40020005523SFilipe Manana * wasn't optimal as they could be spread all over the block group while under 40120005523SFilipe Manana * concurrency (extra overhead and fragmentation). 40220005523SFilipe Manana * 40320005523SFilipe Manana * This stealing approach is benefical, since we always prefer to allocate from 40420005523SFilipe Manana * extent entries, both for clustered and non-clustered allocation requests. 40520005523SFilipe Manana */ 40620005523SFilipe Manana static int 40720005523SFilipe Manana test_steal_space_from_bitmap_to_extent(struct btrfs_block_group_cache *cache) 40820005523SFilipe Manana { 40920005523SFilipe Manana int ret; 41020005523SFilipe Manana u64 offset; 41120005523SFilipe Manana u64 max_extent_size; 41220005523SFilipe Manana 41320005523SFilipe Manana bool (*use_bitmap_op)(struct btrfs_free_space_ctl *, 41420005523SFilipe Manana struct btrfs_free_space *); 41520005523SFilipe Manana 41620005523SFilipe Manana test_msg("Running space stealing from bitmap to extent\n"); 41720005523SFilipe Manana 41820005523SFilipe Manana /* 41920005523SFilipe Manana * For this test, we want to ensure we end up with an extent entry 42020005523SFilipe Manana * immediately adjacent to a bitmap entry, where the bitmap starts 42120005523SFilipe Manana * at an offset where the extent entry ends. We keep adding and 42220005523SFilipe Manana * removing free space to reach into this state, but to get there 42320005523SFilipe Manana * we need to reach a point where marking new free space doesn't 42420005523SFilipe Manana * result in adding new extent entries or merging the new space 42520005523SFilipe Manana * with existing extent entries - the space ends up being marked 42620005523SFilipe Manana * in an existing bitmap that covers the new free space range. 42720005523SFilipe Manana * 42820005523SFilipe Manana * To get there, we need to reach the threshold defined set at 42920005523SFilipe Manana * cache->free_space_ctl->extents_thresh, which currently is 43020005523SFilipe Manana * 256 extents on a x86_64 system at least, and a few other 43120005523SFilipe Manana * conditions (check free_space_cache.c). Instead of making the 43220005523SFilipe Manana * test much longer and complicated, use a "use_bitmap" operation 43320005523SFilipe Manana * that forces use of bitmaps as soon as we have at least 1 43420005523SFilipe Manana * extent entry. 43520005523SFilipe Manana */ 43620005523SFilipe Manana use_bitmap_op = cache->free_space_ctl->op->use_bitmap; 43720005523SFilipe Manana cache->free_space_ctl->op->use_bitmap = test_use_bitmap; 43820005523SFilipe Manana 43920005523SFilipe Manana /* 44020005523SFilipe Manana * Extent entry covering free space range [128Mb - 256Kb, 128Mb - 128Kb[ 44120005523SFilipe Manana */ 44220005523SFilipe Manana ret = test_add_free_space_entry(cache, 128 * 1024 * 1024 - 256 * 1024, 44320005523SFilipe Manana 128 * 1024, 0); 44420005523SFilipe Manana if (ret) { 44520005523SFilipe Manana test_msg("Couldn't add extent entry %d\n", ret); 44620005523SFilipe Manana return ret; 44720005523SFilipe Manana } 44820005523SFilipe Manana 44920005523SFilipe Manana /* Bitmap entry covering free space range [128Mb + 512Kb, 256Mb[ */ 45020005523SFilipe Manana ret = test_add_free_space_entry(cache, 128 * 1024 * 1024 + 512 * 1024, 45120005523SFilipe Manana 128 * 1024 * 1024 - 512 * 1024, 1); 45220005523SFilipe Manana if (ret) { 45320005523SFilipe Manana test_msg("Couldn't add bitmap entry %d\n", ret); 45420005523SFilipe Manana return ret; 45520005523SFilipe Manana } 45620005523SFilipe Manana 45720005523SFilipe Manana ret = check_num_extents_and_bitmaps(cache, 2, 1); 45820005523SFilipe Manana if (ret) 45920005523SFilipe Manana return ret; 46020005523SFilipe Manana 46120005523SFilipe Manana /* 46220005523SFilipe Manana * Now make only the first 256Kb of the bitmap marked as free, so that 46320005523SFilipe Manana * we end up with only the following ranges marked as free space: 46420005523SFilipe Manana * 46520005523SFilipe Manana * [128Mb - 256Kb, 128Mb - 128Kb[ 46620005523SFilipe Manana * [128Mb + 512Kb, 128Mb + 768Kb[ 46720005523SFilipe Manana */ 46820005523SFilipe Manana ret = btrfs_remove_free_space(cache, 46920005523SFilipe Manana 128 * 1024 * 1024 + 768 * 1024, 47020005523SFilipe Manana 128 * 1024 * 1024 - 768 * 1024); 47120005523SFilipe Manana if (ret) { 47220005523SFilipe Manana test_msg("Failed to free part of bitmap space %d\n", ret); 47320005523SFilipe Manana return ret; 47420005523SFilipe Manana } 47520005523SFilipe Manana 47620005523SFilipe Manana /* Confirm that only those 2 ranges are marked as free. */ 47720005523SFilipe Manana if (!test_check_exists(cache, 128 * 1024 * 1024 - 256 * 1024, 47820005523SFilipe Manana 128 * 1024)) { 47920005523SFilipe Manana test_msg("Free space range missing\n"); 48020005523SFilipe Manana return -ENOENT; 48120005523SFilipe Manana } 48220005523SFilipe Manana if (!test_check_exists(cache, 128 * 1024 * 1024 + 512 * 1024, 48320005523SFilipe Manana 256 * 1024)) { 48420005523SFilipe Manana test_msg("Free space range missing\n"); 48520005523SFilipe Manana return -ENOENT; 48620005523SFilipe Manana } 48720005523SFilipe Manana 48820005523SFilipe Manana /* 48920005523SFilipe Manana * Confirm that the bitmap range [128Mb + 768Kb, 256Mb[ isn't marked 49020005523SFilipe Manana * as free anymore. 49120005523SFilipe Manana */ 49220005523SFilipe Manana if (test_check_exists(cache, 128 * 1024 * 1024 + 768 * 1024, 49320005523SFilipe Manana 128 * 1024 * 1024 - 768 * 1024)) { 49420005523SFilipe Manana test_msg("Bitmap region not removed from space cache\n"); 49520005523SFilipe Manana return -EINVAL; 49620005523SFilipe Manana } 49720005523SFilipe Manana 49820005523SFilipe Manana /* 49920005523SFilipe Manana * Confirm that the region [128Mb + 256Kb, 128Mb + 512Kb[, which is 50020005523SFilipe Manana * covered by the bitmap, isn't marked as free. 50120005523SFilipe Manana */ 50220005523SFilipe Manana if (test_check_exists(cache, 128 * 1024 * 1024 + 256 * 1024, 50320005523SFilipe Manana 256 * 1024)) { 50420005523SFilipe Manana test_msg("Invalid bitmap region marked as free\n"); 50520005523SFilipe Manana return -EINVAL; 50620005523SFilipe Manana } 50720005523SFilipe Manana 50820005523SFilipe Manana /* 50920005523SFilipe Manana * Confirm that the region [128Mb, 128Mb + 256Kb[, which is covered 51020005523SFilipe Manana * by the bitmap too, isn't marked as free either. 51120005523SFilipe Manana */ 51220005523SFilipe Manana if (test_check_exists(cache, 128 * 1024 * 1024, 51320005523SFilipe Manana 256 * 1024)) { 51420005523SFilipe Manana test_msg("Invalid bitmap region marked as free\n"); 51520005523SFilipe Manana return -EINVAL; 51620005523SFilipe Manana } 51720005523SFilipe Manana 51820005523SFilipe Manana /* 51920005523SFilipe Manana * Now lets mark the region [128Mb, 128Mb + 512Kb[ as free too. But, 52020005523SFilipe Manana * lets make sure the free space cache marks it as free in the bitmap, 52120005523SFilipe Manana * and doesn't insert a new extent entry to represent this region. 52220005523SFilipe Manana */ 52320005523SFilipe Manana ret = btrfs_add_free_space(cache, 128 * 1024 * 1024, 512 * 1024); 52420005523SFilipe Manana if (ret) { 52520005523SFilipe Manana test_msg("Error adding free space: %d\n", ret); 52620005523SFilipe Manana return ret; 52720005523SFilipe Manana } 52820005523SFilipe Manana /* Confirm the region is marked as free. */ 52920005523SFilipe Manana if (!test_check_exists(cache, 128 * 1024 * 1024, 512 * 1024)) { 53020005523SFilipe Manana test_msg("Bitmap region not marked as free\n"); 53120005523SFilipe Manana return -ENOENT; 53220005523SFilipe Manana } 53320005523SFilipe Manana 53420005523SFilipe Manana /* 53520005523SFilipe Manana * Confirm that no new extent entries or bitmap entries were added to 53620005523SFilipe Manana * the cache after adding that free space region. 53720005523SFilipe Manana */ 53820005523SFilipe Manana ret = check_num_extents_and_bitmaps(cache, 2, 1); 53920005523SFilipe Manana if (ret) 54020005523SFilipe Manana return ret; 54120005523SFilipe Manana 54220005523SFilipe Manana /* 54320005523SFilipe Manana * Now lets add a small free space region to the right of the previous 54420005523SFilipe Manana * one, which is not contiguous with it and is part of the bitmap too. 54520005523SFilipe Manana * The goal is to test that the bitmap entry space stealing doesn't 54620005523SFilipe Manana * steal this space region. 54720005523SFilipe Manana */ 54820005523SFilipe Manana ret = btrfs_add_free_space(cache, 128 * 1024 * 1024 + 16 * 1024 * 1024, 54920005523SFilipe Manana 4096); 55020005523SFilipe Manana if (ret) { 55120005523SFilipe Manana test_msg("Error adding free space: %d\n", ret); 55220005523SFilipe Manana return ret; 55320005523SFilipe Manana } 55420005523SFilipe Manana 55520005523SFilipe Manana /* 55620005523SFilipe Manana * Confirm that no new extent entries or bitmap entries were added to 55720005523SFilipe Manana * the cache after adding that free space region. 55820005523SFilipe Manana */ 55920005523SFilipe Manana ret = check_num_extents_and_bitmaps(cache, 2, 1); 56020005523SFilipe Manana if (ret) 56120005523SFilipe Manana return ret; 56220005523SFilipe Manana 56320005523SFilipe Manana /* 56420005523SFilipe Manana * Now mark the region [128Mb - 128Kb, 128Mb[ as free too. This will 56520005523SFilipe Manana * expand the range covered by the existing extent entry that represents 56620005523SFilipe Manana * the free space [128Mb - 256Kb, 128Mb - 128Kb[. 56720005523SFilipe Manana */ 56820005523SFilipe Manana ret = btrfs_add_free_space(cache, 128 * 1024 * 1024 - 128 * 1024, 56920005523SFilipe Manana 128 * 1024); 57020005523SFilipe Manana if (ret) { 57120005523SFilipe Manana test_msg("Error adding free space: %d\n", ret); 57220005523SFilipe Manana return ret; 57320005523SFilipe Manana } 57420005523SFilipe Manana /* Confirm the region is marked as free. */ 57520005523SFilipe Manana if (!test_check_exists(cache, 128 * 1024 * 1024 - 128 * 1024, 57620005523SFilipe Manana 128 * 1024)) { 57720005523SFilipe Manana test_msg("Extent region not marked as free\n"); 57820005523SFilipe Manana return -ENOENT; 57920005523SFilipe Manana } 58020005523SFilipe Manana 58120005523SFilipe Manana /* 58220005523SFilipe Manana * Confirm that our extent entry didn't stole all free space from the 58320005523SFilipe Manana * bitmap, because of the small 4Kb free space region. 58420005523SFilipe Manana */ 58520005523SFilipe Manana ret = check_num_extents_and_bitmaps(cache, 2, 1); 58620005523SFilipe Manana if (ret) 58720005523SFilipe Manana return ret; 58820005523SFilipe Manana 58920005523SFilipe Manana /* 59020005523SFilipe Manana * So now we have the range [128Mb - 256Kb, 128Mb + 768Kb[ as free 59120005523SFilipe Manana * space. Without stealing bitmap free space into extent entry space, 59220005523SFilipe Manana * we would have all this free space represented by 2 entries in the 59320005523SFilipe Manana * cache: 59420005523SFilipe Manana * 59520005523SFilipe Manana * extent entry covering range: [128Mb - 256Kb, 128Mb[ 59620005523SFilipe Manana * bitmap entry covering range: [128Mb, 128Mb + 768Kb[ 59720005523SFilipe Manana * 59820005523SFilipe Manana * Attempting to allocate the whole free space (1Mb) would fail, because 59920005523SFilipe Manana * we can't allocate from multiple entries. 60020005523SFilipe Manana * With the bitmap free space stealing, we get a single extent entry 60120005523SFilipe Manana * that represents the 1Mb free space, and therefore we're able to 60220005523SFilipe Manana * allocate the whole free space at once. 60320005523SFilipe Manana */ 60420005523SFilipe Manana if (!test_check_exists(cache, 128 * 1024 * 1024 - 256 * 1024, 60520005523SFilipe Manana 1 * 1024 * 1024)) { 60620005523SFilipe Manana test_msg("Expected region not marked as free\n"); 60720005523SFilipe Manana return -ENOENT; 60820005523SFilipe Manana } 60920005523SFilipe Manana 61020005523SFilipe Manana if (cache->free_space_ctl->free_space != (1 * 1024 * 1024 + 4096)) { 61120005523SFilipe Manana test_msg("Cache free space is not 1Mb + 4Kb\n"); 61220005523SFilipe Manana return -EINVAL; 61320005523SFilipe Manana } 61420005523SFilipe Manana 61520005523SFilipe Manana offset = btrfs_find_space_for_alloc(cache, 61620005523SFilipe Manana 0, 1 * 1024 * 1024, 0, 61720005523SFilipe Manana &max_extent_size); 61820005523SFilipe Manana if (offset != (128 * 1024 * 1024 - 256 * 1024)) { 61920005523SFilipe Manana test_msg("Failed to allocate 1Mb from space cache, returned offset is: %llu\n", 62020005523SFilipe Manana offset); 62120005523SFilipe Manana return -EINVAL; 62220005523SFilipe Manana } 62320005523SFilipe Manana 62420005523SFilipe Manana /* All that remains is a 4Kb free space region in a bitmap. Confirm. */ 62520005523SFilipe Manana ret = check_num_extents_and_bitmaps(cache, 1, 1); 62620005523SFilipe Manana if (ret) 62720005523SFilipe Manana return ret; 62820005523SFilipe Manana 62920005523SFilipe Manana if (cache->free_space_ctl->free_space != 4096) { 63020005523SFilipe Manana test_msg("Cache free space is not 4Kb\n"); 63120005523SFilipe Manana return -EINVAL; 63220005523SFilipe Manana } 63320005523SFilipe Manana 63420005523SFilipe Manana offset = btrfs_find_space_for_alloc(cache, 63520005523SFilipe Manana 0, 4096, 0, 63620005523SFilipe Manana &max_extent_size); 63720005523SFilipe Manana if (offset != (128 * 1024 * 1024 + 16 * 1024 * 1024)) { 63820005523SFilipe Manana test_msg("Failed to allocate 4Kb from space cache, returned offset is: %llu\n", 63920005523SFilipe Manana offset); 64020005523SFilipe Manana return -EINVAL; 64120005523SFilipe Manana } 64220005523SFilipe Manana 64320005523SFilipe Manana ret = check_cache_empty(cache); 64420005523SFilipe Manana if (ret) 64520005523SFilipe Manana return ret; 64620005523SFilipe Manana 64720005523SFilipe Manana __btrfs_remove_free_space_cache(cache->free_space_ctl); 64820005523SFilipe Manana 64920005523SFilipe Manana /* 65020005523SFilipe Manana * Now test a similar scenario, but where our extent entry is located 65120005523SFilipe Manana * to the right of the bitmap entry, so that we can check that stealing 65220005523SFilipe Manana * space from a bitmap to the front of an extent entry works. 65320005523SFilipe Manana */ 65420005523SFilipe Manana 65520005523SFilipe Manana /* 65620005523SFilipe Manana * Extent entry covering free space range [128Mb + 128Kb, 128Mb + 256Kb[ 65720005523SFilipe Manana */ 65820005523SFilipe Manana ret = test_add_free_space_entry(cache, 128 * 1024 * 1024 + 128 * 1024, 65920005523SFilipe Manana 128 * 1024, 0); 66020005523SFilipe Manana if (ret) { 66120005523SFilipe Manana test_msg("Couldn't add extent entry %d\n", ret); 66220005523SFilipe Manana return ret; 66320005523SFilipe Manana } 66420005523SFilipe Manana 66520005523SFilipe Manana /* Bitmap entry covering free space range [0, 128Mb - 512Kb[ */ 66620005523SFilipe Manana ret = test_add_free_space_entry(cache, 0, 66720005523SFilipe Manana 128 * 1024 * 1024 - 512 * 1024, 1); 66820005523SFilipe Manana if (ret) { 66920005523SFilipe Manana test_msg("Couldn't add bitmap entry %d\n", ret); 67020005523SFilipe Manana return ret; 67120005523SFilipe Manana } 67220005523SFilipe Manana 67320005523SFilipe Manana ret = check_num_extents_and_bitmaps(cache, 2, 1); 67420005523SFilipe Manana if (ret) 67520005523SFilipe Manana return ret; 67620005523SFilipe Manana 67720005523SFilipe Manana /* 67820005523SFilipe Manana * Now make only the last 256Kb of the bitmap marked as free, so that 67920005523SFilipe Manana * we end up with only the following ranges marked as free space: 68020005523SFilipe Manana * 68120005523SFilipe Manana * [128Mb + 128b, 128Mb + 256Kb[ 68220005523SFilipe Manana * [128Mb - 768Kb, 128Mb - 512Kb[ 68320005523SFilipe Manana */ 68420005523SFilipe Manana ret = btrfs_remove_free_space(cache, 68520005523SFilipe Manana 0, 68620005523SFilipe Manana 128 * 1024 * 1024 - 768 * 1024); 68720005523SFilipe Manana if (ret) { 68820005523SFilipe Manana test_msg("Failed to free part of bitmap space %d\n", ret); 68920005523SFilipe Manana return ret; 69020005523SFilipe Manana } 69120005523SFilipe Manana 69220005523SFilipe Manana /* Confirm that only those 2 ranges are marked as free. */ 69320005523SFilipe Manana if (!test_check_exists(cache, 128 * 1024 * 1024 + 128 * 1024, 69420005523SFilipe Manana 128 * 1024)) { 69520005523SFilipe Manana test_msg("Free space range missing\n"); 69620005523SFilipe Manana return -ENOENT; 69720005523SFilipe Manana } 69820005523SFilipe Manana if (!test_check_exists(cache, 128 * 1024 * 1024 - 768 * 1024, 69920005523SFilipe Manana 256 * 1024)) { 70020005523SFilipe Manana test_msg("Free space range missing\n"); 70120005523SFilipe Manana return -ENOENT; 70220005523SFilipe Manana } 70320005523SFilipe Manana 70420005523SFilipe Manana /* 70520005523SFilipe Manana * Confirm that the bitmap range [0, 128Mb - 768Kb[ isn't marked 70620005523SFilipe Manana * as free anymore. 70720005523SFilipe Manana */ 70820005523SFilipe Manana if (test_check_exists(cache, 0, 70920005523SFilipe Manana 128 * 1024 * 1024 - 768 * 1024)) { 71020005523SFilipe Manana test_msg("Bitmap region not removed from space cache\n"); 71120005523SFilipe Manana return -EINVAL; 71220005523SFilipe Manana } 71320005523SFilipe Manana 71420005523SFilipe Manana /* 71520005523SFilipe Manana * Confirm that the region [128Mb - 512Kb, 128Mb[, which is 71620005523SFilipe Manana * covered by the bitmap, isn't marked as free. 71720005523SFilipe Manana */ 71820005523SFilipe Manana if (test_check_exists(cache, 128 * 1024 * 1024 - 512 * 1024, 71920005523SFilipe Manana 512 * 1024)) { 72020005523SFilipe Manana test_msg("Invalid bitmap region marked as free\n"); 72120005523SFilipe Manana return -EINVAL; 72220005523SFilipe Manana } 72320005523SFilipe Manana 72420005523SFilipe Manana /* 72520005523SFilipe Manana * Now lets mark the region [128Mb - 512Kb, 128Mb[ as free too. But, 72620005523SFilipe Manana * lets make sure the free space cache marks it as free in the bitmap, 72720005523SFilipe Manana * and doesn't insert a new extent entry to represent this region. 72820005523SFilipe Manana */ 72920005523SFilipe Manana ret = btrfs_add_free_space(cache, 128 * 1024 * 1024 - 512 * 1024, 73020005523SFilipe Manana 512 * 1024); 73120005523SFilipe Manana if (ret) { 73220005523SFilipe Manana test_msg("Error adding free space: %d\n", ret); 73320005523SFilipe Manana return ret; 73420005523SFilipe Manana } 73520005523SFilipe Manana /* Confirm the region is marked as free. */ 73620005523SFilipe Manana if (!test_check_exists(cache, 128 * 1024 * 1024 - 512 * 1024, 73720005523SFilipe Manana 512 * 1024)) { 73820005523SFilipe Manana test_msg("Bitmap region not marked as free\n"); 73920005523SFilipe Manana return -ENOENT; 74020005523SFilipe Manana } 74120005523SFilipe Manana 74220005523SFilipe Manana /* 74320005523SFilipe Manana * Confirm that no new extent entries or bitmap entries were added to 74420005523SFilipe Manana * the cache after adding that free space region. 74520005523SFilipe Manana */ 74620005523SFilipe Manana ret = check_num_extents_and_bitmaps(cache, 2, 1); 74720005523SFilipe Manana if (ret) 74820005523SFilipe Manana return ret; 74920005523SFilipe Manana 75020005523SFilipe Manana /* 75120005523SFilipe Manana * Now lets add a small free space region to the left of the previous 75220005523SFilipe Manana * one, which is not contiguous with it and is part of the bitmap too. 75320005523SFilipe Manana * The goal is to test that the bitmap entry space stealing doesn't 75420005523SFilipe Manana * steal this space region. 75520005523SFilipe Manana */ 75620005523SFilipe Manana ret = btrfs_add_free_space(cache, 32 * 1024 * 1024, 8192); 75720005523SFilipe Manana if (ret) { 75820005523SFilipe Manana test_msg("Error adding free space: %d\n", ret); 75920005523SFilipe Manana return ret; 76020005523SFilipe Manana } 76120005523SFilipe Manana 76220005523SFilipe Manana /* 76320005523SFilipe Manana * Now mark the region [128Mb, 128Mb + 128Kb[ as free too. This will 76420005523SFilipe Manana * expand the range covered by the existing extent entry that represents 76520005523SFilipe Manana * the free space [128Mb + 128Kb, 128Mb + 256Kb[. 76620005523SFilipe Manana */ 76720005523SFilipe Manana ret = btrfs_add_free_space(cache, 128 * 1024 * 1024, 128 * 1024); 76820005523SFilipe Manana if (ret) { 76920005523SFilipe Manana test_msg("Error adding free space: %d\n", ret); 77020005523SFilipe Manana return ret; 77120005523SFilipe Manana } 77220005523SFilipe Manana /* Confirm the region is marked as free. */ 77320005523SFilipe Manana if (!test_check_exists(cache, 128 * 1024 * 1024, 128 * 1024)) { 77420005523SFilipe Manana test_msg("Extent region not marked as free\n"); 77520005523SFilipe Manana return -ENOENT; 77620005523SFilipe Manana } 77720005523SFilipe Manana 77820005523SFilipe Manana /* 77920005523SFilipe Manana * Confirm that our extent entry didn't stole all free space from the 78020005523SFilipe Manana * bitmap, because of the small 8Kb free space region. 78120005523SFilipe Manana */ 78220005523SFilipe Manana ret = check_num_extents_and_bitmaps(cache, 2, 1); 78320005523SFilipe Manana if (ret) 78420005523SFilipe Manana return ret; 78520005523SFilipe Manana 78620005523SFilipe Manana /* 78720005523SFilipe Manana * So now we have the range [128Mb - 768Kb, 128Mb + 256Kb[ as free 78820005523SFilipe Manana * space. Without stealing bitmap free space into extent entry space, 78920005523SFilipe Manana * we would have all this free space represented by 2 entries in the 79020005523SFilipe Manana * cache: 79120005523SFilipe Manana * 79220005523SFilipe Manana * extent entry covering range: [128Mb, 128Mb + 256Kb[ 79320005523SFilipe Manana * bitmap entry covering range: [128Mb - 768Kb, 128Mb[ 79420005523SFilipe Manana * 79520005523SFilipe Manana * Attempting to allocate the whole free space (1Mb) would fail, because 79620005523SFilipe Manana * we can't allocate from multiple entries. 79720005523SFilipe Manana * With the bitmap free space stealing, we get a single extent entry 79820005523SFilipe Manana * that represents the 1Mb free space, and therefore we're able to 79920005523SFilipe Manana * allocate the whole free space at once. 80020005523SFilipe Manana */ 80120005523SFilipe Manana if (!test_check_exists(cache, 128 * 1024 * 1024 - 768 * 1024, 80220005523SFilipe Manana 1 * 1024 * 1024)) { 80320005523SFilipe Manana test_msg("Expected region not marked as free\n"); 80420005523SFilipe Manana return -ENOENT; 80520005523SFilipe Manana } 80620005523SFilipe Manana 80720005523SFilipe Manana if (cache->free_space_ctl->free_space != (1 * 1024 * 1024 + 8192)) { 80820005523SFilipe Manana test_msg("Cache free space is not 1Mb + 8Kb\n"); 80920005523SFilipe Manana return -EINVAL; 81020005523SFilipe Manana } 81120005523SFilipe Manana 81220005523SFilipe Manana offset = btrfs_find_space_for_alloc(cache, 81320005523SFilipe Manana 0, 1 * 1024 * 1024, 0, 81420005523SFilipe Manana &max_extent_size); 81520005523SFilipe Manana if (offset != (128 * 1024 * 1024 - 768 * 1024)) { 81620005523SFilipe Manana test_msg("Failed to allocate 1Mb from space cache, returned offset is: %llu\n", 81720005523SFilipe Manana offset); 81820005523SFilipe Manana return -EINVAL; 81920005523SFilipe Manana } 82020005523SFilipe Manana 82120005523SFilipe Manana /* All that remains is a 8Kb free space region in a bitmap. Confirm. */ 82220005523SFilipe Manana ret = check_num_extents_and_bitmaps(cache, 1, 1); 82320005523SFilipe Manana if (ret) 82420005523SFilipe Manana return ret; 82520005523SFilipe Manana 82620005523SFilipe Manana if (cache->free_space_ctl->free_space != 8192) { 82720005523SFilipe Manana test_msg("Cache free space is not 8Kb\n"); 82820005523SFilipe Manana return -EINVAL; 82920005523SFilipe Manana } 83020005523SFilipe Manana 83120005523SFilipe Manana offset = btrfs_find_space_for_alloc(cache, 83220005523SFilipe Manana 0, 8192, 0, 83320005523SFilipe Manana &max_extent_size); 83420005523SFilipe Manana if (offset != (32 * 1024 * 1024)) { 83520005523SFilipe Manana test_msg("Failed to allocate 8Kb from space cache, returned offset is: %llu\n", 83620005523SFilipe Manana offset); 83720005523SFilipe Manana return -EINVAL; 83820005523SFilipe Manana } 83920005523SFilipe Manana 84020005523SFilipe Manana ret = check_cache_empty(cache); 84120005523SFilipe Manana if (ret) 84220005523SFilipe Manana return ret; 84320005523SFilipe Manana 84420005523SFilipe Manana cache->free_space_ctl->op->use_bitmap = use_bitmap_op; 84520005523SFilipe Manana __btrfs_remove_free_space_cache(cache->free_space_ctl); 84620005523SFilipe Manana 84720005523SFilipe Manana return 0; 84820005523SFilipe Manana } 84920005523SFilipe Manana 850dc11dd5dSJosef Bacik int btrfs_test_free_space_cache(void) 851dc11dd5dSJosef Bacik { 852dc11dd5dSJosef Bacik struct btrfs_block_group_cache *cache; 853dc11dd5dSJosef Bacik int ret; 854dc11dd5dSJosef Bacik 855dc11dd5dSJosef Bacik test_msg("Running btrfs free space cache tests\n"); 856dc11dd5dSJosef Bacik 857*7c55ee0cSOmar Sandoval cache = btrfs_alloc_dummy_block_group(1024 * 1024 * 1024); 858dc11dd5dSJosef Bacik if (!cache) { 859dc11dd5dSJosef Bacik test_msg("Couldn't run the tests\n"); 860dc11dd5dSJosef Bacik return 0; 861dc11dd5dSJosef Bacik } 862dc11dd5dSJosef Bacik 863dc11dd5dSJosef Bacik ret = test_extents(cache); 864dc11dd5dSJosef Bacik if (ret) 865dc11dd5dSJosef Bacik goto out; 866dc11dd5dSJosef Bacik ret = test_bitmaps(cache); 867dc11dd5dSJosef Bacik if (ret) 868dc11dd5dSJosef Bacik goto out; 869dc11dd5dSJosef Bacik ret = test_bitmaps_and_extents(cache); 870dc11dd5dSJosef Bacik if (ret) 871dc11dd5dSJosef Bacik goto out; 87220005523SFilipe Manana 87320005523SFilipe Manana ret = test_steal_space_from_bitmap_to_extent(cache); 874dc11dd5dSJosef Bacik out: 875*7c55ee0cSOmar Sandoval btrfs_free_dummy_block_group(cache); 876dc11dd5dSJosef Bacik test_msg("Free space cache tests finished\n"); 877dc11dd5dSJosef Bacik return ret; 878dc11dd5dSJosef Bacik } 879