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