btrfs: Remove fs_info argument from __remove_from_free_space_tree
[sfrench/cifs-2.6.git] / fs / btrfs / free-space-tree.c
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
14 static 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
18 void 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
46 static 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;
72 out:
73         btrfs_release_path(path);
74         return ret;
75 }
76
77 struct btrfs_free_space_info *
78 search_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  */
109 static 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
134 static 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
139 static 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
159 static 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
179 int 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;
311 out:
312         kvfree(bitmap);
313         if (ret)
314                 btrfs_abort_transaction(trans, ret);
315         return ret;
316 }
317
318 int 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;
444 out:
445         kvfree(bitmap);
446         if (ret)
447                 btrfs_abort_transaction(trans, ret);
448         return ret;
449 }
450
451 static 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
486 out:
487         return ret;
488 }
489
490 int 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
512 static 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  */
554 static 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  */
579 static 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
688 out:
689         return ret;
690 }
691
692 static 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
774 out:
775         return ret;
776 }
777
778 int __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
808 int remove_from_free_space_tree(struct btrfs_trans_handle *trans,
809                                 struct btrfs_fs_info *fs_info,
810                                 u64 start, u64 size)
811 {
812         struct btrfs_block_group_cache *block_group;
813         struct btrfs_path *path;
814         int ret;
815
816         if (!btrfs_fs_compat_ro(fs_info, FREE_SPACE_TREE))
817                 return 0;
818
819         path = btrfs_alloc_path();
820         if (!path) {
821                 ret = -ENOMEM;
822                 goto out;
823         }
824
825         block_group = btrfs_lookup_block_group(fs_info, start);
826         if (!block_group) {
827                 ASSERT(0);
828                 ret = -ENOENT;
829                 goto out;
830         }
831
832         mutex_lock(&block_group->free_space_lock);
833         ret = __remove_from_free_space_tree(trans, block_group, path, start,
834                                             size);
835         mutex_unlock(&block_group->free_space_lock);
836
837         btrfs_put_block_group(block_group);
838 out:
839         btrfs_free_path(path);
840         if (ret)
841                 btrfs_abort_transaction(trans, ret);
842         return ret;
843 }
844
845 static int add_free_space_extent(struct btrfs_trans_handle *trans,
846                                  struct btrfs_block_group_cache *block_group,
847                                  struct btrfs_path *path,
848                                  u64 start, u64 size)
849 {
850         struct btrfs_root *root = trans->fs_info->free_space_root;
851         struct btrfs_key key, new_key;
852         u64 found_start, found_end;
853         u64 end = start + size;
854         int new_extents = 1;
855         int ret;
856
857         /*
858          * We are adding a new extent of free space, but we need to merge
859          * extents. There are four cases here:
860          *
861          * 1. The new extent does not have any immediate neighbors to merge
862          * with: add the new key and increment the free space extent count. We
863          * may need to convert the block group to bitmaps as a result.
864          * 2. The new extent has an immediate neighbor before it: remove the
865          * previous key and insert a new key combining both of them. There is no
866          * net change in the number of extents.
867          * 3. The new extent has an immediate neighbor after it: remove the next
868          * key and insert a new key combining both of them. There is no net
869          * change in the number of extents.
870          * 4. The new extent has immediate neighbors on both sides: remove both
871          * of the keys and insert a new key combining all of them. Where we used
872          * to have two extents, we now have one, so decrement the extent count.
873          */
874
875         new_key.objectid = start;
876         new_key.type = BTRFS_FREE_SPACE_EXTENT_KEY;
877         new_key.offset = size;
878
879         /* Search for a neighbor on the left. */
880         if (start == block_group->key.objectid)
881                 goto right;
882         key.objectid = start - 1;
883         key.type = (u8)-1;
884         key.offset = (u64)-1;
885
886         ret = btrfs_search_prev_slot(trans, root, &key, path, -1, 1);
887         if (ret)
888                 goto out;
889
890         btrfs_item_key_to_cpu(path->nodes[0], &key, path->slots[0]);
891
892         if (key.type != BTRFS_FREE_SPACE_EXTENT_KEY) {
893                 ASSERT(key.type == BTRFS_FREE_SPACE_INFO_KEY);
894                 btrfs_release_path(path);
895                 goto right;
896         }
897
898         found_start = key.objectid;
899         found_end = key.objectid + key.offset;
900         ASSERT(found_start >= block_group->key.objectid &&
901                found_end > block_group->key.objectid);
902         ASSERT(found_start < start && found_end <= start);
903
904         /*
905          * Delete the neighbor on the left and absorb it into the new key (cases
906          * 2 and 4).
907          */
908         if (found_end == start) {
909                 ret = btrfs_del_item(trans, root, path);
910                 if (ret)
911                         goto out;
912                 new_key.objectid = found_start;
913                 new_key.offset += key.offset;
914                 new_extents--;
915         }
916         btrfs_release_path(path);
917
918 right:
919         /* Search for a neighbor on the right. */
920         if (end == block_group->key.objectid + block_group->key.offset)
921                 goto insert;
922         key.objectid = end;
923         key.type = (u8)-1;
924         key.offset = (u64)-1;
925
926         ret = btrfs_search_prev_slot(trans, root, &key, path, -1, 1);
927         if (ret)
928                 goto out;
929
930         btrfs_item_key_to_cpu(path->nodes[0], &key, path->slots[0]);
931
932         if (key.type != BTRFS_FREE_SPACE_EXTENT_KEY) {
933                 ASSERT(key.type == BTRFS_FREE_SPACE_INFO_KEY);
934                 btrfs_release_path(path);
935                 goto insert;
936         }
937
938         found_start = key.objectid;
939         found_end = key.objectid + key.offset;
940         ASSERT(found_start >= block_group->key.objectid &&
941                found_end > block_group->key.objectid);
942         ASSERT((found_start < start && found_end <= start) ||
943                (found_start >= end && found_end > end));
944
945         /*
946          * Delete the neighbor on the right and absorb it into the new key
947          * (cases 3 and 4).
948          */
949         if (found_start == end) {
950                 ret = btrfs_del_item(trans, root, path);
951                 if (ret)
952                         goto out;
953                 new_key.offset += key.offset;
954                 new_extents--;
955         }
956         btrfs_release_path(path);
957
958 insert:
959         /* Insert the new key (cases 1-4). */
960         ret = btrfs_insert_empty_item(trans, root, path, &new_key, 0);
961         if (ret)
962                 goto out;
963
964         btrfs_release_path(path);
965         ret = update_free_space_extent_count(trans, block_group, path,
966                                              new_extents);
967
968 out:
969         return ret;
970 }
971
972 int __add_to_free_space_tree(struct btrfs_trans_handle *trans,
973                              struct btrfs_block_group_cache *block_group,
974                              struct btrfs_path *path, u64 start, u64 size)
975 {
976         struct btrfs_fs_info *fs_info = trans->fs_info;
977         struct btrfs_free_space_info *info;
978         u32 flags;
979         int ret;
980
981         if (block_group->needs_free_space) {
982                 ret = __add_block_group_free_space(trans, block_group, path);
983                 if (ret)
984                         return ret;
985         }
986
987         info = search_free_space_info(NULL, fs_info, block_group, path, 0);
988         if (IS_ERR(info))
989                 return PTR_ERR(info);
990         flags = btrfs_free_space_flags(path->nodes[0], info);
991         btrfs_release_path(path);
992
993         if (flags & BTRFS_FREE_SPACE_USING_BITMAPS) {
994                 return modify_free_space_bitmap(trans, block_group, path,
995                                                 start, size, 0);
996         } else {
997                 return add_free_space_extent(trans, block_group, path, start,
998                                              size);
999         }
1000 }
1001
1002 int add_to_free_space_tree(struct btrfs_trans_handle *trans,
1003                            struct btrfs_fs_info *fs_info,
1004                            u64 start, u64 size)
1005 {
1006         struct btrfs_block_group_cache *block_group;
1007         struct btrfs_path *path;
1008         int ret;
1009
1010         if (!btrfs_fs_compat_ro(fs_info, FREE_SPACE_TREE))
1011                 return 0;
1012
1013         path = btrfs_alloc_path();
1014         if (!path) {
1015                 ret = -ENOMEM;
1016                 goto out;
1017         }
1018
1019         block_group = btrfs_lookup_block_group(fs_info, start);
1020         if (!block_group) {
1021                 ASSERT(0);
1022                 ret = -ENOENT;
1023                 goto out;
1024         }
1025
1026         mutex_lock(&block_group->free_space_lock);
1027         ret = __add_to_free_space_tree(trans, block_group, path, start, size);
1028         mutex_unlock(&block_group->free_space_lock);
1029
1030         btrfs_put_block_group(block_group);
1031 out:
1032         btrfs_free_path(path);
1033         if (ret)
1034                 btrfs_abort_transaction(trans, ret);
1035         return ret;
1036 }
1037
1038 /*
1039  * Populate the free space tree by walking the extent tree. Operations on the
1040  * extent tree that happen as a result of writes to the free space tree will go
1041  * through the normal add/remove hooks.
1042  */
1043 static int populate_free_space_tree(struct btrfs_trans_handle *trans,
1044                                     struct btrfs_fs_info *fs_info,
1045                                     struct btrfs_block_group_cache *block_group)
1046 {
1047         struct btrfs_root *extent_root = fs_info->extent_root;
1048         struct btrfs_path *path, *path2;
1049         struct btrfs_key key;
1050         u64 start, end;
1051         int ret;
1052
1053         path = btrfs_alloc_path();
1054         if (!path)
1055                 return -ENOMEM;
1056         path->reada = READA_FORWARD;
1057
1058         path2 = btrfs_alloc_path();
1059         if (!path2) {
1060                 btrfs_free_path(path);
1061                 return -ENOMEM;
1062         }
1063
1064         ret = add_new_free_space_info(trans, block_group, path2);
1065         if (ret)
1066                 goto out;
1067
1068         mutex_lock(&block_group->free_space_lock);
1069
1070         /*
1071          * Iterate through all of the extent and metadata items in this block
1072          * group, adding the free space between them and the free space at the
1073          * end. Note that EXTENT_ITEM and METADATA_ITEM are less than
1074          * BLOCK_GROUP_ITEM, so an extent may precede the block group that it's
1075          * contained in.
1076          */
1077         key.objectid = block_group->key.objectid;
1078         key.type = BTRFS_EXTENT_ITEM_KEY;
1079         key.offset = 0;
1080
1081         ret = btrfs_search_slot_for_read(extent_root, &key, path, 1, 0);
1082         if (ret < 0)
1083                 goto out_locked;
1084         ASSERT(ret == 0);
1085
1086         start = block_group->key.objectid;
1087         end = block_group->key.objectid + block_group->key.offset;
1088         while (1) {
1089                 btrfs_item_key_to_cpu(path->nodes[0], &key, path->slots[0]);
1090
1091                 if (key.type == BTRFS_EXTENT_ITEM_KEY ||
1092                     key.type == BTRFS_METADATA_ITEM_KEY) {
1093                         if (key.objectid >= end)
1094                                 break;
1095
1096                         if (start < key.objectid) {
1097                                 ret = __add_to_free_space_tree(trans,
1098                                                                block_group,
1099                                                                path2, start,
1100                                                                key.objectid -
1101                                                                start);
1102                                 if (ret)
1103                                         goto out_locked;
1104                         }
1105                         start = key.objectid;
1106                         if (key.type == BTRFS_METADATA_ITEM_KEY)
1107                                 start += fs_info->nodesize;
1108                         else
1109                                 start += key.offset;
1110                 } else if (key.type == BTRFS_BLOCK_GROUP_ITEM_KEY) {
1111                         if (key.objectid != block_group->key.objectid)
1112                                 break;
1113                 }
1114
1115                 ret = btrfs_next_item(extent_root, path);
1116                 if (ret < 0)
1117                         goto out_locked;
1118                 if (ret)
1119                         break;
1120         }
1121         if (start < end) {
1122                 ret = __add_to_free_space_tree(trans, block_group, path2,
1123                                                start, end - start);
1124                 if (ret)
1125                         goto out_locked;
1126         }
1127
1128         ret = 0;
1129 out_locked:
1130         mutex_unlock(&block_group->free_space_lock);
1131 out:
1132         btrfs_free_path(path2);
1133         btrfs_free_path(path);
1134         return ret;
1135 }
1136
1137 int btrfs_create_free_space_tree(struct btrfs_fs_info *fs_info)
1138 {
1139         struct btrfs_trans_handle *trans;
1140         struct btrfs_root *tree_root = fs_info->tree_root;
1141         struct btrfs_root *free_space_root;
1142         struct btrfs_block_group_cache *block_group;
1143         struct rb_node *node;
1144         int ret;
1145
1146         trans = btrfs_start_transaction(tree_root, 0);
1147         if (IS_ERR(trans))
1148                 return PTR_ERR(trans);
1149
1150         set_bit(BTRFS_FS_CREATING_FREE_SPACE_TREE, &fs_info->flags);
1151         free_space_root = btrfs_create_tree(trans, fs_info,
1152                                             BTRFS_FREE_SPACE_TREE_OBJECTID);
1153         if (IS_ERR(free_space_root)) {
1154                 ret = PTR_ERR(free_space_root);
1155                 goto abort;
1156         }
1157         fs_info->free_space_root = free_space_root;
1158
1159         node = rb_first(&fs_info->block_group_cache_tree);
1160         while (node) {
1161                 block_group = rb_entry(node, struct btrfs_block_group_cache,
1162                                        cache_node);
1163                 ret = populate_free_space_tree(trans, fs_info, block_group);
1164                 if (ret)
1165                         goto abort;
1166                 node = rb_next(node);
1167         }
1168
1169         btrfs_set_fs_compat_ro(fs_info, FREE_SPACE_TREE);
1170         btrfs_set_fs_compat_ro(fs_info, FREE_SPACE_TREE_VALID);
1171         clear_bit(BTRFS_FS_CREATING_FREE_SPACE_TREE, &fs_info->flags);
1172
1173         return btrfs_commit_transaction(trans);
1174
1175 abort:
1176         clear_bit(BTRFS_FS_CREATING_FREE_SPACE_TREE, &fs_info->flags);
1177         btrfs_abort_transaction(trans, ret);
1178         btrfs_end_transaction(trans);
1179         return ret;
1180 }
1181
1182 static int clear_free_space_tree(struct btrfs_trans_handle *trans,
1183                                  struct btrfs_root *root)
1184 {
1185         struct btrfs_path *path;
1186         struct btrfs_key key;
1187         int nr;
1188         int ret;
1189
1190         path = btrfs_alloc_path();
1191         if (!path)
1192                 return -ENOMEM;
1193
1194         path->leave_spinning = 1;
1195
1196         key.objectid = 0;
1197         key.type = 0;
1198         key.offset = 0;
1199
1200         while (1) {
1201                 ret = btrfs_search_slot(trans, root, &key, path, -1, 1);
1202                 if (ret < 0)
1203                         goto out;
1204
1205                 nr = btrfs_header_nritems(path->nodes[0]);
1206                 if (!nr)
1207                         break;
1208
1209                 path->slots[0] = 0;
1210                 ret = btrfs_del_items(trans, root, path, 0, nr);
1211                 if (ret)
1212                         goto out;
1213
1214                 btrfs_release_path(path);
1215         }
1216
1217         ret = 0;
1218 out:
1219         btrfs_free_path(path);
1220         return ret;
1221 }
1222
1223 int btrfs_clear_free_space_tree(struct btrfs_fs_info *fs_info)
1224 {
1225         struct btrfs_trans_handle *trans;
1226         struct btrfs_root *tree_root = fs_info->tree_root;
1227         struct btrfs_root *free_space_root = fs_info->free_space_root;
1228         int ret;
1229
1230         trans = btrfs_start_transaction(tree_root, 0);
1231         if (IS_ERR(trans))
1232                 return PTR_ERR(trans);
1233
1234         btrfs_clear_fs_compat_ro(fs_info, FREE_SPACE_TREE);
1235         btrfs_clear_fs_compat_ro(fs_info, FREE_SPACE_TREE_VALID);
1236         fs_info->free_space_root = NULL;
1237
1238         ret = clear_free_space_tree(trans, free_space_root);
1239         if (ret)
1240                 goto abort;
1241
1242         ret = btrfs_del_root(trans, fs_info, &free_space_root->root_key);
1243         if (ret)
1244                 goto abort;
1245
1246         list_del(&free_space_root->dirty_list);
1247
1248         btrfs_tree_lock(free_space_root->node);
1249         clean_tree_block(fs_info, free_space_root->node);
1250         btrfs_tree_unlock(free_space_root->node);
1251         btrfs_free_tree_block(trans, free_space_root, free_space_root->node,
1252                               0, 1);
1253
1254         free_extent_buffer(free_space_root->node);
1255         free_extent_buffer(free_space_root->commit_root);
1256         kfree(free_space_root);
1257
1258         return btrfs_commit_transaction(trans);
1259
1260 abort:
1261         btrfs_abort_transaction(trans, ret);
1262         btrfs_end_transaction(trans);
1263         return ret;
1264 }
1265
1266 static int __add_block_group_free_space(struct btrfs_trans_handle *trans,
1267                                         struct btrfs_block_group_cache *block_group,
1268                                         struct btrfs_path *path)
1269 {
1270         int ret;
1271
1272         block_group->needs_free_space = 0;
1273
1274         ret = add_new_free_space_info(trans, block_group, path);
1275         if (ret)
1276                 return ret;
1277
1278         return __add_to_free_space_tree(trans, block_group, path,
1279                                         block_group->key.objectid,
1280                                         block_group->key.offset);
1281 }
1282
1283 int add_block_group_free_space(struct btrfs_trans_handle *trans,
1284                                struct btrfs_block_group_cache *block_group)
1285 {
1286         struct btrfs_fs_info *fs_info = trans->fs_info;
1287         struct btrfs_path *path = NULL;
1288         int ret = 0;
1289
1290         if (!btrfs_fs_compat_ro(fs_info, FREE_SPACE_TREE))
1291                 return 0;
1292
1293         mutex_lock(&block_group->free_space_lock);
1294         if (!block_group->needs_free_space)
1295                 goto out;
1296
1297         path = btrfs_alloc_path();
1298         if (!path) {
1299                 ret = -ENOMEM;
1300                 goto out;
1301         }
1302
1303         ret = __add_block_group_free_space(trans, block_group, path);
1304
1305 out:
1306         btrfs_free_path(path);
1307         mutex_unlock(&block_group->free_space_lock);
1308         if (ret)
1309                 btrfs_abort_transaction(trans, ret);
1310         return ret;
1311 }
1312
1313 int remove_block_group_free_space(struct btrfs_trans_handle *trans,
1314                                   struct btrfs_block_group_cache *block_group)
1315 {
1316         struct btrfs_root *root = trans->fs_info->free_space_root;
1317         struct btrfs_path *path;
1318         struct btrfs_key key, found_key;
1319         struct extent_buffer *leaf;
1320         u64 start, end;
1321         int done = 0, nr;
1322         int ret;
1323
1324         if (!btrfs_fs_compat_ro(trans->fs_info, FREE_SPACE_TREE))
1325                 return 0;
1326
1327         if (block_group->needs_free_space) {
1328                 /* We never added this block group to the free space tree. */
1329                 return 0;
1330         }
1331
1332         path = btrfs_alloc_path();
1333         if (!path) {
1334                 ret = -ENOMEM;
1335                 goto out;
1336         }
1337
1338         start = block_group->key.objectid;
1339         end = block_group->key.objectid + block_group->key.offset;
1340
1341         key.objectid = end - 1;
1342         key.type = (u8)-1;
1343         key.offset = (u64)-1;
1344
1345         while (!done) {
1346                 ret = btrfs_search_prev_slot(trans, root, &key, path, -1, 1);
1347                 if (ret)
1348                         goto out;
1349
1350                 leaf = path->nodes[0];
1351                 nr = 0;
1352                 path->slots[0]++;
1353                 while (path->slots[0] > 0) {
1354                         btrfs_item_key_to_cpu(leaf, &found_key, path->slots[0] - 1);
1355
1356                         if (found_key.type == BTRFS_FREE_SPACE_INFO_KEY) {
1357                                 ASSERT(found_key.objectid == block_group->key.objectid);
1358                                 ASSERT(found_key.offset == block_group->key.offset);
1359                                 done = 1;
1360                                 nr++;
1361                                 path->slots[0]--;
1362                                 break;
1363                         } else if (found_key.type == BTRFS_FREE_SPACE_EXTENT_KEY ||
1364                                    found_key.type == BTRFS_FREE_SPACE_BITMAP_KEY) {
1365                                 ASSERT(found_key.objectid >= start);
1366                                 ASSERT(found_key.objectid < end);
1367                                 ASSERT(found_key.objectid + found_key.offset <= end);
1368                                 nr++;
1369                                 path->slots[0]--;
1370                         } else {
1371                                 ASSERT(0);
1372                         }
1373                 }
1374
1375                 ret = btrfs_del_items(trans, root, path, path->slots[0], nr);
1376                 if (ret)
1377                         goto out;
1378                 btrfs_release_path(path);
1379         }
1380
1381         ret = 0;
1382 out:
1383         btrfs_free_path(path);
1384         if (ret)
1385                 btrfs_abort_transaction(trans, ret);
1386         return ret;
1387 }
1388
1389 static int load_free_space_bitmaps(struct btrfs_caching_control *caching_ctl,
1390                                    struct btrfs_path *path,
1391                                    u32 expected_extent_count)
1392 {
1393         struct btrfs_block_group_cache *block_group;
1394         struct btrfs_fs_info *fs_info;
1395         struct btrfs_root *root;
1396         struct btrfs_key key;
1397         int prev_bit = 0, bit;
1398         /* Initialize to silence GCC. */
1399         u64 extent_start = 0;
1400         u64 end, offset;
1401         u64 total_found = 0;
1402         u32 extent_count = 0;
1403         int ret;
1404
1405         block_group = caching_ctl->block_group;
1406         fs_info = block_group->fs_info;
1407         root = fs_info->free_space_root;
1408
1409         end = block_group->key.objectid + block_group->key.offset;
1410
1411         while (1) {
1412                 ret = btrfs_next_item(root, path);
1413                 if (ret < 0)
1414                         goto out;
1415                 if (ret)
1416                         break;
1417
1418                 btrfs_item_key_to_cpu(path->nodes[0], &key, path->slots[0]);
1419
1420                 if (key.type == BTRFS_FREE_SPACE_INFO_KEY)
1421                         break;
1422
1423                 ASSERT(key.type == BTRFS_FREE_SPACE_BITMAP_KEY);
1424                 ASSERT(key.objectid < end && key.objectid + key.offset <= end);
1425
1426                 caching_ctl->progress = key.objectid;
1427
1428                 offset = key.objectid;
1429                 while (offset < key.objectid + key.offset) {
1430                         bit = free_space_test_bit(block_group, path, offset);
1431                         if (prev_bit == 0 && bit == 1) {
1432                                 extent_start = offset;
1433                         } else if (prev_bit == 1 && bit == 0) {
1434                                 total_found += add_new_free_space(block_group,
1435                                                                   extent_start,
1436                                                                   offset);
1437                                 if (total_found > CACHING_CTL_WAKE_UP) {
1438                                         total_found = 0;
1439                                         wake_up(&caching_ctl->wait);
1440                                 }
1441                                 extent_count++;
1442                         }
1443                         prev_bit = bit;
1444                         offset += fs_info->sectorsize;
1445                 }
1446         }
1447         if (prev_bit == 1) {
1448                 total_found += add_new_free_space(block_group, extent_start,
1449                                                   end);
1450                 extent_count++;
1451         }
1452
1453         if (extent_count != expected_extent_count) {
1454                 btrfs_err(fs_info,
1455                           "incorrect extent count for %llu; counted %u, expected %u",
1456                           block_group->key.objectid, extent_count,
1457                           expected_extent_count);
1458                 ASSERT(0);
1459                 ret = -EIO;
1460                 goto out;
1461         }
1462
1463         caching_ctl->progress = (u64)-1;
1464
1465         ret = 0;
1466 out:
1467         return ret;
1468 }
1469
1470 static int load_free_space_extents(struct btrfs_caching_control *caching_ctl,
1471                                    struct btrfs_path *path,
1472                                    u32 expected_extent_count)
1473 {
1474         struct btrfs_block_group_cache *block_group;
1475         struct btrfs_fs_info *fs_info;
1476         struct btrfs_root *root;
1477         struct btrfs_key key;
1478         u64 end;
1479         u64 total_found = 0;
1480         u32 extent_count = 0;
1481         int ret;
1482
1483         block_group = caching_ctl->block_group;
1484         fs_info = block_group->fs_info;
1485         root = fs_info->free_space_root;
1486
1487         end = block_group->key.objectid + block_group->key.offset;
1488
1489         while (1) {
1490                 ret = btrfs_next_item(root, path);
1491                 if (ret < 0)
1492                         goto out;
1493                 if (ret)
1494                         break;
1495
1496                 btrfs_item_key_to_cpu(path->nodes[0], &key, path->slots[0]);
1497
1498                 if (key.type == BTRFS_FREE_SPACE_INFO_KEY)
1499                         break;
1500
1501                 ASSERT(key.type == BTRFS_FREE_SPACE_EXTENT_KEY);
1502                 ASSERT(key.objectid < end && key.objectid + key.offset <= end);
1503
1504                 caching_ctl->progress = key.objectid;
1505
1506                 total_found += add_new_free_space(block_group, key.objectid,
1507                                                   key.objectid + key.offset);
1508                 if (total_found > CACHING_CTL_WAKE_UP) {
1509                         total_found = 0;
1510                         wake_up(&caching_ctl->wait);
1511                 }
1512                 extent_count++;
1513         }
1514
1515         if (extent_count != expected_extent_count) {
1516                 btrfs_err(fs_info,
1517                           "incorrect extent count for %llu; counted %u, expected %u",
1518                           block_group->key.objectid, extent_count,
1519                           expected_extent_count);
1520                 ASSERT(0);
1521                 ret = -EIO;
1522                 goto out;
1523         }
1524
1525         caching_ctl->progress = (u64)-1;
1526
1527         ret = 0;
1528 out:
1529         return ret;
1530 }
1531
1532 int load_free_space_tree(struct btrfs_caching_control *caching_ctl)
1533 {
1534         struct btrfs_block_group_cache *block_group;
1535         struct btrfs_fs_info *fs_info;
1536         struct btrfs_free_space_info *info;
1537         struct btrfs_path *path;
1538         u32 extent_count, flags;
1539         int ret;
1540
1541         block_group = caching_ctl->block_group;
1542         fs_info = block_group->fs_info;
1543
1544         path = btrfs_alloc_path();
1545         if (!path)
1546                 return -ENOMEM;
1547
1548         /*
1549          * Just like caching_thread() doesn't want to deadlock on the extent
1550          * tree, we don't want to deadlock on the free space tree.
1551          */
1552         path->skip_locking = 1;
1553         path->search_commit_root = 1;
1554         path->reada = READA_FORWARD;
1555
1556         info = search_free_space_info(NULL, fs_info, block_group, path, 0);
1557         if (IS_ERR(info)) {
1558                 ret = PTR_ERR(info);
1559                 goto out;
1560         }
1561         extent_count = btrfs_free_space_extent_count(path->nodes[0], info);
1562         flags = btrfs_free_space_flags(path->nodes[0], info);
1563
1564         /*
1565          * We left path pointing to the free space info item, so now
1566          * load_free_space_foo can just iterate through the free space tree from
1567          * there.
1568          */
1569         if (flags & BTRFS_FREE_SPACE_USING_BITMAPS)
1570                 ret = load_free_space_bitmaps(caching_ctl, path, extent_count);
1571         else
1572                 ret = load_free_space_extents(caching_ctl, path, extent_count);
1573
1574 out:
1575         btrfs_free_path(path);
1576         return ret;
1577 }