linux/fs/btrfs/free-space-tree.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0
   2/*
   3 * Copyright (C) 2015 Facebook.  All rights reserved.
   4 */
   5
   6#include <linux/kernel.h>
   7#include <linux/sched/mm.h>
   8#include "ctree.h"
   9#include "disk-io.h"
  10#include "locking.h"
  11#include "free-space-tree.h"
  12#include "transaction.h"
  13
  14static int __add_block_group_free_space(struct btrfs_trans_handle *trans,
  15                                        struct btrfs_block_group_cache *block_group,
  16                                        struct btrfs_path *path);
  17
  18void set_free_space_tree_thresholds(struct btrfs_block_group_cache *cache)
  19{
  20        u32 bitmap_range;
  21        size_t bitmap_size;
  22        u64 num_bitmaps, total_bitmap_size;
  23
  24        /*
  25         * We convert to bitmaps when the disk space required for using extents
  26         * exceeds that required for using bitmaps.
  27         */
  28        bitmap_range = cache->fs_info->sectorsize * BTRFS_FREE_SPACE_BITMAP_BITS;
  29        num_bitmaps = div_u64(cache->key.offset + bitmap_range - 1,
  30                              bitmap_range);
  31        bitmap_size = sizeof(struct btrfs_item) + BTRFS_FREE_SPACE_BITMAP_SIZE;
  32        total_bitmap_size = num_bitmaps * bitmap_size;
  33        cache->bitmap_high_thresh = div_u64(total_bitmap_size,
  34                                            sizeof(struct btrfs_item));
  35
  36        /*
  37         * We allow for a small buffer between the high threshold and low
  38         * threshold to avoid thrashing back and forth between the two formats.
  39         */
  40        if (cache->bitmap_high_thresh > 100)
  41                cache->bitmap_low_thresh = cache->bitmap_high_thresh - 100;
  42        else
  43                cache->bitmap_low_thresh = 0;
  44}
  45
  46static int add_new_free_space_info(struct btrfs_trans_handle *trans,
  47                                   struct btrfs_block_group_cache *block_group,
  48                                   struct btrfs_path *path)
  49{
  50        struct btrfs_root *root = trans->fs_info->free_space_root;
  51        struct btrfs_free_space_info *info;
  52        struct btrfs_key key;
  53        struct extent_buffer *leaf;
  54        int ret;
  55
  56        key.objectid = block_group->key.objectid;
  57        key.type = BTRFS_FREE_SPACE_INFO_KEY;
  58        key.offset = block_group->key.offset;
  59
  60        ret = btrfs_insert_empty_item(trans, root, path, &key, sizeof(*info));
  61        if (ret)
  62                goto out;
  63
  64        leaf = path->nodes[0];
  65        info = btrfs_item_ptr(leaf, path->slots[0],
  66                              struct btrfs_free_space_info);
  67        btrfs_set_free_space_extent_count(leaf, info, 0);
  68        btrfs_set_free_space_flags(leaf, info, 0);
  69        btrfs_mark_buffer_dirty(leaf);
  70
  71        ret = 0;
  72out:
  73        btrfs_release_path(path);
  74        return ret;
  75}
  76
  77struct btrfs_free_space_info *
  78search_free_space_info(struct btrfs_trans_handle *trans,
  79                       struct btrfs_fs_info *fs_info,
  80                       struct btrfs_block_group_cache *block_group,
  81                       struct btrfs_path *path, int cow)
  82{
  83        struct btrfs_root *root = fs_info->free_space_root;
  84        struct btrfs_key key;
  85        int ret;
  86
  87        key.objectid = block_group->key.objectid;
  88        key.type = BTRFS_FREE_SPACE_INFO_KEY;
  89        key.offset = block_group->key.offset;
  90
  91        ret = btrfs_search_slot(trans, root, &key, path, 0, cow);
  92        if (ret < 0)
  93                return ERR_PTR(ret);
  94        if (ret != 0) {
  95                btrfs_warn(fs_info, "missing free space info for %llu",
  96                           block_group->key.objectid);
  97                ASSERT(0);
  98                return ERR_PTR(-ENOENT);
  99        }
 100
 101        return btrfs_item_ptr(path->nodes[0], path->slots[0],
 102                              struct btrfs_free_space_info);
 103}
 104
 105/*
 106 * btrfs_search_slot() but we're looking for the greatest key less than the
 107 * passed key.
 108 */
 109static int btrfs_search_prev_slot(struct btrfs_trans_handle *trans,
 110                                  struct btrfs_root *root,
 111                                  struct btrfs_key *key, struct btrfs_path *p,
 112                                  int ins_len, int cow)
 113{
 114        int ret;
 115
 116        ret = btrfs_search_slot(trans, root, key, p, ins_len, cow);
 117        if (ret < 0)
 118                return ret;
 119
 120        if (ret == 0) {
 121                ASSERT(0);
 122                return -EIO;
 123        }
 124
 125        if (p->slots[0] == 0) {
 126                ASSERT(0);
 127                return -EIO;
 128        }
 129        p->slots[0]--;
 130
 131        return 0;
 132}
 133
 134static inline u32 free_space_bitmap_size(u64 size, u32 sectorsize)
 135{
 136        return DIV_ROUND_UP((u32)div_u64(size, sectorsize), BITS_PER_BYTE);
 137}
 138
 139static unsigned long *alloc_bitmap(u32 bitmap_size)
 140{
 141        unsigned long *ret;
 142        unsigned int nofs_flag;
 143        u32 bitmap_rounded_size = round_up(bitmap_size, sizeof(unsigned long));
 144
 145        /*
 146         * GFP_NOFS doesn't work with kvmalloc(), but we really can't recurse
 147         * into the filesystem as the free space bitmap can be modified in the
 148         * critical section of a transaction commit.
 149         *
 150         * TODO: push the memalloc_nofs_{save,restore}() to the caller where we
 151         * know that recursion is unsafe.
 152         */
 153        nofs_flag = memalloc_nofs_save();
 154        ret = kvzalloc(bitmap_rounded_size, GFP_KERNEL);
 155        memalloc_nofs_restore(nofs_flag);
 156        return ret;
 157}
 158
 159static void le_bitmap_set(unsigned long *map, unsigned int start, int len)
 160{
 161        u8 *p = ((u8 *)map) + BIT_BYTE(start);
 162        const unsigned int size = start + len;
 163        int bits_to_set = BITS_PER_BYTE - (start % BITS_PER_BYTE);
 164        u8 mask_to_set = BITMAP_FIRST_BYTE_MASK(start);
 165
 166        while (len - bits_to_set >= 0) {
 167                *p |= mask_to_set;
 168                len -= bits_to_set;
 169                bits_to_set = BITS_PER_BYTE;
 170                mask_to_set = ~0;
 171                p++;
 172        }
 173        if (len) {
 174                mask_to_set &= BITMAP_LAST_BYTE_MASK(size);
 175                *p |= mask_to_set;
 176        }
 177}
 178
 179int convert_free_space_to_bitmaps(struct btrfs_trans_handle *trans,
 180                                  struct btrfs_block_group_cache *block_group,
 181                                  struct btrfs_path *path)
 182{
 183        struct btrfs_fs_info *fs_info = trans->fs_info;
 184        struct btrfs_root *root = fs_info->free_space_root;
 185        struct btrfs_free_space_info *info;
 186        struct btrfs_key key, found_key;
 187        struct extent_buffer *leaf;
 188        unsigned long *bitmap;
 189        char *bitmap_cursor;
 190        u64 start, end;
 191        u64 bitmap_range, i;
 192        u32 bitmap_size, flags, expected_extent_count;
 193        u32 extent_count = 0;
 194        int done = 0, nr;
 195        int ret;
 196
 197        bitmap_size = free_space_bitmap_size(block_group->key.offset,
 198                                             fs_info->sectorsize);
 199        bitmap = alloc_bitmap(bitmap_size);
 200        if (!bitmap) {
 201                ret = -ENOMEM;
 202                goto out;
 203        }
 204
 205        start = block_group->key.objectid;
 206        end = block_group->key.objectid + block_group->key.offset;
 207
 208        key.objectid = end - 1;
 209        key.type = (u8)-1;
 210        key.offset = (u64)-1;
 211
 212        while (!done) {
 213                ret = btrfs_search_prev_slot(trans, root, &key, path, -1, 1);
 214                if (ret)
 215                        goto out;
 216
 217                leaf = path->nodes[0];
 218                nr = 0;
 219                path->slots[0]++;
 220                while (path->slots[0] > 0) {
 221                        btrfs_item_key_to_cpu(leaf, &found_key, path->slots[0] - 1);
 222
 223                        if (found_key.type == BTRFS_FREE_SPACE_INFO_KEY) {
 224                                ASSERT(found_key.objectid == block_group->key.objectid);
 225                                ASSERT(found_key.offset == block_group->key.offset);
 226                                done = 1;
 227                                break;
 228                        } else if (found_key.type == BTRFS_FREE_SPACE_EXTENT_KEY) {
 229                                u64 first, last;
 230
 231                                ASSERT(found_key.objectid >= start);
 232                                ASSERT(found_key.objectid < end);
 233                                ASSERT(found_key.objectid + found_key.offset <= end);
 234
 235                                first = div_u64(found_key.objectid - start,
 236                                                fs_info->sectorsize);
 237                                last = div_u64(found_key.objectid + found_key.offset - start,
 238                                               fs_info->sectorsize);
 239                                le_bitmap_set(bitmap, first, last - first);
 240
 241                                extent_count++;
 242                                nr++;
 243                                path->slots[0]--;
 244                        } else {
 245                                ASSERT(0);
 246                        }
 247                }
 248
 249                ret = btrfs_del_items(trans, root, path, path->slots[0], nr);
 250                if (ret)
 251                        goto out;
 252                btrfs_release_path(path);
 253        }
 254
 255        info = search_free_space_info(trans, fs_info, block_group, path, 1);
 256        if (IS_ERR(info)) {
 257                ret = PTR_ERR(info);
 258                goto out;
 259        }
 260        leaf = path->nodes[0];
 261        flags = btrfs_free_space_flags(leaf, info);
 262        flags |= BTRFS_FREE_SPACE_USING_BITMAPS;
 263        btrfs_set_free_space_flags(leaf, info, flags);
 264        expected_extent_count = btrfs_free_space_extent_count(leaf, info);
 265        btrfs_mark_buffer_dirty(leaf);
 266        btrfs_release_path(path);
 267
 268        if (extent_count != expected_extent_count) {
 269                btrfs_err(fs_info,
 270                          "incorrect extent count for %llu; counted %u, expected %u",
 271                          block_group->key.objectid, extent_count,
 272                          expected_extent_count);
 273                ASSERT(0);
 274                ret = -EIO;
 275                goto out;
 276        }
 277
 278        bitmap_cursor = (char *)bitmap;
 279        bitmap_range = fs_info->sectorsize * BTRFS_FREE_SPACE_BITMAP_BITS;
 280        i = start;
 281        while (i < end) {
 282                unsigned long ptr;
 283                u64 extent_size;
 284                u32 data_size;
 285
 286                extent_size = min(end - i, bitmap_range);
 287                data_size = free_space_bitmap_size(extent_size,
 288                                                   fs_info->sectorsize);
 289
 290                key.objectid = i;
 291                key.type = BTRFS_FREE_SPACE_BITMAP_KEY;
 292                key.offset = extent_size;
 293
 294                ret = btrfs_insert_empty_item(trans, root, path, &key,
 295                                              data_size);
 296                if (ret)
 297                        goto out;
 298
 299                leaf = path->nodes[0];
 300                ptr = btrfs_item_ptr_offset(leaf, path->slots[0]);
 301                write_extent_buffer(leaf, bitmap_cursor, ptr,
 302                                    data_size);
 303                btrfs_mark_buffer_dirty(leaf);
 304                btrfs_release_path(path);
 305
 306                i += extent_size;
 307                bitmap_cursor += data_size;
 308        }
 309
 310        ret = 0;
 311out:
 312        kvfree(bitmap);
 313        if (ret)
 314                btrfs_abort_transaction(trans, ret);
 315        return ret;
 316}
 317
 318int convert_free_space_to_extents(struct btrfs_trans_handle *trans,
 319                                  struct btrfs_block_group_cache *block_group,
 320                                  struct btrfs_path *path)
 321{
 322        struct btrfs_fs_info *fs_info = trans->fs_info;
 323        struct btrfs_root *root = fs_info->free_space_root;
 324        struct btrfs_free_space_info *info;
 325        struct btrfs_key key, found_key;
 326        struct extent_buffer *leaf;
 327        unsigned long *bitmap;
 328        u64 start, end;
 329        u32 bitmap_size, flags, expected_extent_count;
 330        unsigned long nrbits, start_bit, end_bit;
 331        u32 extent_count = 0;
 332        int done = 0, nr;
 333        int ret;
 334
 335        bitmap_size = free_space_bitmap_size(block_group->key.offset,
 336                                             fs_info->sectorsize);
 337        bitmap = alloc_bitmap(bitmap_size);
 338        if (!bitmap) {
 339                ret = -ENOMEM;
 340                goto out;
 341        }
 342
 343        start = block_group->key.objectid;
 344        end = block_group->key.objectid + block_group->key.offset;
 345
 346        key.objectid = end - 1;
 347        key.type = (u8)-1;
 348        key.offset = (u64)-1;
 349
 350        while (!done) {
 351                ret = btrfs_search_prev_slot(trans, root, &key, path, -1, 1);
 352                if (ret)
 353                        goto out;
 354
 355                leaf = path->nodes[0];
 356                nr = 0;
 357                path->slots[0]++;
 358                while (path->slots[0] > 0) {
 359                        btrfs_item_key_to_cpu(leaf, &found_key, path->slots[0] - 1);
 360
 361                        if (found_key.type == BTRFS_FREE_SPACE_INFO_KEY) {
 362                                ASSERT(found_key.objectid == block_group->key.objectid);
 363                                ASSERT(found_key.offset == block_group->key.offset);
 364                                done = 1;
 365                                break;
 366                        } else if (found_key.type == BTRFS_FREE_SPACE_BITMAP_KEY) {
 367                                unsigned long ptr;
 368                                char *bitmap_cursor;
 369                                u32 bitmap_pos, data_size;
 370
 371                                ASSERT(found_key.objectid >= start);
 372                                ASSERT(found_key.objectid < end);
 373                                ASSERT(found_key.objectid + found_key.offset <= end);
 374
 375                                bitmap_pos = div_u64(found_key.objectid - start,
 376                                                     fs_info->sectorsize *
 377                                                     BITS_PER_BYTE);
 378                                bitmap_cursor = ((char *)bitmap) + bitmap_pos;
 379                                data_size = free_space_bitmap_size(found_key.offset,
 380                                                                   fs_info->sectorsize);
 381
 382                                ptr = btrfs_item_ptr_offset(leaf, path->slots[0] - 1);
 383                                read_extent_buffer(leaf, bitmap_cursor, ptr,
 384                                                   data_size);
 385
 386                                nr++;
 387                                path->slots[0]--;
 388                        } else {
 389                                ASSERT(0);
 390                        }
 391                }
 392
 393                ret = btrfs_del_items(trans, root, path, path->slots[0], nr);
 394                if (ret)
 395                        goto out;
 396                btrfs_release_path(path);
 397        }
 398
 399        info = search_free_space_info(trans, fs_info, block_group, path, 1);
 400        if (IS_ERR(info)) {
 401                ret = PTR_ERR(info);
 402                goto out;
 403        }
 404        leaf = path->nodes[0];
 405        flags = btrfs_free_space_flags(leaf, info);
 406        flags &= ~BTRFS_FREE_SPACE_USING_BITMAPS;
 407        btrfs_set_free_space_flags(leaf, info, flags);
 408        expected_extent_count = btrfs_free_space_extent_count(leaf, info);
 409        btrfs_mark_buffer_dirty(leaf);
 410        btrfs_release_path(path);
 411
 412        nrbits = div_u64(block_group->key.offset, block_group->fs_info->sectorsize);
 413        start_bit = find_next_bit_le(bitmap, nrbits, 0);
 414
 415        while (start_bit < nrbits) {
 416                end_bit = find_next_zero_bit_le(bitmap, nrbits, start_bit);
 417                ASSERT(start_bit < end_bit);
 418
 419                key.objectid = start + start_bit * block_group->fs_info->sectorsize;
 420                key.type = BTRFS_FREE_SPACE_EXTENT_KEY;
 421                key.offset = (end_bit - start_bit) * block_group->fs_info->sectorsize;
 422
 423                ret = btrfs_insert_empty_item(trans, root, path, &key, 0);
 424                if (ret)
 425                        goto out;
 426                btrfs_release_path(path);
 427
 428                extent_count++;
 429
 430                start_bit = find_next_bit_le(bitmap, nrbits, end_bit);
 431        }
 432
 433        if (extent_count != expected_extent_count) {
 434                btrfs_err(fs_info,
 435                          "incorrect extent count for %llu; counted %u, expected %u",
 436                          block_group->key.objectid, extent_count,
 437                          expected_extent_count);
 438                ASSERT(0);
 439                ret = -EIO;
 440                goto out;
 441        }
 442
 443        ret = 0;
 444out:
 445        kvfree(bitmap);
 446        if (ret)
 447                btrfs_abort_transaction(trans, ret);
 448        return ret;
 449}
 450
 451static int update_free_space_extent_count(struct btrfs_trans_handle *trans,
 452                                          struct btrfs_block_group_cache *block_group,
 453                                          struct btrfs_path *path,
 454                                          int new_extents)
 455{
 456        struct btrfs_free_space_info *info;
 457        u32 flags;
 458        u32 extent_count;
 459        int ret = 0;
 460
 461        if (new_extents == 0)
 462                return 0;
 463
 464        info = search_free_space_info(trans, trans->fs_info, block_group, path,
 465                                      1);
 466        if (IS_ERR(info)) {
 467                ret = PTR_ERR(info);
 468                goto out;
 469        }
 470        flags = btrfs_free_space_flags(path->nodes[0], info);
 471        extent_count = btrfs_free_space_extent_count(path->nodes[0], info);
 472
 473        extent_count += new_extents;
 474        btrfs_set_free_space_extent_count(path->nodes[0], info, extent_count);
 475        btrfs_mark_buffer_dirty(path->nodes[0]);
 476        btrfs_release_path(path);
 477
 478        if (!(flags & BTRFS_FREE_SPACE_USING_BITMAPS) &&
 479            extent_count > block_group->bitmap_high_thresh) {
 480                ret = convert_free_space_to_bitmaps(trans, block_group, path);
 481        } else if ((flags & BTRFS_FREE_SPACE_USING_BITMAPS) &&
 482                   extent_count < block_group->bitmap_low_thresh) {
 483                ret = convert_free_space_to_extents(trans, block_group, path);
 484        }
 485
 486out:
 487        return ret;
 488}
 489
 490int free_space_test_bit(struct btrfs_block_group_cache *block_group,
 491                        struct btrfs_path *path, u64 offset)
 492{
 493        struct extent_buffer *leaf;
 494        struct btrfs_key key;
 495        u64 found_start, found_end;
 496        unsigned long ptr, i;
 497
 498        leaf = path->nodes[0];
 499        btrfs_item_key_to_cpu(leaf, &key, path->slots[0]);
 500        ASSERT(key.type == BTRFS_FREE_SPACE_BITMAP_KEY);
 501
 502        found_start = key.objectid;
 503        found_end = key.objectid + key.offset;
 504        ASSERT(offset >= found_start && offset < found_end);
 505
 506        ptr = btrfs_item_ptr_offset(leaf, path->slots[0]);
 507        i = div_u64(offset - found_start,
 508                    block_group->fs_info->sectorsize);
 509        return !!extent_buffer_test_bit(leaf, ptr, i);
 510}
 511
 512static void free_space_set_bits(struct btrfs_block_group_cache *block_group,
 513                                struct btrfs_path *path, u64 *start, u64 *size,
 514                                int bit)
 515{
 516        struct btrfs_fs_info *fs_info = block_group->fs_info;
 517        struct extent_buffer *leaf;
 518        struct btrfs_key key;
 519        u64 end = *start + *size;
 520        u64 found_start, found_end;
 521        unsigned long ptr, first, last;
 522
 523        leaf = path->nodes[0];
 524        btrfs_item_key_to_cpu(leaf, &key, path->slots[0]);
 525        ASSERT(key.type == BTRFS_FREE_SPACE_BITMAP_KEY);
 526
 527        found_start = key.objectid;
 528        found_end = key.objectid + key.offset;
 529        ASSERT(*start >= found_start && *start < found_end);
 530        ASSERT(end > found_start);
 531
 532        if (end > found_end)
 533                end = found_end;
 534
 535        ptr = btrfs_item_ptr_offset(leaf, path->slots[0]);
 536        first = div_u64(*start - found_start, fs_info->sectorsize);
 537        last = div_u64(end - found_start, fs_info->sectorsize);
 538        if (bit)
 539                extent_buffer_bitmap_set(leaf, ptr, first, last - first);
 540        else
 541                extent_buffer_bitmap_clear(leaf, ptr, first, last - first);
 542        btrfs_mark_buffer_dirty(leaf);
 543
 544        *size -= end - *start;
 545        *start = end;
 546}
 547
 548/*
 549 * We can't use btrfs_next_item() in modify_free_space_bitmap() because
 550 * btrfs_next_leaf() doesn't get the path for writing. We can forgo the fancy
 551 * tree walking in btrfs_next_leaf() anyways because we know exactly what we're
 552 * looking for.
 553 */
 554static int free_space_next_bitmap(struct btrfs_trans_handle *trans,
 555                                  struct btrfs_root *root, struct btrfs_path *p)
 556{
 557        struct btrfs_key key;
 558
 559        if (p->slots[0] + 1 < btrfs_header_nritems(p->nodes[0])) {
 560                p->slots[0]++;
 561                return 0;
 562        }
 563
 564        btrfs_item_key_to_cpu(p->nodes[0], &key, p->slots[0]);
 565        btrfs_release_path(p);
 566
 567        key.objectid += key.offset;
 568        key.type = (u8)-1;
 569        key.offset = (u64)-1;
 570
 571        return btrfs_search_prev_slot(trans, root, &key, p, 0, 1);
 572}
 573
 574/*
 575 * If remove is 1, then we are removing free space, thus clearing bits in the
 576 * bitmap. If remove is 0, then we are adding free space, thus setting bits in
 577 * the bitmap.
 578 */
 579static int modify_free_space_bitmap(struct btrfs_trans_handle *trans,
 580                                    struct btrfs_block_group_cache *block_group,
 581                                    struct btrfs_path *path,
 582                                    u64 start, u64 size, int remove)
 583{
 584        struct btrfs_root *root = block_group->fs_info->free_space_root;
 585        struct btrfs_key key;
 586        u64 end = start + size;
 587        u64 cur_start, cur_size;
 588        int prev_bit, next_bit;
 589        int new_extents;
 590        int ret;
 591
 592        /*
 593         * Read the bit for the block immediately before the extent of space if
 594         * that block is within the block group.
 595         */
 596        if (start > block_group->key.objectid) {
 597                u64 prev_block = start - block_group->fs_info->sectorsize;
 598
 599                key.objectid = prev_block;
 600                key.type = (u8)-1;
 601                key.offset = (u64)-1;
 602
 603                ret = btrfs_search_prev_slot(trans, root, &key, path, 0, 1);
 604                if (ret)
 605                        goto out;
 606
 607                prev_bit = free_space_test_bit(block_group, path, prev_block);
 608
 609                /* The previous block may have been in the previous bitmap. */
 610                btrfs_item_key_to_cpu(path->nodes[0], &key, path->slots[0]);
 611                if (start >= key.objectid + key.offset) {
 612                        ret = free_space_next_bitmap(trans, root, path);
 613                        if (ret)
 614                                goto out;
 615                }
 616        } else {
 617                key.objectid = start;
 618                key.type = (u8)-1;
 619                key.offset = (u64)-1;
 620
 621                ret = btrfs_search_prev_slot(trans, root, &key, path, 0, 1);
 622                if (ret)
 623                        goto out;
 624
 625                prev_bit = -1;
 626        }
 627
 628        /*
 629         * Iterate over all of the bitmaps overlapped by the extent of space,
 630         * clearing/setting bits as required.
 631         */
 632        cur_start = start;
 633        cur_size = size;
 634        while (1) {
 635                free_space_set_bits(block_group, path, &cur_start, &cur_size,
 636                                    !remove);
 637                if (cur_size == 0)
 638                        break;
 639                ret = free_space_next_bitmap(trans, root, path);
 640                if (ret)
 641                        goto out;
 642        }
 643
 644        /*
 645         * Read the bit for the block immediately after the extent of space if
 646         * that block is within the block group.
 647         */
 648        if (end < block_group->key.objectid + block_group->key.offset) {
 649                /* The next block may be in the next bitmap. */
 650                btrfs_item_key_to_cpu(path->nodes[0], &key, path->slots[0]);
 651                if (end >= key.objectid + key.offset) {
 652                        ret = free_space_next_bitmap(trans, root, path);
 653                        if (ret)
 654                                goto out;
 655                }
 656
 657                next_bit = free_space_test_bit(block_group, path, end);
 658        } else {
 659                next_bit = -1;
 660        }
 661
 662        if (remove) {
 663                new_extents = -1;
 664                if (prev_bit == 1) {
 665                        /* Leftover on the left. */
 666                        new_extents++;
 667                }
 668                if (next_bit == 1) {
 669                        /* Leftover on the right. */
 670                        new_extents++;
 671                }
 672        } else {
 673                new_extents = 1;
 674                if (prev_bit == 1) {
 675                        /* Merging with neighbor on the left. */
 676                        new_extents--;
 677                }
 678                if (next_bit == 1) {
 679                        /* Merging with neighbor on the right. */
 680                        new_extents--;
 681                }
 682        }
 683
 684        btrfs_release_path(path);
 685        ret = update_free_space_extent_count(trans, block_group, path,
 686                                             new_extents);
 687
 688out:
 689        return ret;
 690}
 691
 692static int remove_free_space_extent(struct btrfs_trans_handle *trans,
 693                                    struct btrfs_block_group_cache *block_group,
 694                                    struct btrfs_path *path,
 695                                    u64 start, u64 size)
 696{
 697        struct btrfs_root *root = trans->fs_info->free_space_root;
 698        struct btrfs_key key;
 699        u64 found_start, found_end;
 700        u64 end = start + size;
 701        int new_extents = -1;
 702        int ret;
 703
 704        key.objectid = start;
 705        key.type = (u8)-1;
 706        key.offset = (u64)-1;
 707
 708        ret = btrfs_search_prev_slot(trans, root, &key, path, -1, 1);
 709        if (ret)
 710                goto out;
 711
 712        btrfs_item_key_to_cpu(path->nodes[0], &key, path->slots[0]);
 713
 714        ASSERT(key.type == BTRFS_FREE_SPACE_EXTENT_KEY);
 715
 716        found_start = key.objectid;
 717        found_end = key.objectid + key.offset;
 718        ASSERT(start >= found_start && end <= found_end);
 719
 720        /*
 721         * Okay, now that we've found the free space extent which contains the
 722         * free space that we are removing, there are four cases:
 723         *
 724         * 1. We're using the whole extent: delete the key we found and
 725         * decrement the free space extent count.
 726         * 2. We are using part of the extent starting at the beginning: delete
 727         * the key we found and insert a new key representing the leftover at
 728         * the end. There is no net change in the number of extents.
 729         * 3. We are using part of the extent ending at the end: delete the key
 730         * we found and insert a new key representing the leftover at the
 731         * beginning. There is no net change in the number of extents.
 732         * 4. We are using part of the extent in the middle: delete the key we
 733         * found and insert two new keys representing the leftovers on each
 734         * side. Where we used to have one extent, we now have two, so increment
 735         * the extent count. We may need to convert the block group to bitmaps
 736         * as a result.
 737         */
 738
 739        /* Delete the existing key (cases 1-4). */
 740        ret = btrfs_del_item(trans, root, path);
 741        if (ret)
 742                goto out;
 743
 744        /* Add a key for leftovers at the beginning (cases 3 and 4). */
 745        if (start > found_start) {
 746                key.objectid = found_start;
 747                key.type = BTRFS_FREE_SPACE_EXTENT_KEY;
 748                key.offset = start - found_start;
 749
 750                btrfs_release_path(path);
 751                ret = btrfs_insert_empty_item(trans, root, path, &key, 0);
 752                if (ret)
 753                        goto out;
 754                new_extents++;
 755        }
 756
 757        /* Add a key for leftovers at the end (cases 2 and 4). */
 758        if (end < found_end) {
 759                key.objectid = end;
 760                key.type = BTRFS_FREE_SPACE_EXTENT_KEY;
 761                key.offset = found_end - end;
 762
 763                btrfs_release_path(path);
 764                ret = btrfs_insert_empty_item(trans, root, path, &key, 0);
 765                if (ret)
 766                        goto out;
 767                new_extents++;
 768        }
 769
 770        btrfs_release_path(path);
 771        ret = update_free_space_extent_count(trans, block_group, path,
 772                                             new_extents);
 773
 774out:
 775        return ret;
 776}
 777
 778int __remove_from_free_space_tree(struct btrfs_trans_handle *trans,
 779                                  struct btrfs_block_group_cache *block_group,
 780                                  struct btrfs_path *path, u64 start, u64 size)
 781{
 782        struct btrfs_free_space_info *info;
 783        u32 flags;
 784        int ret;
 785
 786        if (block_group->needs_free_space) {
 787                ret = __add_block_group_free_space(trans, block_group, path);
 788                if (ret)
 789                        return ret;
 790        }
 791
 792        info = search_free_space_info(NULL, trans->fs_info, block_group, path,
 793                                      0);
 794        if (IS_ERR(info))
 795                return PTR_ERR(info);
 796        flags = btrfs_free_space_flags(path->nodes[0], info);
 797        btrfs_release_path(path);
 798
 799        if (flags & BTRFS_FREE_SPACE_USING_BITMAPS) {
 800                return modify_free_space_bitmap(trans, block_group, path,
 801                                                start, size, 1);
 802        } else {
 803                return remove_free_space_extent(trans, block_group, path,
 804                                                start, size);
 805        }
 806}
 807
 808int remove_from_free_space_tree(struct btrfs_trans_handle *trans,
 809                                u64 start, u64 size)
 810{
 811        struct btrfs_block_group_cache *block_group;
 812        struct btrfs_path *path;
 813        int ret;
 814
 815        if (!btrfs_fs_compat_ro(trans->fs_info, FREE_SPACE_TREE))
 816                return 0;
 817
 818        path = btrfs_alloc_path();
 819        if (!path) {
 820                ret = -ENOMEM;
 821                goto out;
 822        }
 823
 824        block_group = btrfs_lookup_block_group(trans->fs_info, start);
 825        if (!block_group) {
 826                ASSERT(0);
 827                ret = -ENOENT;
 828                goto out;
 829        }
 830
 831        mutex_lock(&block_group->free_space_lock);
 832        ret = __remove_from_free_space_tree(trans, block_group, path, start,
 833                                            size);
 834        mutex_unlock(&block_group->free_space_lock);
 835
 836        btrfs_put_block_group(block_group);
 837out:
 838        btrfs_free_path(path);
 839        if (ret)
 840                btrfs_abort_transaction(trans, ret);
 841        return ret;
 842}
 843
 844static int add_free_space_extent(struct btrfs_trans_handle *trans,
 845                                 struct btrfs_block_group_cache *block_group,
 846                                 struct btrfs_path *path,
 847                                 u64 start, u64 size)
 848{
 849        struct btrfs_root *root = trans->fs_info->free_space_root;
 850        struct btrfs_key key, new_key;
 851        u64 found_start, found_end;
 852        u64 end = start + size;
 853        int new_extents = 1;
 854        int ret;
 855
 856        /*
 857         * We are adding a new extent of free space, but we need to merge
 858         * extents. There are four cases here:
 859         *
 860         * 1. The new extent does not have any immediate neighbors to merge
 861         * with: add the new key and increment the free space extent count. We
 862         * may need to convert the block group to bitmaps as a result.
 863         * 2. The new extent has an immediate neighbor before it: remove the
 864         * previous key and insert a new key combining both of them. There is no
 865         * net change in the number of extents.
 866         * 3. The new extent has an immediate neighbor after it: remove the next
 867         * key and insert a new key combining both of them. There is no net
 868         * change in the number of extents.
 869         * 4. The new extent has immediate neighbors on both sides: remove both
 870         * of the keys and insert a new key combining all of them. Where we used
 871         * to have two extents, we now have one, so decrement the extent count.
 872         */
 873
 874        new_key.objectid = start;
 875        new_key.type = BTRFS_FREE_SPACE_EXTENT_KEY;
 876        new_key.offset = size;
 877
 878        /* Search for a neighbor on the left. */
 879        if (start == block_group->key.objectid)
 880                goto right;
 881        key.objectid = start - 1;
 882        key.type = (u8)-1;
 883        key.offset = (u64)-1;
 884
 885        ret = btrfs_search_prev_slot(trans, root, &key, path, -1, 1);
 886        if (ret)
 887                goto out;
 888
 889        btrfs_item_key_to_cpu(path->nodes[0], &key, path->slots[0]);
 890
 891        if (key.type != BTRFS_FREE_SPACE_EXTENT_KEY) {
 892                ASSERT(key.type == BTRFS_FREE_SPACE_INFO_KEY);
 893                btrfs_release_path(path);
 894                goto right;
 895        }
 896
 897        found_start = key.objectid;
 898        found_end = key.objectid + key.offset;
 899        ASSERT(found_start >= block_group->key.objectid &&
 900               found_end > block_group->key.objectid);
 901        ASSERT(found_start < start && found_end <= start);
 902
 903        /*
 904         * Delete the neighbor on the left and absorb it into the new key (cases
 905         * 2 and 4).
 906         */
 907        if (found_end == start) {
 908                ret = btrfs_del_item(trans, root, path);
 909                if (ret)
 910                        goto out;
 911                new_key.objectid = found_start;
 912                new_key.offset += key.offset;
 913                new_extents--;
 914        }
 915        btrfs_release_path(path);
 916
 917right:
 918        /* Search for a neighbor on the right. */
 919        if (end == block_group->key.objectid + block_group->key.offset)
 920                goto insert;
 921        key.objectid = end;
 922        key.type = (u8)-1;
 923        key.offset = (u64)-1;
 924
 925        ret = btrfs_search_prev_slot(trans, root, &key, path, -1, 1);
 926        if (ret)
 927                goto out;
 928
 929        btrfs_item_key_to_cpu(path->nodes[0], &key, path->slots[0]);
 930
 931        if (key.type != BTRFS_FREE_SPACE_EXTENT_KEY) {
 932                ASSERT(key.type == BTRFS_FREE_SPACE_INFO_KEY);
 933                btrfs_release_path(path);
 934                goto insert;
 935        }
 936
 937        found_start = key.objectid;
 938        found_end = key.objectid + key.offset;
 939        ASSERT(found_start >= block_group->key.objectid &&
 940               found_end > block_group->key.objectid);
 941        ASSERT((found_start < start && found_end <= start) ||
 942               (found_start >= end && found_end > end));
 943
 944        /*
 945         * Delete the neighbor on the right and absorb it into the new key
 946         * (cases 3 and 4).
 947         */
 948        if (found_start == end) {
 949                ret = btrfs_del_item(trans, root, path);
 950                if (ret)
 951                        goto out;
 952                new_key.offset += key.offset;
 953                new_extents--;
 954        }
 955        btrfs_release_path(path);
 956
 957insert:
 958        /* Insert the new key (cases 1-4). */
 959        ret = btrfs_insert_empty_item(trans, root, path, &new_key, 0);
 960        if (ret)
 961                goto out;
 962
 963        btrfs_release_path(path);
 964        ret = update_free_space_extent_count(trans, block_group, path,
 965                                             new_extents);
 966
 967out:
 968        return ret;
 969}
 970
 971int __add_to_free_space_tree(struct btrfs_trans_handle *trans,
 972                             struct btrfs_block_group_cache *block_group,
 973                             struct btrfs_path *path, u64 start, u64 size)
 974{
 975        struct btrfs_fs_info *fs_info = trans->fs_info;
 976        struct btrfs_free_space_info *info;
 977        u32 flags;
 978        int ret;
 979
 980        if (block_group->needs_free_space) {
 981                ret = __add_block_group_free_space(trans, block_group, path);
 982                if (ret)
 983                        return ret;
 984        }
 985
 986        info = search_free_space_info(NULL, fs_info, block_group, path, 0);
 987        if (IS_ERR(info))
 988                return PTR_ERR(info);
 989        flags = btrfs_free_space_flags(path->nodes[0], info);
 990        btrfs_release_path(path);
 991
 992        if (flags & BTRFS_FREE_SPACE_USING_BITMAPS) {
 993                return modify_free_space_bitmap(trans, block_group, path,
 994                                                start, size, 0);
 995        } else {
 996                return add_free_space_extent(trans, block_group, path, start,
 997                                             size);
 998        }
 999}
