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