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