1000
1001int add_to_free_space_tree(struct btrfs_trans_handle *trans,
1002                           u64 start, u64 size)
1003{
1004        struct btrfs_block_group_cache *block_group;
1005        struct btrfs_path *path;
1006        int ret;
1007
1008        if (!btrfs_fs_compat_ro(trans->fs_info, FREE_SPACE_TREE))
1009                return 0;
1010
1011        path = btrfs_alloc_path();
1012        if (!path) {
1013                ret = -ENOMEM;
1014                goto out;
1015        }
1016
1017        block_group = btrfs_lookup_block_group(trans->fs_info, start);
1018        if (!block_group) {
1019                ASSERT(0);
1020                ret = -ENOENT;
1021                goto out;
1022        }
1023
1024        mutex_lock(&block_group->free_space_lock);
1025        ret = __add_to_free_space_tree(trans, block_group, path, start, size);
1026        mutex_unlock(&block_group->free_space_lock);
1027
1028        btrfs_put_block_group(block_group);
1029out:
1030        btrfs_free_path(path);
1031        if (ret)
1032                btrfs_abort_transaction(trans, ret);
1033        return ret;
1034}
1035
1036/*
1037 * Populate the free space tree by walking the extent tree. Operations on the
1038 * extent tree that happen as a result of writes to the free space tree will go
1039 * through the normal add/remove hooks.
1040 */
1041static int populate_free_space_tree(struct btrfs_trans_handle *trans,
1042                                    struct btrfs_block_group_cache *block_group)
1043{
1044        struct btrfs_root *extent_root = trans->fs_info->extent_root;
1045        struct btrfs_path *path, *path2;
1046        struct btrfs_key key;
1047        u64 start, end;
1048        int ret;
1049
1050        path = btrfs_alloc_path();
1051        if (!path)
1052                return -ENOMEM;
1053        path->reada = READA_FORWARD;
1054
1055        path2 = btrfs_alloc_path();
1056        if (!path2) {
1057                btrfs_free_path(path);
1058                return -ENOMEM;
1059        }
1060
1061        ret = add_new_free_space_info(trans, block_group, path2);
1062        if (ret)
1063                goto out;
1064
1065        mutex_lock(&block_group->free_space_lock);
1066
1067        /*
1068         * Iterate through all of the extent and metadata items in this block
1069         * group, adding the free space between them and the free space at the
1070         * end. Note that EXTENT_ITEM and METADATA_ITEM are less than
1071         * BLOCK_GROUP_ITEM, so an extent may precede the block group that it's
1072         * contained in.
1073         */
1074        key.objectid = block_group->key.objectid;
1075        key.type = BTRFS_EXTENT_ITEM_KEY;
1076        key.offset = 0;
1077
1078        ret = btrfs_search_slot_for_read(extent_root, &key, path, 1, 0);
1079        if (ret < 0)
1080                goto out_locked;
1081        ASSERT(ret == 0);
1082
1083        start = block_group->key.objectid;
1084        end = block_group->key.objectid + block_group->key.offset;
1085        while (1) {
1086                btrfs_item_key_to_cpu(path->nodes[0], &key, path->slots[0]);
1087
1088                if (key.type == BTRFS_EXTENT_ITEM_KEY ||
1089                    key.type == BTRFS_METADATA_ITEM_KEY) {
1090                        if (key.objectid >= end)
1091                                break;
1092
1093                        if (start < key.objectid) {
1094                                ret = __add_to_free_space_tree(trans,
1095                                                               block_group,
1096                                                               path2, start,
1097                                                               key.objectid -
1098                                                               start);
1099                                if (ret)
1100                                        goto out_locked;
1101                        }
1102                        start = key.objectid;
1103                        if (key.type == BTRFS_METADATA_ITEM_KEY)
1104                                start += trans->fs_info->nodesize;
1105                        else
1106                                start += key.offset;
1107                } else if (key.type == BTRFS_BLOCK_GROUP_ITEM_KEY) {
1108                        if (key.objectid != block_group->key.objectid)
1109                                break;
1110                }
1111
1112                ret = btrfs_next_item(extent_root, path);
1113                if (ret < 0)
1114                        goto out_locked;
1115                if (ret)
1116                        break;
1117        }
1118        if (start < end) {
1119                ret = __add_to_free_space_tree(trans, block_group, path2,
1120                                               start, end - start);
1121                if (ret)
1122                        goto out_locked;
1123        }
1124
1125        ret = 0;
1126out_locked:
1127        mutex_unlock(&block_group->free_space_lock);
1128out:
1129        btrfs_free_path(path2);
1130        btrfs_free_path(path);
1131        return ret;
1132}
1133
1134int btrfs_create_free_space_tree(struct btrfs_fs_info *fs_info)
1135{
1136        struct btrfs_trans_handle *trans;
1137        struct btrfs_root *tree_root = fs_info->tree_root;
1138        struct btrfs_root *free_space_root;
1139        struct btrfs_block_group_cache *block_group;
1140        struct rb_node *node;
1141        int ret;
1142
1143        trans = btrfs_start_transaction(tree_root, 0);
1144        if (IS_ERR(trans))
1145                return PTR_ERR(trans);
1146
1147        set_bit(BTRFS_FS_CREATING_FREE_SPACE_TREE, &fs_info->flags);
1148        free_space_root = btrfs_create_tree(trans, fs_info,
1149                                            BTRFS_FREE_SPACE_TREE_OBJECTID);
1150        if (IS_ERR(free_space_root)) {
1151                ret = PTR_ERR(free_space_root);
1152                goto abort;
1153        }
1154        fs_info->free_space_root = free_space_root;
1155
1156        node = rb_first(&fs_info->block_group_cache_tree);
1157        while (node) {
1158                block_group = rb_entry(node, struct btrfs_block_group_cache,
1159                                       cache_node);
1160                ret = populate_free_space_tree(trans, block_group);
1161                if (ret)
1162                        goto abort;
1163                node = rb_next(node);
1164        }
1165
1166        btrfs_set_fs_compat_ro(fs_info, FREE_SPACE_TREE);
1167        btrfs_set_fs_compat_ro(fs_info, FREE_SPACE_TREE_VALID);
1168        clear_bit(BTRFS_FS_CREATING_FREE_SPACE_TREE, &fs_info->flags);
1169
1170        return btrfs_commit_transaction(trans);
1171
1172abort:
1173        clear_bit(BTRFS_FS_CREATING_FREE_SPACE_TREE, &fs_info->flags);
1174        btrfs_abort_transaction(trans, ret);
1175        btrfs_end_transaction(trans);
1176        return ret;
1177}
1178
1179static int clear_free_space_tree(struct btrfs_trans_handle *trans,
1180                                 struct btrfs_root *root)
1181{
1182        struct btrfs_path *path;
1183        struct btrfs_key key;
1184        int nr;
1185        int ret;
1186
1187        path = btrfs_alloc_path();
1188        if (!path)
1189                return -ENOMEM;
1190
1191        path->leave_spinning = 1;
1192
1193        key.objectid = 0;
1194        key.type = 0;
1195        key.offset = 0;
1196
1197        while (1) {
1198                ret = btrfs_search_slot(trans, root, &key, path, -1, 1);
1199                if (ret < 0)
1200                        goto out;
1201
1202                nr = btrfs_header_nritems(path->nodes[0]);
1203                if (!nr)
1204                        break;
1205
1206                path->slots[0] = 0;
1207                ret = btrfs_del_items(trans, root, path, 0, nr);
1208                if (ret)
1209                        goto out;
1210
1211                btrfs_release_path(path);
1212        }
1213
1214        ret = 0;
1215out:
1216        btrfs_free_path(path);
1217        return ret;
1218}
1219
1220int btrfs_clear_free_space_tree(struct btrfs_fs_info *fs_info)
1221{
1222        struct btrfs_trans_handle *trans;
1223        struct btrfs_root *tree_root = fs_info->tree_root;
1224        struct btrfs_root *free_space_root = fs_info->free_space_root;
1225        int ret;
1226
1227        trans = btrfs_start_transaction(tree_root, 0);
1228        if (IS_ERR(trans))
1229                return PTR_ERR(trans);
1230
1231        btrfs_clear_fs_compat_ro(fs_info, FREE_SPACE_TREE);
1232        btrfs_clear_fs_compat_ro(fs_info, FREE_SPACE_TREE_VALID);
1233        fs_info->free_space_root = NULL;
1234
1235        ret = clear_free_space_tree(trans, free_space_root);
1236        if (ret)
1237                goto abort;
1238
1239        ret = btrfs_del_root(trans, fs_info, &free_space_root->root_key);
1240        if (ret)
1241                goto abort;
1242
1243        list_del(&free_space_root->dirty_list);
1244
1245        btrfs_tree_lock(free_space_root->node);
1246        clean_tree_block(fs_info, free_space_root->node);
1247        btrfs_tree_unlock(free_space_root->node);
1248        btrfs_free_tree_block(trans, free_space_root, free_space_root->node,
1249                              0, 1);
1250
1251        free_extent_buffer(free_space_root->node);
1252        free_extent_buffer(free_space_root->commit_root);
1253        kfree(free_space_root);
1254
1255        return btrfs_commit_transaction(trans);
1256
1257abort:
1258        btrfs_abort_transaction(trans, ret);
1259        btrfs_end_transaction(trans);
1260        return ret;
1261}
1262
1263static int __add_block_group_free_space(struct btrfs_trans_handle *trans,
1264                                        struct btrfs_block_group_cache *block_group,
1265                                        struct btrfs_path *path)
1266{
1267        int ret;
1268
1269        block_group->needs_free_space = 0;
1270
1271        ret = add_new_free_space_info(trans, block_group, path);
1272        if (ret)
1273                return ret;
1274
1275        return __add_to_free_space_tree(trans, block_group, path,
1276                                        block_group->key.objectid,
1277                                        block_group->key.offset);
1278}
1279
1280int add_block_group_free_space(struct btrfs_trans_handle *trans,
1281                               struct btrfs_block_group_cache *block_group)
1282{
1283        struct btrfs_fs_info *fs_info = trans->fs_info;
1284        struct btrfs_path *path = NULL;
1285        int ret = 0;
1286
1287        if (!btrfs_fs_compat_ro(fs_info, FREE_SPACE_TREE))
1288                return 0;
1289
1290        mutex_lock(&block_group->free_space_lock);
1291        if (!block_group->needs_free_space)
1292                goto out;
1293
1294        path = btrfs_alloc_path();
1295        if (!path) {
1296                ret = -ENOMEM;
1297                goto out;
1298        }
1299
1300        ret = __add_block_group_free_space(trans, block_group, path);
1301
1302out:
1303        btrfs_free_path(path);
1304        mutex_unlock(&block_group->free_space_lock);
1305        if (ret)
1306                btrfs_abort_transaction(trans, ret);
1307        return ret;
1308}
1309
1310int remove_block_group_free_space(struct btrfs_trans_handle *trans,
1311                                  struct btrfs_block_group_cache *block_group)
1312{
1313        struct btrfs_root *root = trans->fs_info->free_space_root;
1314        struct btrfs_path *path;
1315        struct btrfs_key key, found_key;
1316        struct extent_buffer *leaf;
1317        u64 start, end;
1318        int done = 0, nr;
1319        int ret;
1320
1321        if (!btrfs_fs_compat_ro(trans->fs_info, FREE_SPACE_TREE))
1322                return 0;
1323
1324        if (block_group->needs_free_space) {
1325                /* We never added this block group to the free space tree. */
1326                return 0;
1327        }
1328
1329        path = btrfs_alloc_path();
1330        if (!path) {
1331                ret = -ENOMEM;
1332                goto out;
1333        }
1334
1335        start = block_group->key.objectid;
1336        end = block_group->key.objectid + block_group->key.offset;
1337
1338        key.objectid = end - 1;
1339        key.type = (u8)-1;
1340        key.offset = (u64)-1;
1341
1342        while (!done) {
1343                ret = btrfs_search_prev_slot(trans, root, &key, path, -1, 1);
1344                if (ret)
1345                        goto out;
1346
1347                leaf = path->nodes[0];
1348                nr = 0;
1349                path->slots[0]++;
1350                while (path->slots[0] > 0) {
1351                        btrfs_item_key_to_cpu(leaf, &found_key, path->slots[0] - 1);
1352
1353                        if (found_key.type == BTRFS_FREE_SPACE_INFO_KEY) {
1354                                ASSERT(found_key.objectid == block_group->key.objectid);
1355                                ASSERT(found_key.offset == block_group->key.offset);
1356                                done = 1;
1357                                nr++;
1358                                path->slots[0]--;
1359                                break;
1360                        } else if (found_key.type == BTRFS_FREE_SPACE_EXTENT_KEY ||
1361                                   found_key.type == BTRFS_FREE_SPACE_BITMAP_KEY) {
1362                                ASSERT(found_key.objectid >= start);
1363                                ASSERT(found_key.objectid < end);
1364                                ASSERT(found_key.objectid + found_key.offset <= end);
1365                                nr++;
1366                                path->slots[0]--;
1367                        } else {
1368                                ASSERT(0);
1369                        }
1370                }
1371
1372                ret = btrfs_del_items(trans, root, path, path->slots[0], nr);
1373                if (ret)
1374                        goto out;
1375                btrfs_release_path(path);
1376        }
1377
1378        ret = 0;
1379out:
1380        btrfs_free_path(path);
1381        if (ret)
1382                btrfs_abort_transaction(trans, ret);
1383        return ret;
1384}
1385
1386static int load_free_space_bitmaps(struct btrfs_caching_control *caching_ctl,
1387                                   struct btrfs_path *path,
1388                                   u32 expected_extent_count)
1389{
1390        struct btrfs_block_group_cache *block_group;
1391        struct btrfs_fs_info *fs_info;
1392        struct btrfs_root *root;
1393        struct btrfs_key key;
1394        int prev_bit = 0, bit;
1395        /* Initialize to silence GCC. */
1396        u64 extent_start = 0;
1397        u64 end, offset;
1398        u64 total_found = 0;
1399        u32 extent_count = 0;
1400        int ret;
1401
1402        block_group = caching_ctl->block_group;
1403        fs_info = block_group->fs_info;
1404        root = fs_info->free_space_root;
1405
1406        end = block_group->key.objectid + block_group->key.offset;
1407
1408        while (1) {
1409                ret = btrfs_next_item(root, path);
1410                if (ret < 0)
1411                        goto out;
1412                if (ret)
1413                        break;
1414
1415                btrfs_item_key_to_cpu(path->nodes[0], &key, path->slots[0]);
1416
1417                if (key.type == BTRFS_FREE_SPACE_INFO_KEY)
1418                        break;
1419
1420                ASSERT(key.type == BTRFS_FREE_SPACE_BITMAP_KEY);
1421                ASSERT(key.objectid < end && key.objectid + key.offset <= end);
1422
1423                caching_ctl->progress = key.objectid;
1424
1425                offset = key.objectid;
1426                while (offset < key.objectid + key.offset) {
1427                        bit = free_space_test_bit(block_group, path, offset);
1428                        if (prev_bit == 0 && bit == 1) {
1429                                extent_start = offset;
1430                        } else if (prev_bit == 1 && bit == 0) {
1431                                total_found += add_new_free_space(block_group,
1432                                                                  extent_start,
1433                                                                  offset);
1434                                if (total_found > CACHING_CTL_WAKE_UP) {
1435                                        total_found = 0;
1436                                        wake_up(&caching_ctl->wait);
1437                                }
1438                                extent_count++;
1439                        }
1440                        prev_bit = bit;
1441                        offset += fs_info->sectorsize;
1442                }
1443        }
1444        if (prev_bit == 1) {
1445                total_found += add_new_free_space(block_group, extent_start,
1446                                                  end);
1447                extent_count++;
1448        }
1449
1450        if (extent_count != expected_extent_count) {
1451                btrfs_err(fs_info,
1452                          "incorrect extent count for %llu; counted %u, expected %u",
1453                          block_group->key.objectid, extent_count,
1454                          expected_extent_count);
1455                ASSERT(0);
1456                ret = -EIO;
1457                goto out;
1458        }
1459
1460        caching_ctl->progress = (u64)-1;
1461
1462        ret = 0;
1463out:
1464        return ret;
1465}
1466
1467static int load_free_space_extents(struct btrfs_caching_control *caching_ctl,
1468                                   struct btrfs_path *path,
1469                                   u32 expected_extent_count)
1470{
1471        struct btrfs_block_group_cache *block_group;
1472        struct btrfs_fs_info *fs_info;
1473        struct btrfs_root *root;
1474        struct btrfs_key key;
1475        u64 end;
1476        u64 total_found = 0;
1477        u32 extent_count = 0;
1478        int ret;
1479
1480        block_group = caching_ctl->block_group;
1481        fs_info = block_group->fs_info;
1482        root = fs_info->free_space_root;
1483
1484        end = block_group->key.objectid + block_group->key.offset;
1485
1486        while (1) {
1487                ret = btrfs_next_item(root, path);
1488                if (ret < 0)
1489                        goto out;
1490                if (ret)
1491                        break;
1492
1493                btrfs_item_key_to_cpu(path->nodes[0], &key, path->slots[0]);
1494
1495                if (key.type == BTRFS_FREE_SPACE_INFO_KEY)
1496                        break;
1497
1498                ASSERT(key.type == BTRFS_FREE_SPACE_EXTENT_KEY);
1499                ASSERT(key.objectid < end && key.objectid + key.offset <= end);
1500
1501                caching_ctl->progress = key.objectid;
1502
1503                total_found += add_new_free_space(block_group, key.objectid,
1504                                                  key.objectid + key.offset);
1505                if (total_found > CACHING_CTL_WAKE_UP) {
1506                        total_found = 0;
1507                        wake_up(&caching_ctl->wait);
1508                }
1509                extent_count++;
1510        }
1511
1512        if (extent_count != expected_extent_count) {
1513                btrfs_err(fs_info,
1514                          "incorrect extent count for %llu; counted %u, expected %u",
1515                          block_group->key.objectid, extent_count,
1516                          expected_extent_count);
1517                ASSERT(0);
1518                ret = -EIO;
1519                goto out;
1520        }
1521
1522        caching_ctl->progress = (u64)-1;
1523
1524        ret = 0;
1525out:
1526        return ret;
1527}
1528
1529int load_free_space_tree(struct btrfs_caching_control *caching_ctl)
1530{
1531        struct btrfs_block_group_cache *block_group;
1532        struct btrfs_fs_info *fs_info;
1533        struct btrfs_free_space_info *info;
1534        struct btrfs_path *path;
1535        u32 extent_count, flags;
1536        int ret;
1537
1538        block_group = caching_ctl->block_group;
1539        fs_info = block_group->fs_info;
1540
1541        path = btrfs_alloc_path();
1542        if (!path)
1543                return -ENOMEM;
1544
1545        /*
1546         * Just like caching_thread() doesn't want to deadlock on the extent
1547         * tree, we don't want to deadlock on the free space tree.
1548         */
1549        path->skip_locking = 1;
1550        path->search_commit_root = 1;
1551        path->reada = READA_FORWARD;
1552
1553        info = search_free_space_info(NULL, fs_info, block_group, path, 0);
1554        if (IS_ERR(info)) {
1555                ret = PTR_ERR(info);
1556                goto out;
1557        }
1558        extent_count = btrfs_free_space_extent_count(path->nodes[0], info);
1559        flags = btrfs_free_space_flags(path->nodes[0], info);
1560
1561        /*
1562         * We left path pointing to the free space info item, so now
1563         * load_free_space_foo can just iterate through the free space tree from
1564         * there.
1565         */
1566        if (flags & BTRFS_FREE_SPACE_USING_BITMAPS)
1567                ret = load_free_space_bitmaps(caching_ctl, path, extent_count);
1568        else
1569                ret = load_free_space_extents(caching_ctl, path, extent_count);
1570
1571out:
1572        btrfs_free_path(path);
1573        return ret;
1574}
1575