linux/fs/btrfs/tests/free-space-tests.c
<<
>>
Prefs
   1/*
   2 * Copyright (C) 2013 Fusion IO.  All rights reserved.
   3 *
   4 * This program is free software; you can redistribute it and/or
   5 * modify it under the terms of the GNU General Public
   6 * License v2 as published by the Free Software Foundation.
   7 *
   8 * This program is distributed in the hope that it will be useful,
   9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  11 * General Public License for more details.
  12 *
  13 * You should have received a copy of the GNU General Public
  14 * License along with this program; if not, write to the
  15 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
  16 * Boston, MA 021110-1307, USA.
  17 */
  18
  19#include <linux/slab.h>
  20#include "btrfs-tests.h"
  21#include "../ctree.h"
  22#include "../disk-io.h"
  23#include "../free-space-cache.h"
  24
  25#define BITS_PER_BITMAP         (PAGE_SIZE * 8UL)
  26
  27/*
  28 * This test just does basic sanity checking, making sure we can add an extent
  29 * entry and remove space from either end and the middle, and make sure we can
  30 * remove space that covers adjacent extent entries.
  31 */
  32static int test_extents(struct btrfs_block_group_cache *cache)
  33{
  34        int ret = 0;
  35
  36        test_msg("Running extent only tests\n");
  37
  38        /* First just make sure we can remove an entire entry */
  39        ret = btrfs_add_free_space(cache, 0, SZ_4M);
  40        if (ret) {
  41                test_msg("Error adding initial extents %d\n", ret);
  42                return ret;
  43        }
  44
  45        ret = btrfs_remove_free_space(cache, 0, SZ_4M);
  46        if (ret) {
  47                test_msg("Error removing extent %d\n", ret);
  48                return ret;
  49        }
  50
  51        if (test_check_exists(cache, 0, SZ_4M)) {
  52                test_msg("Full remove left some lingering space\n");
  53                return -1;
  54        }
  55
  56        /* Ok edge and middle cases now */
  57        ret = btrfs_add_free_space(cache, 0, SZ_4M);
  58        if (ret) {
  59                test_msg("Error adding half extent %d\n", ret);
  60                return ret;
  61        }
  62
  63        ret = btrfs_remove_free_space(cache, 3 * SZ_1M, SZ_1M);
  64        if (ret) {
  65                test_msg("Error removing tail end %d\n", ret);
  66                return ret;
  67        }
  68
  69        ret = btrfs_remove_free_space(cache, 0, SZ_1M);
  70        if (ret) {
  71                test_msg("Error removing front end %d\n", ret);
  72                return ret;
  73        }
  74
  75        ret = btrfs_remove_free_space(cache, SZ_2M, 4096);
  76        if (ret) {
  77                test_msg("Error removing middle piece %d\n", ret);
  78                return ret;
  79        }
  80
  81        if (test_check_exists(cache, 0, SZ_1M)) {
  82                test_msg("Still have space at the front\n");
  83                return -1;
  84        }
  85
  86        if (test_check_exists(cache, SZ_2M, 4096)) {
  87                test_msg("Still have space in the middle\n");
  88                return -1;
  89        }
  90
  91        if (test_check_exists(cache, 3 * SZ_1M, SZ_1M)) {
  92                test_msg("Still have space at the end\n");
  93                return -1;
  94        }
  95
  96        /* Cleanup */
  97        __btrfs_remove_free_space_cache(cache->free_space_ctl);
  98
  99        return 0;
 100}
 101
 102static int test_bitmaps(struct btrfs_block_group_cache *cache,
 103                        u32 sectorsize)
 104{
 105        u64 next_bitmap_offset;
 106        int ret;
 107
 108        test_msg("Running bitmap only tests\n");
 109
 110        ret = test_add_free_space_entry(cache, 0, SZ_4M, 1);
 111        if (ret) {
 112                test_msg("Couldn't create a bitmap entry %d\n", ret);
 113                return ret;
 114        }
 115
 116        ret = btrfs_remove_free_space(cache, 0, SZ_4M);
 117        if (ret) {
 118                test_msg("Error removing bitmap full range %d\n", ret);
 119                return ret;
 120        }
 121
 122        if (test_check_exists(cache, 0, SZ_4M)) {
 123                test_msg("Left some space in bitmap\n");
 124                return -1;
 125        }
 126
 127        ret = test_add_free_space_entry(cache, 0, SZ_4M, 1);
 128        if (ret) {
 129                test_msg("Couldn't add to our bitmap entry %d\n", ret);
 130                return ret;
 131        }
 132
 133        ret = btrfs_remove_free_space(cache, SZ_1M, SZ_2M);
 134        if (ret) {
 135                test_msg("Couldn't remove middle chunk %d\n", ret);
 136                return ret;
 137        }
 138
 139        /*
 140         * The first bitmap we have starts at offset 0 so the next one is just
 141         * at the end of the first bitmap.
 142         */
 143        next_bitmap_offset = (u64)(BITS_PER_BITMAP * sectorsize);
 144
 145        /* Test a bit straddling two bitmaps */
 146        ret = test_add_free_space_entry(cache, next_bitmap_offset - SZ_2M,
 147                                        SZ_4M, 1);
 148        if (ret) {
 149                test_msg("Couldn't add space that straddles two bitmaps %d\n",
 150                                ret);
 151                return ret;
 152        }
 153
 154        ret = btrfs_remove_free_space(cache, next_bitmap_offset - SZ_1M, SZ_2M);
 155        if (ret) {
 156                test_msg("Couldn't remove overlapping space %d\n", ret);
 157                return ret;
 158        }
 159
 160        if (test_check_exists(cache, next_bitmap_offset - SZ_1M, SZ_2M)) {
 161                test_msg("Left some space when removing overlapping\n");
 162                return -1;
 163        }
 164
 165        __btrfs_remove_free_space_cache(cache->free_space_ctl);
 166
 167        return 0;
 168}
 169
 170/* This is the high grade jackassery */
 171static int test_bitmaps_and_extents(struct btrfs_block_group_cache *cache,
 172                                    u32 sectorsize)
 173{
 174        u64 bitmap_offset = (u64)(BITS_PER_BITMAP * sectorsize);
 175        int ret;
 176
 177        test_msg("Running bitmap and extent tests\n");
 178
 179        /*
 180         * First let's do something simple, an extent at the same offset as the
 181         * bitmap, but the free space completely in the extent and then
 182         * completely in the bitmap.
 183         */
 184        ret = test_add_free_space_entry(cache, SZ_4M, SZ_1M, 1);
 185        if (ret) {
 186                test_msg("Couldn't create bitmap entry %d\n", ret);
 187                return ret;
 188        }
 189
 190        ret = test_add_free_space_entry(cache, 0, SZ_1M, 0);
 191        if (ret) {
 192                test_msg("Couldn't add extent entry %d\n", ret);
 193                return ret;
 194        }
 195
 196        ret = btrfs_remove_free_space(cache, 0, SZ_1M);
 197        if (ret) {
 198                test_msg("Couldn't remove extent entry %d\n", ret);
 199                return ret;
 200        }
 201
 202        if (test_check_exists(cache, 0, SZ_1M)) {
 203                test_msg("Left remnants after our remove\n");
 204                return -1;
 205        }
 206
 207        /* Now to add back the extent entry and remove from the bitmap */
 208        ret = test_add_free_space_entry(cache, 0, SZ_1M, 0);
 209        if (ret) {
 210                test_msg("Couldn't re-add extent entry %d\n", ret);
 211                return ret;
 212        }
 213
 214        ret = btrfs_remove_free_space(cache, SZ_4M, SZ_1M);
 215        if (ret) {
 216                test_msg("Couldn't remove from bitmap %d\n", ret);
 217                return ret;
 218        }
 219
 220        if (test_check_exists(cache, SZ_4M, SZ_1M)) {
 221                test_msg("Left remnants in the bitmap\n");
 222                return -1;
 223        }
 224
 225        /*
 226         * Ok so a little more evil, extent entry and bitmap at the same offset,
 227         * removing an overlapping chunk.
 228         */
 229        ret = test_add_free_space_entry(cache, SZ_1M, SZ_4M, 1);
 230        if (ret) {
 231                test_msg("Couldn't add to a bitmap %d\n", ret);
 232                return ret;
 233        }
 234
 235        ret = btrfs_remove_free_space(cache, SZ_512K, 3 * SZ_1M);
 236        if (ret) {
 237                test_msg("Couldn't remove overlapping space %d\n", ret);
 238                return ret;
 239        }
 240
 241        if (test_check_exists(cache, SZ_512K, 3 * SZ_1M)) {
 242                test_msg("Left over pieces after removing overlapping\n");
 243                return -1;
 244        }
 245
 246        __btrfs_remove_free_space_cache(cache->free_space_ctl);
 247
 248        /* Now with the extent entry offset into the bitmap */
 249        ret = test_add_free_space_entry(cache, SZ_4M, SZ_4M, 1);
 250        if (ret) {
 251                test_msg("Couldn't add space to the bitmap %d\n", ret);
 252                return ret;
 253        }
 254
 255        ret = test_add_free_space_entry(cache, SZ_2M, SZ_2M, 0);
 256        if (ret) {
 257                test_msg("Couldn't add extent to the cache %d\n", ret);
 258                return ret;
 259        }
 260
 261        ret = btrfs_remove_free_space(cache, 3 * SZ_1M, SZ_4M);
 262        if (ret) {
 263                test_msg("Problem removing overlapping space %d\n", ret);
 264                return ret;
 265        }
 266
 267        if (test_check_exists(cache, 3 * SZ_1M, SZ_4M)) {
 268                test_msg("Left something behind when removing space");
 269                return -1;
 270        }
 271
 272        /*
 273         * This has blown up in the past, the extent entry starts before the
 274         * bitmap entry, but we're trying to remove an offset that falls
 275         * completely within the bitmap range and is in both the extent entry
 276         * and the bitmap entry, looks like this
 277         *
 278         *   [ extent ]
 279         *      [ bitmap ]
 280         *        [ del ]
 281         */
 282        __btrfs_remove_free_space_cache(cache->free_space_ctl);
 283        ret = test_add_free_space_entry(cache, bitmap_offset + SZ_4M, SZ_4M, 1);
 284        if (ret) {
 285                test_msg("Couldn't add bitmap %d\n", ret);
 286                return ret;
 287        }
 288
 289        ret = test_add_free_space_entry(cache, bitmap_offset - SZ_1M,
 290                                        5 * SZ_1M, 0);
 291        if (ret) {
 292                test_msg("Couldn't add extent entry %d\n", ret);
 293                return ret;
 294        }
 295
 296        ret = btrfs_remove_free_space(cache, bitmap_offset + SZ_1M, 5 * SZ_1M);
 297        if (ret) {
 298                test_msg("Failed to free our space %d\n", ret);
 299                return ret;
 300        }
 301
 302        if (test_check_exists(cache, bitmap_offset + SZ_1M, 5 * SZ_1M)) {
 303                test_msg("Left stuff over\n");
 304                return -1;
 305        }
 306
 307        __btrfs_remove_free_space_cache(cache->free_space_ctl);
 308
 309        /*
 310         * This blew up before, we have part of the free space in a bitmap and
 311         * then the entirety of the rest of the space in an extent.  This used
 312         * to return -EAGAIN back from btrfs_remove_extent, make sure this
 313         * doesn't happen.
 314         */
 315        ret = test_add_free_space_entry(cache, SZ_1M, SZ_2M, 1);
 316        if (ret) {
 317                test_msg("Couldn't add bitmap entry %d\n", ret);
 318                return ret;
 319        }
 320
 321        ret = test_add_free_space_entry(cache, 3 * SZ_1M, SZ_1M, 0);
 322        if (ret) {
 323                test_msg("Couldn't add extent entry %d\n", ret);
 324                return ret;
 325        }
 326
 327        ret = btrfs_remove_free_space(cache, SZ_1M, 3 * SZ_1M);
 328        if (ret) {
 329                test_msg("Error removing bitmap and extent overlapping %d\n", ret);
 330                return ret;
 331        }
 332
 333        __btrfs_remove_free_space_cache(cache->free_space_ctl);
 334        return 0;
 335}
 336
 337/* Used by test_steal_space_from_bitmap_to_extent(). */
 338static bool test_use_bitmap(struct btrfs_free_space_ctl *ctl,
 339                            struct btrfs_free_space *info)
 340{
 341        return ctl->free_extents > 0;
 342}
 343
 344/* Used by test_steal_space_from_bitmap_to_extent(). */
 345static int
 346check_num_extents_and_bitmaps(const struct btrfs_block_group_cache *cache,
 347                              const int num_extents,
 348                              const int num_bitmaps)
 349{
 350        if (cache->free_space_ctl->free_extents != num_extents) {
 351                test_msg("Incorrect # of extent entries in the cache: %d, expected %d\n",
 352                         cache->free_space_ctl->free_extents, num_extents);
 353                return -EINVAL;
 354        }
 355        if (cache->free_space_ctl->total_bitmaps != num_bitmaps) {
 356                test_msg("Incorrect # of extent entries in the cache: %d, expected %d\n",
 357                         cache->free_space_ctl->total_bitmaps, num_bitmaps);
 358                return -EINVAL;
 359        }
 360        return 0;
 361}
 362
 363/* Used by test_steal_space_from_bitmap_to_extent(). */
 364static int check_cache_empty(struct btrfs_block_group_cache *cache)
 365{
 366        u64 offset;
 367        u64 max_extent_size;
 368
 369        /*
 370         * Now lets confirm that there's absolutely no free space left to
 371         * allocate.
 372         */
 373        if (cache->free_space_ctl->free_space != 0) {
 374                test_msg("Cache free space is not 0\n");
 375                return -EINVAL;
 376        }
 377
 378        /* And any allocation request, no matter how small, should fail now. */
 379        offset = btrfs_find_space_for_alloc(cache, 0, 4096, 0,
 380                                            &max_extent_size);
 381        if (offset != 0) {
 382                test_msg("Space allocation did not fail, returned offset: %llu",
 383                         offset);
 384                return -EINVAL;
 385        }
 386
 387        /* And no extent nor bitmap entries in the cache anymore. */
 388        return check_num_extents_and_bitmaps(cache, 0, 0);
 389}
 390
 391/*
 392 * Before we were able to steal free space from a bitmap entry to an extent
 393 * entry, we could end up with 2 entries representing a contiguous free space.
 394 * One would be an extent entry and the other a bitmap entry. Since in order
 395 * to allocate space to a caller we use only 1 entry, we couldn't return that
 396 * whole range to the caller if it was requested. This forced the caller to
 397 * either assume ENOSPC or perform several smaller space allocations, which
 398 * wasn't optimal as they could be spread all over the block group while under
 399 * concurrency (extra overhead and fragmentation).
 400 *
 401 * This stealing approach is beneficial, since we always prefer to allocate
 402 * from extent entries, both for clustered and non-clustered allocation
 403 * requests.
 404 */
 405static int
 406test_steal_space_from_bitmap_to_extent(struct btrfs_block_group_cache *cache,
 407                                       u32 sectorsize)
 408{
 409        int ret;
 410        u64 offset;
 411        u64 max_extent_size;
 412        const struct btrfs_free_space_op test_free_space_ops = {
 413                .recalc_thresholds = cache->free_space_ctl->op->recalc_thresholds,
 414                .use_bitmap = test_use_bitmap,
 415        };
 416        const struct btrfs_free_space_op *orig_free_space_ops;
 417
 418        test_msg("Running space stealing from bitmap to extent\n");
 419
 420        /*
 421         * For this test, we want to ensure we end up with an extent entry
 422         * immediately adjacent to a bitmap entry, where the bitmap starts
 423         * at an offset where the extent entry ends. We keep adding and
 424         * removing free space to reach into this state, but to get there
 425         * we need to reach a point where marking new free space doesn't
 426         * result in adding new extent entries or merging the new space
 427         * with existing extent entries - the space ends up being marked
 428         * in an existing bitmap that covers the new free space range.
 429         *
 430         * To get there, we need to reach the threshold defined set at
 431         * cache->free_space_ctl->extents_thresh, which currently is
 432         * 256 extents on a x86_64 system at least, and a few other
 433         * conditions (check free_space_cache.c). Instead of making the
 434         * test much longer and complicated, use a "use_bitmap" operation
 435         * that forces use of bitmaps as soon as we have at least 1
 436         * extent entry.
 437         */
 438        orig_free_space_ops = cache->free_space_ctl->op;
 439        cache->free_space_ctl->op = &test_free_space_ops;
 440
 441        /*
 442         * Extent entry covering free space range [128Mb - 256Kb, 128Mb - 128Kb[
 443         */
 444        ret = test_add_free_space_entry(cache, SZ_128M - SZ_256K, SZ_128K, 0);
 445        if (ret) {
 446                test_msg("Couldn't add extent entry %d\n", ret);
 447                return ret;
 448        }
 449
 450        /* Bitmap entry covering free space range [128Mb + 512Kb, 256Mb[ */
 451        ret = test_add_free_space_entry(cache, SZ_128M + SZ_512K,
 452                                        SZ_128M - SZ_512K, 1);
 453        if (ret) {
 454                test_msg("Couldn't add bitmap entry %d\n", ret);
 455                return ret;
 456        }
 457
 458        ret = check_num_extents_and_bitmaps(cache, 2, 1);
 459        if (ret)
 460                return ret;
 461
 462        /*
 463         * Now make only the first 256Kb of the bitmap marked as free, so that
 464         * we end up with only the following ranges marked as free space:
 465         *
 466         * [128Mb - 256Kb, 128Mb - 128Kb[
 467         * [128Mb + 512Kb, 128Mb + 768Kb[
 468         */
 469        ret = btrfs_remove_free_space(cache,
 470                                      SZ_128M + 768 * SZ_1K,
 471                                      SZ_128M - 768 * SZ_1K);
 472        if (ret) {
 473                test_msg("Failed to free part of bitmap space %d\n", ret);
 474                return ret;
 475        }
 476
 477        /* Confirm that only those 2 ranges are marked as free. */
 478        if (!test_check_exists(cache, SZ_128M - SZ_256K, SZ_128K)) {
 479                test_msg("Free space range missing\n");
 480                return -ENOENT;
 481        }
 482        if (!test_check_exists(cache, SZ_128M + SZ_512K, SZ_256K)) {
 483                test_msg("Free space range missing\n");
 484                return -ENOENT;
 485        }
 486
 487        /*
 488         * Confirm that the bitmap range [128Mb + 768Kb, 256Mb[ isn't marked
 489         * as free anymore.
 490         */
 491        if (test_check_exists(cache, SZ_128M + 768 * SZ_1K,
 492                              SZ_128M - 768 * SZ_1K)) {
 493                test_msg("Bitmap region not removed from space cache\n");
 494                return -EINVAL;
 495        }
 496
 497        /*
 498         * Confirm that the region [128Mb + 256Kb, 128Mb + 512Kb[, which is
 499         * covered by the bitmap, isn't marked as free.
 500         */
 501        if (test_check_exists(cache, SZ_128M + SZ_256K, SZ_256K)) {
 502                test_msg("Invalid bitmap region marked as free\n");
 503                return -EINVAL;
 504        }
 505
 506        /*
 507         * Confirm that the region [128Mb, 128Mb + 256Kb[, which is covered
 508         * by the bitmap too, isn't marked as free either.
 509         */
 510        if (test_check_exists(cache, SZ_128M, SZ_256K)) {
 511                test_msg("Invalid bitmap region marked as free\n");
 512                return -EINVAL;
 513        }
 514
 515        /*
 516         * Now lets mark the region [128Mb, 128Mb + 512Kb[ as free too. But,
 517         * lets make sure the free space cache marks it as free in the bitmap,
 518         * and doesn't insert a new extent entry to represent this region.
 519         */
 520        ret = btrfs_add_free_space(cache, SZ_128M, SZ_512K);
 521        if (ret) {
 522                test_msg("Error adding free space: %d\n", ret);
 523                return ret;
 524        }
 525        /* Confirm the region is marked as free. */
 526        if (!test_check_exists(cache, SZ_128M, SZ_512K)) {
 527                test_msg("Bitmap region not marked as free\n");
 528                return -ENOENT;
 529        }
 530
 531        /*
 532         * Confirm that no new extent entries or bitmap entries were added to
 533         * the cache after adding that free space region.
 534         */
 535        ret = check_num_extents_and_bitmaps(cache, 2, 1);
 536        if (ret)
 537                return ret;
 538
 539        /*
 540         * Now lets add a small free space region to the right of the previous
 541         * one, which is not contiguous with it and is part of the bitmap too.
 542         * The goal is to test that the bitmap entry space stealing doesn't
 543         * steal this space region.
 544         */
 545        ret = btrfs_add_free_space(cache, SZ_128M + SZ_16M, sectorsize);
 546        if (ret) {
 547                test_msg("Error adding free space: %d\n", ret);
 548                return ret;
 549        }
 550
 551        /*
 552         * Confirm that no new extent entries or bitmap entries were added to
 553         * the cache after adding that free space region.
 554         */
 555        ret = check_num_extents_and_bitmaps(cache, 2, 1);
 556        if (ret)
 557                return ret;
 558
 559        /*
 560         * Now mark the region [128Mb - 128Kb, 128Mb[ as free too. This will
 561         * expand the range covered by the existing extent entry that represents
 562         * the free space [128Mb - 256Kb, 128Mb - 128Kb[.
 563         */
 564        ret = btrfs_add_free_space(cache, SZ_128M - SZ_128K, SZ_128K);
 565        if (ret) {
 566                test_msg("Error adding free space: %d\n", ret);
 567                return ret;
 568        }
 569        /* Confirm the region is marked as free. */
 570        if (!test_check_exists(cache, SZ_128M - SZ_128K, SZ_128K)) {
 571                test_msg("Extent region not marked as free\n");
 572                return -ENOENT;
 573        }
 574
 575        /*
 576         * Confirm that our extent entry didn't stole all free space from the
 577         * bitmap, because of the small 4Kb free space region.
 578         */
 579        ret = check_num_extents_and_bitmaps(cache, 2, 1);
 580        if (ret)
 581                return ret;
 582
 583        /*
 584         * So now we have the range [128Mb - 256Kb, 128Mb + 768Kb[ as free
 585         * space. Without stealing bitmap free space into extent entry space,
 586         * we would have all this free space represented by 2 entries in the
 587         * cache:
 588         *
 589         * extent entry covering range: [128Mb - 256Kb, 128Mb[
 590         * bitmap entry covering range: [128Mb, 128Mb + 768Kb[
 591         *
 592         * Attempting to allocate the whole free space (1Mb) would fail, because
 593         * we can't allocate from multiple entries.
 594         * With the bitmap free space stealing, we get a single extent entry
 595         * that represents the 1Mb free space, and therefore we're able to
 596         * allocate the whole free space at once.
 597         */
 598        if (!test_check_exists(cache, SZ_128M - SZ_256K, SZ_1M)) {
 599                test_msg("Expected region not marked as free\n");
 600                return -ENOENT;
 601        }
 602
 603        if (cache->free_space_ctl->free_space != (SZ_1M + sectorsize)) {
 604                test_msg("Cache free space is not 1Mb + %u\n", sectorsize);
 605                return -EINVAL;
 606        }
 607
 608        offset = btrfs_find_space_for_alloc(cache,
 609                                            0, SZ_1M, 0,
 610                                            &max_extent_size);
 611        if (offset != (SZ_128M - SZ_256K)) {
 612                test_msg("Failed to allocate 1Mb from space cache, returned offset is: %llu\n",
 613                         offset);
 614                return -EINVAL;
 615        }
 616
 617        /*
 618         * All that remains is a sectorsize free space region in a bitmap.
 619         * Confirm.
 620         */
 621        ret = check_num_extents_and_bitmaps(cache, 1, 1);
 622        if (ret)
 623                return ret;
 624
 625        if (cache->free_space_ctl->free_space != sectorsize) {
 626                test_msg("Cache free space is not %u\n", sectorsize);
 627                return -EINVAL;
 628        }
 629
 630        offset = btrfs_find_space_for_alloc(cache,
 631                                            0, sectorsize, 0,
 632                                            &max_extent_size);
 633        if (offset != (SZ_128M + SZ_16M)) {
 634                test_msg("Failed to allocate %u, returned offset : %llu\n",
 635                         sectorsize, offset);
 636                return -EINVAL;
 637        }
 638
 639        ret = check_cache_empty(cache);
 640        if (ret)
 641                return ret;
 642
 643        __btrfs_remove_free_space_cache(cache->free_space_ctl);
 644
 645        /*
 646         * Now test a similar scenario, but where our extent entry is located
 647         * to the right of the bitmap entry, so that we can check that stealing
 648         * space from a bitmap to the front of an extent entry works.
 649         */
 650
 651        /*
 652         * Extent entry covering free space range [128Mb + 128Kb, 128Mb + 256Kb[
 653         */
 654        ret = test_add_free_space_entry(cache, SZ_128M + SZ_128K, SZ_128K, 0);
 655        if (ret) {
 656                test_msg("Couldn't add extent entry %d\n", ret);
 657                return ret;
 658        }
 659
 660        /* Bitmap entry covering free space range [0, 128Mb - 512Kb[ */
 661        ret = test_add_free_space_entry(cache, 0, SZ_128M - SZ_512K, 1);
 662        if (ret) {
 663                test_msg("Couldn't add bitmap entry %d\n", ret);
 664                return ret;
 665        }
 666
 667        ret = check_num_extents_and_bitmaps(cache, 2, 1);
 668        if (ret)
 669                return ret;
 670
 671        /*
 672         * Now make only the last 256Kb of the bitmap marked as free, so that
 673         * we end up with only the following ranges marked as free space:
 674         *
 675         * [128Mb + 128b, 128Mb + 256Kb[
 676         * [128Mb - 768Kb, 128Mb - 512Kb[
 677         */
 678        ret = btrfs_remove_free_space(cache, 0, SZ_128M - 768 * SZ_1K);
 679        if (ret) {
 680                test_msg("Failed to free part of bitmap space %d\n", ret);
 681                return ret;
 682        }
 683
 684        /* Confirm that only those 2 ranges are marked as free. */
 685        if (!test_check_exists(cache, SZ_128M + SZ_128K, SZ_128K)) {
 686                test_msg("Free space range missing\n");
 687                return -ENOENT;
 688        }
 689        if (!test_check_exists(cache, SZ_128M - 768 * SZ_1K, SZ_256K)) {
 690                test_msg("Free space range missing\n");
 691                return -ENOENT;
 692        }
 693
 694        /*
 695         * Confirm that the bitmap range [0, 128Mb - 768Kb[ isn't marked
 696         * as free anymore.
 697         */
 698        if (test_check_exists(cache, 0, SZ_128M - 768 * SZ_1K)) {
 699                test_msg("Bitmap region not removed from space cache\n");
 700                return -EINVAL;
 701        }
 702
 703        /*
 704         * Confirm that the region [128Mb - 512Kb, 128Mb[, which is
 705         * covered by the bitmap, isn't marked as free.
 706         */
 707        if (test_check_exists(cache, SZ_128M - SZ_512K, SZ_512K)) {
 708                test_msg("Invalid bitmap region marked as free\n");
 709                return -EINVAL;
 710        }
 711
 712        /*
 713         * Now lets mark the region [128Mb - 512Kb, 128Mb[ as free too. But,
 714         * lets make sure the free space cache marks it as free in the bitmap,
 715         * and doesn't insert a new extent entry to represent this region.
 716         */
 717        ret = btrfs_add_free_space(cache, SZ_128M - SZ_512K, SZ_512K);
 718        if (ret) {
 719                test_msg("Error adding free space: %d\n", ret);
 720                return ret;
 721        }
 722        /* Confirm the region is marked as free. */
 723        if (!test_check_exists(cache, SZ_128M - SZ_512K, SZ_512K)) {
 724                test_msg("Bitmap region not marked as free\n");
 725                return -ENOENT;
 726        }
 727
 728        /*
 729         * Confirm that no new extent entries or bitmap entries were added to
 730         * the cache after adding that free space region.
 731         */
 732        ret = check_num_extents_and_bitmaps(cache, 2, 1);
 733        if (ret)
 734                return ret;
 735
 736        /*
 737         * Now lets add a small free space region to the left of the previous
 738         * one, which is not contiguous with it and is part of the bitmap too.
 739         * The goal is to test that the bitmap entry space stealing doesn't
 740         * steal this space region.
 741         */
 742        ret = btrfs_add_free_space(cache, SZ_32M, 2 * sectorsize);
 743        if (ret) {
 744                test_msg("Error adding free space: %d\n", ret);
 745                return ret;
 746        }
 747
 748        /*
 749         * Now mark the region [128Mb, 128Mb + 128Kb[ as free too. This will
 750         * expand the range covered by the existing extent entry that represents
 751         * the free space [128Mb + 128Kb, 128Mb + 256Kb[.
 752         */
 753        ret = btrfs_add_free_space(cache, SZ_128M, SZ_128K);
 754        if (ret) {
 755                test_msg("Error adding free space: %d\n", ret);
 756                return ret;
 757        }
 758        /* Confirm the region is marked as free. */
 759        if (!test_check_exists(cache, SZ_128M, SZ_128K)) {
 760                test_msg("Extent region not marked as free\n");
 761                return -ENOENT;
 762        }
 763
 764        /*
 765         * Confirm that our extent entry didn't stole all free space from the
 766         * bitmap, because of the small 2 * sectorsize free space region.
 767         */
 768        ret = check_num_extents_and_bitmaps(cache, 2, 1);
 769        if (ret)
 770                return ret;
 771
 772        /*
 773         * So now we have the range [128Mb - 768Kb, 128Mb + 256Kb[ as free
 774         * space. Without stealing bitmap free space into extent entry space,
 775         * we would have all this free space represented by 2 entries in the
 776         * cache:
 777         *
 778         * extent entry covering range: [128Mb, 128Mb + 256Kb[
 779         * bitmap entry covering range: [128Mb - 768Kb, 128Mb[
 780         *
 781         * Attempting to allocate the whole free space (1Mb) would fail, because
 782         * we can't allocate from multiple entries.
 783         * With the bitmap free space stealing, we get a single extent entry
 784         * that represents the 1Mb free space, and therefore we're able to
 785         * allocate the whole free space at once.
 786         */
 787        if (!test_check_exists(cache, SZ_128M - 768 * SZ_1K, SZ_1M)) {
 788                test_msg("Expected region not marked as free\n");
 789                return -ENOENT;
 790        }
 791
 792        if (cache->free_space_ctl->free_space != (SZ_1M + 2 * sectorsize)) {
 793                test_msg("Cache free space is not 1Mb + %u\n", 2 * sectorsize);
 794                return -EINVAL;
 795        }
 796
 797        offset = btrfs_find_space_for_alloc(cache, 0, SZ_1M, 0,
 798                                            &max_extent_size);
 799        if (offset != (SZ_128M - 768 * SZ_1K)) {
 800                test_msg("Failed to allocate 1Mb from space cache, returned offset is: %llu\n",
 801                         offset);
 802                return -EINVAL;
 803        }
 804
 805        /*
 806         * All that remains is 2 * sectorsize free space region
 807         * in a bitmap. Confirm.
 808         */
 809        ret = check_num_extents_and_bitmaps(cache, 1, 1);
 810        if (ret)
 811                return ret;
 812
 813        if (cache->free_space_ctl->free_space != 2 * sectorsize) {
 814                test_msg("Cache free space is not %u\n", 2 * sectorsize);
 815                return -EINVAL;
 816        }
 817
 818        offset = btrfs_find_space_for_alloc(cache,
 819                                            0, 2 * sectorsize, 0,
 820                                            &max_extent_size);
 821        if (offset != SZ_32M) {
 822                test_msg("Failed to allocate %u, offset: %llu\n",
 823                         2 * sectorsize,
 824                         offset);
 825                return -EINVAL;
 826        }
 827
 828        ret = check_cache_empty(cache);
 829        if (ret)
 830                return ret;
 831
 832        cache->free_space_ctl->op = orig_free_space_ops;
 833        __btrfs_remove_free_space_cache(cache->free_space_ctl);
 834
 835        return 0;
 836}
 837
 838int btrfs_test_free_space_cache(u32 sectorsize, u32 nodesize)
 839{
 840        struct btrfs_fs_info *fs_info;
 841        struct btrfs_block_group_cache *cache;
 842        struct btrfs_root *root = NULL;
 843        int ret = -ENOMEM;
 844
 845        test_msg("Running btrfs free space cache tests\n");
 846        fs_info = btrfs_alloc_dummy_fs_info(nodesize, sectorsize);
 847        if (!fs_info)
 848                return -ENOMEM;
 849
 850
 851        /*
 852         * For ppc64 (with 64k page size), bytes per bitmap might be
 853         * larger than 1G.  To make bitmap test available in ppc64,
 854         * alloc dummy block group whose size cross bitmaps.
 855         */
 856        cache = btrfs_alloc_dummy_block_group(fs_info,
 857                                      BITS_PER_BITMAP * sectorsize + PAGE_SIZE);
 858        if (!cache) {
 859                test_msg("Couldn't run the tests\n");
 860                btrfs_free_dummy_fs_info(fs_info);
 861                return 0;
 862        }
 863
 864        root = btrfs_alloc_dummy_root(fs_info);
 865        if (IS_ERR(root)) {
 866                ret = PTR_ERR(root);
 867                goto out;
 868        }
 869
 870        root->fs_info->extent_root = root;
 871
 872        ret = test_extents(cache);
 873        if (ret)
 874                goto out;
 875        ret = test_bitmaps(cache, sectorsize);
 876        if (ret)
 877                goto out;
 878        ret = test_bitmaps_and_extents(cache, sectorsize);
 879        if (ret)
 880                goto out;
 881
 882        ret = test_steal_space_from_bitmap_to_extent(cache, sectorsize);
 883out:
 884        btrfs_free_dummy_block_group(cache);
 885        btrfs_free_dummy_root(root);
 886        btrfs_free_dummy_fs_info(fs_info);
 887        test_msg("Free space cache tests finished\n");
 888        return ret;
 889}
 890