Lines Matching +full:cache +full:- +full:block +full:- +full:size
1 // SPDX-License-Identifier: GPL-2.0
5 #include "block-group.h"
6 #include "space-info.h"
7 #include "disk-io.h"
8 #include "free-space-cache.h"
9 #include "free-space-tree.h"
12 #include "ref-verify.h"
14 #include "tree-log.h"
15 #include "delalloc-space.h"
28 struct btrfs_balance_control *bctl = fs_info->balance_ctl; in get_restripe_target()
35 bctl->data.flags & BTRFS_BALANCE_ARGS_CONVERT) { in get_restripe_target()
36 target = BTRFS_BLOCK_GROUP_DATA | bctl->data.target; in get_restripe_target()
38 bctl->sys.flags & BTRFS_BALANCE_ARGS_CONVERT) { in get_restripe_target()
39 target = BTRFS_BLOCK_GROUP_SYSTEM | bctl->sys.target; in get_restripe_target()
41 bctl->meta.flags & BTRFS_BALANCE_ARGS_CONVERT) { in get_restripe_target()
42 target = BTRFS_BLOCK_GROUP_METADATA | bctl->meta.target; in get_restripe_target()
57 u64 num_devices = fs_info->fs_devices->rw_devices; in btrfs_reduce_alloc_profile()
66 spin_lock(&fs_info->balance_lock); in btrfs_reduce_alloc_profile()
69 spin_unlock(&fs_info->balance_lock); in btrfs_reduce_alloc_profile()
72 spin_unlock(&fs_info->balance_lock); in btrfs_reduce_alloc_profile()
104 seq = read_seqbegin(&fs_info->profiles_lock); in btrfs_get_alloc_profile()
107 flags |= fs_info->avail_data_alloc_bits; in btrfs_get_alloc_profile()
109 flags |= fs_info->avail_system_alloc_bits; in btrfs_get_alloc_profile()
111 flags |= fs_info->avail_metadata_alloc_bits; in btrfs_get_alloc_profile()
112 } while (read_seqretry(&fs_info->profiles_lock, seq)); in btrfs_get_alloc_profile()
117 void btrfs_get_block_group(struct btrfs_block_group *cache) in btrfs_get_block_group() argument
119 refcount_inc(&cache->refs); in btrfs_get_block_group()
122 void btrfs_put_block_group(struct btrfs_block_group *cache) in btrfs_put_block_group() argument
124 if (refcount_dec_and_test(&cache->refs)) { in btrfs_put_block_group()
125 WARN_ON(cache->pinned > 0); in btrfs_put_block_group()
126 WARN_ON(cache->reserved > 0); in btrfs_put_block_group()
133 if (WARN_ON(!list_empty(&cache->discard_list))) in btrfs_put_block_group()
134 btrfs_discard_cancel_work(&cache->fs_info->discard_ctl, in btrfs_put_block_group()
135 cache); in btrfs_put_block_group()
140 * And it will definitely cause use-after-free when caller in btrfs_put_block_group()
145 WARN_ON(!RB_EMPTY_ROOT(&cache->full_stripe_locks_root.root)); in btrfs_put_block_group()
146 kfree(cache->free_space_ctl); in btrfs_put_block_group()
147 kfree(cache); in btrfs_put_block_group()
152 * This adds the block group to the fs_info rb tree for the block group cache
159 struct btrfs_block_group *cache; in btrfs_add_block_group_cache() local
161 ASSERT(block_group->length != 0); in btrfs_add_block_group_cache()
163 spin_lock(&info->block_group_cache_lock); in btrfs_add_block_group_cache()
164 p = &info->block_group_cache_tree.rb_node; in btrfs_add_block_group_cache()
168 cache = rb_entry(parent, struct btrfs_block_group, cache_node); in btrfs_add_block_group_cache()
169 if (block_group->start < cache->start) { in btrfs_add_block_group_cache()
170 p = &(*p)->rb_left; in btrfs_add_block_group_cache()
171 } else if (block_group->start > cache->start) { in btrfs_add_block_group_cache()
172 p = &(*p)->rb_right; in btrfs_add_block_group_cache()
174 spin_unlock(&info->block_group_cache_lock); in btrfs_add_block_group_cache()
175 return -EEXIST; in btrfs_add_block_group_cache()
179 rb_link_node(&block_group->cache_node, parent, p); in btrfs_add_block_group_cache()
180 rb_insert_color(&block_group->cache_node, in btrfs_add_block_group_cache()
181 &info->block_group_cache_tree); in btrfs_add_block_group_cache()
183 if (info->first_logical_byte > block_group->start) in btrfs_add_block_group_cache()
184 info->first_logical_byte = block_group->start; in btrfs_add_block_group_cache()
186 spin_unlock(&info->block_group_cache_lock); in btrfs_add_block_group_cache()
192 * This will return the block group at or after bytenr if contains is 0, else
193 * it will return the block group that contains the bytenr
198 struct btrfs_block_group *cache, *ret = NULL; in block_group_cache_tree_search() local
202 spin_lock(&info->block_group_cache_lock); in block_group_cache_tree_search()
203 n = info->block_group_cache_tree.rb_node; in block_group_cache_tree_search()
206 cache = rb_entry(n, struct btrfs_block_group, cache_node); in block_group_cache_tree_search()
207 end = cache->start + cache->length - 1; in block_group_cache_tree_search()
208 start = cache->start; in block_group_cache_tree_search()
211 if (!contains && (!ret || start < ret->start)) in block_group_cache_tree_search()
212 ret = cache; in block_group_cache_tree_search()
213 n = n->rb_left; in block_group_cache_tree_search()
216 ret = cache; in block_group_cache_tree_search()
219 n = n->rb_right; in block_group_cache_tree_search()
221 ret = cache; in block_group_cache_tree_search()
227 if (bytenr == 0 && info->first_logical_byte > ret->start) in block_group_cache_tree_search()
228 info->first_logical_byte = ret->start; in block_group_cache_tree_search()
230 spin_unlock(&info->block_group_cache_lock); in block_group_cache_tree_search()
236 * Return the block group that starts at or after bytenr
245 * Return the block group that contains the given bytenr
254 struct btrfs_block_group *cache) in btrfs_next_block_group() argument
256 struct btrfs_fs_info *fs_info = cache->fs_info; in btrfs_next_block_group()
259 spin_lock(&fs_info->block_group_cache_lock); in btrfs_next_block_group()
261 /* If our block group was removed, we need a full search. */ in btrfs_next_block_group()
262 if (RB_EMPTY_NODE(&cache->cache_node)) { in btrfs_next_block_group()
263 const u64 next_bytenr = cache->start + cache->length; in btrfs_next_block_group()
265 spin_unlock(&fs_info->block_group_cache_lock); in btrfs_next_block_group()
266 btrfs_put_block_group(cache); in btrfs_next_block_group()
267 cache = btrfs_lookup_first_block_group(fs_info, next_bytenr); return cache; in btrfs_next_block_group()
269 node = rb_next(&cache->cache_node); in btrfs_next_block_group()
270 btrfs_put_block_group(cache); in btrfs_next_block_group()
272 cache = rb_entry(node, struct btrfs_block_group, cache_node); in btrfs_next_block_group()
273 btrfs_get_block_group(cache); in btrfs_next_block_group()
275 cache = NULL; in btrfs_next_block_group()
276 spin_unlock(&fs_info->block_group_cache_lock); in btrfs_next_block_group()
277 return cache; in btrfs_next_block_group()
289 spin_lock(&bg->lock); in btrfs_inc_nocow_writers()
290 if (bg->ro) in btrfs_inc_nocow_writers()
293 atomic_inc(&bg->nocow_writers); in btrfs_inc_nocow_writers()
294 spin_unlock(&bg->lock); in btrfs_inc_nocow_writers()
296 /* No put on block group, done by btrfs_dec_nocow_writers */ in btrfs_inc_nocow_writers()
309 if (atomic_dec_and_test(&bg->nocow_writers)) in btrfs_dec_nocow_writers()
310 wake_up_var(&bg->nocow_writers); in btrfs_dec_nocow_writers()
321 wait_var_event(&bg->nocow_writers, !atomic_read(&bg->nocow_writers)); in btrfs_wait_nocow_writers()
331 if (atomic_dec_and_test(&bg->reservations)) in btrfs_dec_block_group_reservations()
332 wake_up_var(&bg->reservations); in btrfs_dec_block_group_reservations()
338 struct btrfs_space_info *space_info = bg->space_info; in btrfs_wait_block_group_reservations()
340 ASSERT(bg->ro); in btrfs_wait_block_group_reservations()
342 if (!(bg->flags & BTRFS_BLOCK_GROUP_DATA)) in btrfs_wait_block_group_reservations()
346 * Our block group is read only but before we set it to read only, in btrfs_wait_block_group_reservations()
351 * block group's reservations counter is incremented while a read lock in btrfs_wait_block_group_reservations()
355 down_write(&space_info->groups_sem); in btrfs_wait_block_group_reservations()
356 up_write(&space_info->groups_sem); in btrfs_wait_block_group_reservations()
358 wait_var_event(&bg->reservations, !atomic_read(&bg->reservations)); in btrfs_wait_block_group_reservations()
362 struct btrfs_block_group *cache) in btrfs_get_caching_control() argument
366 spin_lock(&cache->lock); in btrfs_get_caching_control()
367 if (!cache->caching_ctl) { in btrfs_get_caching_control()
368 spin_unlock(&cache->lock); in btrfs_get_caching_control()
372 ctl = cache->caching_ctl; in btrfs_get_caching_control()
373 refcount_inc(&ctl->count); in btrfs_get_caching_control()
374 spin_unlock(&cache->lock); in btrfs_get_caching_control()
380 if (refcount_dec_and_test(&ctl->count)) in btrfs_put_caching_control()
385 * When we wait for progress in the block group caching, its because our
390 * up, and then it will check the block group free space numbers for our min
392 * a free extent of a given size, but this is a good start.
394 * Callers of this must check if cache->cached == BTRFS_CACHE_ERROR before using
395 * any of the information in this block group.
397 void btrfs_wait_block_group_cache_progress(struct btrfs_block_group *cache, in btrfs_wait_block_group_cache_progress() argument
402 caching_ctl = btrfs_get_caching_control(cache); in btrfs_wait_block_group_cache_progress()
406 wait_event(caching_ctl->wait, btrfs_block_group_done(cache) || in btrfs_wait_block_group_cache_progress()
407 (cache->free_space_ctl->free_space >= num_bytes)); in btrfs_wait_block_group_cache_progress()
412 int btrfs_wait_block_group_cache_done(struct btrfs_block_group *cache) in btrfs_wait_block_group_cache_done() argument
417 caching_ctl = btrfs_get_caching_control(cache); in btrfs_wait_block_group_cache_done()
419 return (cache->cached == BTRFS_CACHE_ERROR) ? -EIO : 0; in btrfs_wait_block_group_cache_done()
421 wait_event(caching_ctl->wait, btrfs_block_group_done(cache)); in btrfs_wait_block_group_cache_done()
422 if (cache->cached == BTRFS_CACHE_ERROR) in btrfs_wait_block_group_cache_done()
423 ret = -EIO; in btrfs_wait_block_group_cache_done()
428 static bool space_cache_v1_done(struct btrfs_block_group *cache) in space_cache_v1_done() argument
432 spin_lock(&cache->lock); in space_cache_v1_done()
433 ret = cache->cached != BTRFS_CACHE_FAST; in space_cache_v1_done()
434 spin_unlock(&cache->lock); in space_cache_v1_done()
439 void btrfs_wait_space_cache_v1_finished(struct btrfs_block_group *cache, in btrfs_wait_space_cache_v1_finished() argument
442 wait_event(caching_ctl->wait, space_cache_v1_done(cache)); in btrfs_wait_space_cache_v1_finished()
448 struct btrfs_fs_info *fs_info = block_group->fs_info; in fragment_free_space()
449 u64 start = block_group->start; in fragment_free_space()
450 u64 len = block_group->length; in fragment_free_space()
451 u64 chunk = block_group->flags & BTRFS_BLOCK_GROUP_METADATA ? in fragment_free_space()
452 fs_info->nodesize : fs_info->sectorsize; in fragment_free_space()
461 len -= step; in fragment_free_space()
474 struct btrfs_fs_info *info = block_group->fs_info; in add_new_free_space()
475 u64 extent_start, extent_end, size, total_added = 0; in add_new_free_space() local
479 ret = find_first_extent_bit(&info->excluded_extents, start, in add_new_free_space()
489 size = extent_start - start; in add_new_free_space()
490 total_added += size; in add_new_free_space()
492 start, size); in add_new_free_space()
493 BUG_ON(ret); /* -ENOMEM or logic error */ in add_new_free_space()
501 size = end - start; in add_new_free_space()
502 total_added += size; in add_new_free_space()
504 size); in add_new_free_space()
505 BUG_ON(ret); /* -ENOMEM or logic error */ in add_new_free_space()
513 struct btrfs_block_group *block_group = caching_ctl->block_group; in load_extent_tree_free()
514 struct btrfs_fs_info *fs_info = block_group->fs_info; in load_extent_tree_free()
515 struct btrfs_root *extent_root = fs_info->extent_root; in load_extent_tree_free()
527 return -ENOMEM; in load_extent_tree_free()
529 last = max_t(u64, block_group->start, BTRFS_SUPER_INFO_OFFSET); in load_extent_tree_free()
534 * allocate from this block group until we've had a chance to fragment in load_extent_tree_free()
544 * root, since its read-only in load_extent_tree_free()
546 path->skip_locking = 1; in load_extent_tree_free()
547 path->search_commit_root = 1; in load_extent_tree_free()
548 path->reada = READA_FORWARD; in load_extent_tree_free()
559 leaf = path->nodes[0]; in load_extent_tree_free()
564 last = (u64)-1; in load_extent_tree_free()
568 if (path->slots[0] < nritems) { in load_extent_tree_free()
569 btrfs_item_key_to_cpu(leaf, &key, path->slots[0]); in load_extent_tree_free()
576 rwsem_is_contended(&fs_info->commit_root_sem)) { in load_extent_tree_free()
578 caching_ctl->progress = last; in load_extent_tree_free()
580 up_read(&fs_info->commit_root_sem); in load_extent_tree_free()
581 mutex_unlock(&caching_ctl->mutex); in load_extent_tree_free()
583 mutex_lock(&caching_ctl->mutex); in load_extent_tree_free()
584 down_read(&fs_info->commit_root_sem); in load_extent_tree_free()
593 leaf = path->nodes[0]; in load_extent_tree_free()
604 caching_ctl->progress = last; in load_extent_tree_free()
609 if (key.objectid < block_group->start) { in load_extent_tree_free()
610 path->slots[0]++; in load_extent_tree_free()
614 if (key.objectid >= block_group->start + block_group->length) in load_extent_tree_free()
623 fs_info->nodesize; in load_extent_tree_free()
630 wake_up(&caching_ctl->wait); in load_extent_tree_free()
633 path->slots[0]++; in load_extent_tree_free()
638 block_group->start + block_group->length); in load_extent_tree_free()
639 caching_ctl->progress = (u64)-1; in load_extent_tree_free()
654 block_group = caching_ctl->block_group; in caching_thread()
655 fs_info = block_group->fs_info; in caching_thread()
657 mutex_lock(&caching_ctl->mutex); in caching_thread()
658 down_read(&fs_info->commit_root_sem); in caching_thread()
668 * We failed to load the space cache, set ourselves to in caching_thread()
671 spin_lock(&block_group->lock); in caching_thread()
672 block_group->cached = BTRFS_CACHE_STARTED; in caching_thread()
673 spin_unlock(&block_group->lock); in caching_thread()
674 wake_up(&caching_ctl->wait); in caching_thread()
679 * can't actually cache from the free space tree as our commit root and in caching_thread()
685 !(test_bit(BTRFS_FS_FREE_SPACE_TREE_UNTRUSTED, &fs_info->flags))) in caching_thread()
690 spin_lock(&block_group->lock); in caching_thread()
691 block_group->caching_ctl = NULL; in caching_thread()
692 block_group->cached = ret ? BTRFS_CACHE_ERROR : BTRFS_CACHE_FINISHED; in caching_thread()
693 spin_unlock(&block_group->lock); in caching_thread()
699 spin_lock(&block_group->space_info->lock); in caching_thread()
700 spin_lock(&block_group->lock); in caching_thread()
701 bytes_used = block_group->length - block_group->used; in caching_thread()
702 block_group->space_info->bytes_used += bytes_used >> 1; in caching_thread()
703 spin_unlock(&block_group->lock); in caching_thread()
704 spin_unlock(&block_group->space_info->lock); in caching_thread()
709 caching_ctl->progress = (u64)-1; in caching_thread()
711 up_read(&fs_info->commit_root_sem); in caching_thread()
713 mutex_unlock(&caching_ctl->mutex); in caching_thread()
715 wake_up(&caching_ctl->wait); in caching_thread()
721 int btrfs_cache_block_group(struct btrfs_block_group *cache, int load_cache_only) in btrfs_cache_block_group() argument
724 struct btrfs_fs_info *fs_info = cache->fs_info; in btrfs_cache_block_group()
728 /* Allocator for zoned filesystems does not use the cache at all */ in btrfs_cache_block_group()
734 return -ENOMEM; in btrfs_cache_block_group()
736 INIT_LIST_HEAD(&caching_ctl->list); in btrfs_cache_block_group()
737 mutex_init(&caching_ctl->mutex); in btrfs_cache_block_group()
738 init_waitqueue_head(&caching_ctl->wait); in btrfs_cache_block_group()
739 caching_ctl->block_group = cache; in btrfs_cache_block_group()
740 caching_ctl->progress = cache->start; in btrfs_cache_block_group()
741 refcount_set(&caching_ctl->count, 2); in btrfs_cache_block_group()
742 btrfs_init_work(&caching_ctl->work, caching_thread, NULL, NULL); in btrfs_cache_block_group()
744 spin_lock(&cache->lock); in btrfs_cache_block_group()
745 if (cache->cached != BTRFS_CACHE_NO) { in btrfs_cache_block_group()
748 caching_ctl = cache->caching_ctl; in btrfs_cache_block_group()
750 refcount_inc(&caching_ctl->count); in btrfs_cache_block_group()
751 spin_unlock(&cache->lock); in btrfs_cache_block_group()
754 WARN_ON(cache->caching_ctl); in btrfs_cache_block_group()
755 cache->caching_ctl = caching_ctl; in btrfs_cache_block_group()
757 cache->cached = BTRFS_CACHE_FAST; in btrfs_cache_block_group()
759 cache->cached = BTRFS_CACHE_STARTED; in btrfs_cache_block_group()
760 cache->has_caching_ctl = 1; in btrfs_cache_block_group()
761 spin_unlock(&cache->lock); in btrfs_cache_block_group()
763 spin_lock(&fs_info->block_group_cache_lock); in btrfs_cache_block_group()
764 refcount_inc(&caching_ctl->count); in btrfs_cache_block_group()
765 list_add_tail(&caching_ctl->list, &fs_info->caching_block_groups); in btrfs_cache_block_group()
766 spin_unlock(&fs_info->block_group_cache_lock); in btrfs_cache_block_group()
768 btrfs_get_block_group(cache); in btrfs_cache_block_group()
770 btrfs_queue_work(fs_info->caching_workers, &caching_ctl->work); in btrfs_cache_block_group()
773 btrfs_wait_space_cache_v1_finished(cache, caching_ctl); in btrfs_cache_block_group()
785 write_seqlock(&fs_info->profiles_lock); in clear_avail_alloc_bits()
787 fs_info->avail_data_alloc_bits &= ~extra_flags; in clear_avail_alloc_bits()
789 fs_info->avail_metadata_alloc_bits &= ~extra_flags; in clear_avail_alloc_bits()
791 fs_info->avail_system_alloc_bits &= ~extra_flags; in clear_avail_alloc_bits()
792 write_sequnlock(&fs_info->profiles_lock); in clear_avail_alloc_bits()
798 * - RAID56 - in case there's neither RAID5 nor RAID6 profile block group
801 * - RAID1C34 - same as above for RAID1C3 and RAID1C4 block groups
811 struct list_head *head = &fs_info->space_info; in clear_incompat_bg_bits()
815 down_read(&sinfo->groups_sem); in clear_incompat_bg_bits()
816 if (!list_empty(&sinfo->block_groups[BTRFS_RAID_RAID5])) in clear_incompat_bg_bits()
818 if (!list_empty(&sinfo->block_groups[BTRFS_RAID_RAID6])) in clear_incompat_bg_bits()
820 if (!list_empty(&sinfo->block_groups[BTRFS_RAID_RAID1C3])) in clear_incompat_bg_bits()
822 if (!list_empty(&sinfo->block_groups[BTRFS_RAID_RAID1C4])) in clear_incompat_bg_bits()
824 up_read(&sinfo->groups_sem); in clear_incompat_bg_bits()
837 struct btrfs_fs_info *fs_info = trans->fs_info; in remove_block_group_item()
842 root = fs_info->extent_root; in remove_block_group_item()
843 key.objectid = block_group->start; in remove_block_group_item()
845 key.offset = block_group->length; in remove_block_group_item()
847 ret = btrfs_search_slot(trans, root, &key, path, -1, 1); in remove_block_group_item()
849 ret = -ENOENT; in remove_block_group_item()
860 struct btrfs_fs_info *fs_info = trans->fs_info; in btrfs_remove_block_group()
875 BUG_ON(!block_group->ro); in btrfs_remove_block_group()
879 * Free the reserved super bytes from this block group before in btrfs_remove_block_group()
883 btrfs_free_ref_tree_range(fs_info, block_group->start, in btrfs_remove_block_group()
884 block_group->length); in btrfs_remove_block_group()
886 index = btrfs_bg_flags_to_raid_index(block_group->flags); in btrfs_remove_block_group()
887 factor = btrfs_bg_type_to_factor(block_group->flags); in btrfs_remove_block_group()
889 /* make sure this block group isn't part of an allocation cluster */ in btrfs_remove_block_group()
890 cluster = &fs_info->data_alloc_cluster; in btrfs_remove_block_group()
891 spin_lock(&cluster->refill_lock); in btrfs_remove_block_group()
893 spin_unlock(&cluster->refill_lock); in btrfs_remove_block_group()
896 * make sure this block group isn't part of a metadata in btrfs_remove_block_group()
899 cluster = &fs_info->meta_alloc_cluster; in btrfs_remove_block_group()
900 spin_lock(&cluster->refill_lock); in btrfs_remove_block_group()
902 spin_unlock(&cluster->refill_lock); in btrfs_remove_block_group()
908 ret = -ENOMEM; in btrfs_remove_block_group()
918 mutex_lock(&trans->transaction->cache_write_mutex); in btrfs_remove_block_group()
920 * Make sure our free space cache IO is done before removing the in btrfs_remove_block_group()
923 spin_lock(&trans->transaction->dirty_bgs_lock); in btrfs_remove_block_group()
924 if (!list_empty(&block_group->io_list)) { in btrfs_remove_block_group()
925 list_del_init(&block_group->io_list); in btrfs_remove_block_group()
927 WARN_ON(!IS_ERR(inode) && inode != block_group->io_ctl.inode); in btrfs_remove_block_group()
929 spin_unlock(&trans->transaction->dirty_bgs_lock); in btrfs_remove_block_group()
932 spin_lock(&trans->transaction->dirty_bgs_lock); in btrfs_remove_block_group()
935 if (!list_empty(&block_group->dirty_list)) { in btrfs_remove_block_group()
936 list_del_init(&block_group->dirty_list); in btrfs_remove_block_group()
940 spin_unlock(&trans->transaction->dirty_bgs_lock); in btrfs_remove_block_group()
941 mutex_unlock(&trans->transaction->cache_write_mutex); in btrfs_remove_block_group()
947 spin_lock(&fs_info->block_group_cache_lock); in btrfs_remove_block_group()
948 rb_erase(&block_group->cache_node, in btrfs_remove_block_group()
949 &fs_info->block_group_cache_tree); in btrfs_remove_block_group()
950 RB_CLEAR_NODE(&block_group->cache_node); in btrfs_remove_block_group()
952 /* Once for the block groups rbtree */ in btrfs_remove_block_group()
955 if (fs_info->first_logical_byte == block_group->start) in btrfs_remove_block_group()
956 fs_info->first_logical_byte = (u64)-1; in btrfs_remove_block_group()
957 spin_unlock(&fs_info->block_group_cache_lock); in btrfs_remove_block_group()
959 down_write(&block_group->space_info->groups_sem); in btrfs_remove_block_group()
964 list_del_init(&block_group->list); in btrfs_remove_block_group()
965 if (list_empty(&block_group->space_info->block_groups[index])) { in btrfs_remove_block_group()
966 kobj = block_group->space_info->block_group_kobjs[index]; in btrfs_remove_block_group()
967 block_group->space_info->block_group_kobjs[index] = NULL; in btrfs_remove_block_group()
968 clear_avail_alloc_bits(fs_info, block_group->flags); in btrfs_remove_block_group()
970 up_write(&block_group->space_info->groups_sem); in btrfs_remove_block_group()
971 clear_incompat_bg_bits(fs_info, block_group->flags); in btrfs_remove_block_group()
977 if (block_group->has_caching_ctl) in btrfs_remove_block_group()
979 if (block_group->cached == BTRFS_CACHE_STARTED) in btrfs_remove_block_group()
981 if (block_group->has_caching_ctl) { in btrfs_remove_block_group()
982 spin_lock(&fs_info->block_group_cache_lock); in btrfs_remove_block_group()
987 &fs_info->caching_block_groups, list) in btrfs_remove_block_group()
988 if (ctl->block_group == block_group) { in btrfs_remove_block_group()
990 refcount_inc(&caching_ctl->count); in btrfs_remove_block_group()
995 list_del_init(&caching_ctl->list); in btrfs_remove_block_group()
996 spin_unlock(&fs_info->block_group_cache_lock); in btrfs_remove_block_group()
1004 spin_lock(&trans->transaction->dirty_bgs_lock); in btrfs_remove_block_group()
1005 WARN_ON(!list_empty(&block_group->dirty_list)); in btrfs_remove_block_group()
1006 WARN_ON(!list_empty(&block_group->io_list)); in btrfs_remove_block_group()
1007 spin_unlock(&trans->transaction->dirty_bgs_lock); in btrfs_remove_block_group()
1011 spin_lock(&block_group->space_info->lock); in btrfs_remove_block_group()
1012 list_del_init(&block_group->ro_list); in btrfs_remove_block_group()
1015 WARN_ON(block_group->space_info->total_bytes in btrfs_remove_block_group()
1016 < block_group->length); in btrfs_remove_block_group()
1017 WARN_ON(block_group->space_info->bytes_readonly in btrfs_remove_block_group()
1018 < block_group->length - block_group->zone_unusable); in btrfs_remove_block_group()
1019 WARN_ON(block_group->space_info->bytes_zone_unusable in btrfs_remove_block_group()
1020 < block_group->zone_unusable); in btrfs_remove_block_group()
1021 WARN_ON(block_group->space_info->disk_total in btrfs_remove_block_group()
1022 < block_group->length * factor); in btrfs_remove_block_group()
1024 block_group->space_info->total_bytes -= block_group->length; in btrfs_remove_block_group()
1025 block_group->space_info->bytes_readonly -= in btrfs_remove_block_group()
1026 (block_group->length - block_group->zone_unusable); in btrfs_remove_block_group()
1027 block_group->space_info->bytes_zone_unusable -= in btrfs_remove_block_group()
1028 block_group->zone_unusable; in btrfs_remove_block_group()
1029 block_group->space_info->disk_total -= block_group->length * factor; in btrfs_remove_block_group()
1031 spin_unlock(&block_group->space_info->lock); in btrfs_remove_block_group()
1034 * Remove the free space for the block group from the free space tree in btrfs_remove_block_group()
1035 * and the block group's item from the extent tree before marking the in btrfs_remove_block_group()
1036 * block group as removed. This is to prevent races with tasks that in btrfs_remove_block_group()
1037 * freeze and unfreeze a block group, this task and another task in btrfs_remove_block_group()
1038 * allocating a new block group - the unfreeze task ends up removing in btrfs_remove_block_group()
1039 * the block group's extent map before the task calling this function in btrfs_remove_block_group()
1040 * deletes the block group item from the extent tree, allowing for in btrfs_remove_block_group()
1041 * another task to attempt to create another block group with the same in btrfs_remove_block_group()
1042 * item key (and failing with -EEXIST and a transaction abort). in btrfs_remove_block_group()
1052 spin_lock(&block_group->lock); in btrfs_remove_block_group()
1053 block_group->removed = 1; in btrfs_remove_block_group()
1055 * At this point trimming or scrub can't start on this block group, in btrfs_remove_block_group()
1056 * because we removed the block group from the rbtree in btrfs_remove_block_group()
1057 * fs_info->block_group_cache_tree so no one can't find it anymore and in btrfs_remove_block_group()
1058 * even if someone already got this block group before we removed it in btrfs_remove_block_group()
1059 * from the rbtree, they have already incremented block_group->frozen - in btrfs_remove_block_group()
1064 * And we must not remove the extent map from the fs_info->mapping_tree in btrfs_remove_block_group()
1066 * ranges from being reused for a new block group. This is needed to in btrfs_remove_block_group()
1072 * allowing for new block groups to be created that can reuse the same in btrfs_remove_block_group()
1076 * is mounted with -odiscard. The same protections must remain in btrfs_remove_block_group()
1080 remove_em = (atomic_read(&block_group->frozen) == 0); in btrfs_remove_block_group()
1081 spin_unlock(&block_group->lock); in btrfs_remove_block_group()
1086 em_tree = &fs_info->mapping_tree; in btrfs_remove_block_group()
1087 write_lock(&em_tree->lock); in btrfs_remove_block_group()
1089 write_unlock(&em_tree->lock); in btrfs_remove_block_group()
1106 struct extent_map_tree *em_tree = &fs_info->mapping_tree; in btrfs_start_trans_remove_block_group()
1111 read_lock(&em_tree->lock); in btrfs_start_trans_remove_block_group()
1113 read_unlock(&em_tree->lock); in btrfs_start_trans_remove_block_group()
1114 ASSERT(em && em->start == chunk_offset); in btrfs_start_trans_remove_block_group()
1118 * to remove a block group (done at btrfs_remove_chunk() and at in btrfs_start_trans_remove_block_group()
1123 * 1 unit for deleting the block group item (located in the extent in btrfs_start_trans_remove_block_group()
1130 * In order to remove a block group we also need to reserve units in the in btrfs_start_trans_remove_block_group()
1135 map = em->map_lookup; in btrfs_start_trans_remove_block_group()
1136 num_items = 3 + map->num_stripes; in btrfs_start_trans_remove_block_group()
1139 return btrfs_start_transaction_fallback_global_rsv(fs_info->extent_root, in btrfs_start_trans_remove_block_group()
1144 * Mark block group @cache read-only, so later write won't happen to block
1145 * group @cache.
1147 * If @force is not set, this function will only mark the block group readonly
1148 * if we have enough free space (1M) in other metadata/system block groups.
1149 * If @force is not set, this function will mark the block group readonly
1152 * NOTE: This function doesn't care if other block groups can contain all the
1153 * data in this block group. That check should be done by relocation routine,
1156 static int inc_block_group_ro(struct btrfs_block_group *cache, int force) in inc_block_group_ro() argument
1158 struct btrfs_space_info *sinfo = cache->space_info; in inc_block_group_ro()
1160 int ret = -ENOSPC; in inc_block_group_ro()
1162 spin_lock(&sinfo->lock); in inc_block_group_ro()
1163 spin_lock(&cache->lock); in inc_block_group_ro()
1165 if (cache->swap_extents) { in inc_block_group_ro()
1166 ret = -ETXTBSY; in inc_block_group_ro()
1170 if (cache->ro) { in inc_block_group_ro()
1171 cache->ro++; in inc_block_group_ro()
1176 num_bytes = cache->length - cache->reserved - cache->pinned - in inc_block_group_ro()
1177 cache->bytes_super - cache->zone_unusable - cache->used; in inc_block_group_ro()
1185 } else if (sinfo->flags & BTRFS_BLOCK_GROUP_DATA) { in inc_block_group_ro()
1192 if (sinfo_used + num_bytes <= sinfo->total_bytes) in inc_block_group_ro()
1199 * leeway to allow us to mark this block group as read only. in inc_block_group_ro()
1201 if (btrfs_can_overcommit(cache->fs_info, sinfo, num_bytes, in inc_block_group_ro()
1207 sinfo->bytes_readonly += num_bytes; in inc_block_group_ro()
1208 if (btrfs_is_zoned(cache->fs_info)) { in inc_block_group_ro()
1210 sinfo->bytes_readonly += cache->zone_unusable; in inc_block_group_ro()
1211 sinfo->bytes_zone_unusable -= cache->zone_unusable; in inc_block_group_ro()
1212 cache->zone_unusable = 0; in inc_block_group_ro()
1214 cache->ro++; in inc_block_group_ro()
1215 list_add_tail(&cache->ro_list, &sinfo->ro_bgs); in inc_block_group_ro()
1218 spin_unlock(&cache->lock); in inc_block_group_ro()
1219 spin_unlock(&sinfo->lock); in inc_block_group_ro()
1220 if (ret == -ENOSPC && btrfs_test_opt(cache->fs_info, ENOSPC_DEBUG)) { in inc_block_group_ro()
1221 btrfs_info(cache->fs_info, in inc_block_group_ro()
1222 "unable to make block group %llu ro", cache->start); in inc_block_group_ro()
1223 btrfs_dump_space_info(cache->fs_info, cache->space_info, 0, 0); in inc_block_group_ro()
1231 struct btrfs_fs_info *fs_info = bg->fs_info; in clean_pinned_extents()
1233 const u64 start = bg->start; in clean_pinned_extents()
1234 const u64 end = start + bg->length - 1; in clean_pinned_extents()
1237 spin_lock(&fs_info->trans_lock); in clean_pinned_extents()
1238 if (trans->transaction->list.prev != &fs_info->trans_list) { in clean_pinned_extents()
1239 prev_trans = list_last_entry(&trans->transaction->list, in clean_pinned_extents()
1241 refcount_inc(&prev_trans->use_count); in clean_pinned_extents()
1243 spin_unlock(&fs_info->trans_lock); in clean_pinned_extents()
1249 * transaction N - 1, and have seen a range belonging to the block in clean_pinned_extents()
1250 * group in pinned_extents before we were able to clear the whole block in clean_pinned_extents()
1252 * the block group after we unpinned it from pinned_extents and removed in clean_pinned_extents()
1255 mutex_lock(&fs_info->unused_bg_unpin_mutex); in clean_pinned_extents()
1257 ret = clear_extent_bits(&prev_trans->pinned_extents, start, end, in clean_pinned_extents()
1263 ret = clear_extent_bits(&trans->transaction->pinned_extents, start, end, in clean_pinned_extents()
1266 mutex_unlock(&fs_info->unused_bg_unpin_mutex); in clean_pinned_extents()
1285 if (!test_bit(BTRFS_FS_OPEN, &fs_info->flags)) in btrfs_delete_unused_bgs()
1292 if (!mutex_trylock(&fs_info->reclaim_bgs_lock)) in btrfs_delete_unused_bgs()
1295 spin_lock(&fs_info->unused_bgs_lock); in btrfs_delete_unused_bgs()
1296 while (!list_empty(&fs_info->unused_bgs)) { in btrfs_delete_unused_bgs()
1299 block_group = list_first_entry(&fs_info->unused_bgs, in btrfs_delete_unused_bgs()
1302 list_del_init(&block_group->bg_list); in btrfs_delete_unused_bgs()
1304 space_info = block_group->space_info; in btrfs_delete_unused_bgs()
1310 spin_unlock(&fs_info->unused_bgs_lock); in btrfs_delete_unused_bgs()
1312 btrfs_discard_cancel_work(&fs_info->discard_ctl, block_group); in btrfs_delete_unused_bgs()
1315 down_write(&space_info->groups_sem); in btrfs_delete_unused_bgs()
1318 * Async discard moves the final block group discard to be prior in btrfs_delete_unused_bgs()
1325 up_write(&space_info->groups_sem); in btrfs_delete_unused_bgs()
1327 btrfs_discard_queue_work(&fs_info->discard_ctl, in btrfs_delete_unused_bgs()
1332 spin_lock(&block_group->lock); in btrfs_delete_unused_bgs()
1333 if (block_group->reserved || block_group->pinned || in btrfs_delete_unused_bgs()
1334 block_group->used || block_group->ro || in btrfs_delete_unused_bgs()
1335 list_is_singular(&block_group->list)) { in btrfs_delete_unused_bgs()
1338 * outstanding allocations in this block group. We do in btrfs_delete_unused_bgs()
1340 * this block group. in btrfs_delete_unused_bgs()
1343 spin_unlock(&block_group->lock); in btrfs_delete_unused_bgs()
1344 up_write(&space_info->groups_sem); in btrfs_delete_unused_bgs()
1347 spin_unlock(&block_group->lock); in btrfs_delete_unused_bgs()
1351 up_write(&space_info->groups_sem); in btrfs_delete_unused_bgs()
1362 block_group->start); in btrfs_delete_unused_bgs()
1370 * We could have pending pinned extents for this block group, in btrfs_delete_unused_bgs()
1385 spin_lock(&fs_info->discard_ctl.lock); in btrfs_delete_unused_bgs()
1386 if (!list_empty(&block_group->discard_list)) { in btrfs_delete_unused_bgs()
1387 spin_unlock(&fs_info->discard_ctl.lock); in btrfs_delete_unused_bgs()
1389 btrfs_discard_queue_work(&fs_info->discard_ctl, in btrfs_delete_unused_bgs()
1393 spin_unlock(&fs_info->discard_ctl.lock); in btrfs_delete_unused_bgs()
1396 spin_lock(&space_info->lock); in btrfs_delete_unused_bgs()
1397 spin_lock(&block_group->lock); in btrfs_delete_unused_bgs()
1400 -block_group->pinned); in btrfs_delete_unused_bgs()
1401 space_info->bytes_readonly += block_group->pinned; in btrfs_delete_unused_bgs()
1402 block_group->pinned = 0; in btrfs_delete_unused_bgs()
1404 spin_unlock(&block_group->lock); in btrfs_delete_unused_bgs()
1405 spin_unlock(&space_info->lock); in btrfs_delete_unused_bgs()
1408 * The normal path here is an unused block group is passed here, in btrfs_delete_unused_bgs()
1411 * before coming down the unused block group path as trimming in btrfs_delete_unused_bgs()
1419 * need to reset sequential-required zones. in btrfs_delete_unused_bgs()
1432 ret = btrfs_remove_chunk(trans, block_group->start); in btrfs_delete_unused_bgs()
1441 * If we're not mounted with -odiscard, we can just forget in btrfs_delete_unused_bgs()
1442 * about this block group. Otherwise we'll need to wait in btrfs_delete_unused_bgs()
1446 spin_lock(&fs_info->unused_bgs_lock); in btrfs_delete_unused_bgs()
1449 * fs_info->unused_bgs, so use a list_move operation in btrfs_delete_unused_bgs()
1450 * to add the block group to the deleted_bgs list. in btrfs_delete_unused_bgs()
1452 list_move(&block_group->bg_list, in btrfs_delete_unused_bgs()
1453 &trans->transaction->deleted_bgs); in btrfs_delete_unused_bgs()
1454 spin_unlock(&fs_info->unused_bgs_lock); in btrfs_delete_unused_bgs()
1461 spin_lock(&fs_info->unused_bgs_lock); in btrfs_delete_unused_bgs()
1463 spin_unlock(&fs_info->unused_bgs_lock); in btrfs_delete_unused_bgs()
1464 mutex_unlock(&fs_info->reclaim_bgs_lock); in btrfs_delete_unused_bgs()
1469 mutex_unlock(&fs_info->reclaim_bgs_lock); in btrfs_delete_unused_bgs()
1476 struct btrfs_fs_info *fs_info = bg->fs_info; in btrfs_mark_bg_unused()
1478 spin_lock(&fs_info->unused_bgs_lock); in btrfs_mark_bg_unused()
1479 if (list_empty(&bg->bg_list)) { in btrfs_mark_bg_unused()
1482 list_add_tail(&bg->bg_list, &fs_info->unused_bgs); in btrfs_mark_bg_unused()
1484 spin_unlock(&fs_info->unused_bgs_lock); in btrfs_mark_bg_unused()
1495 if (!test_bit(BTRFS_FS_OPEN, &fs_info->flags)) in btrfs_reclaim_bgs_work()
1505 if (!mutex_trylock(&fs_info->reclaim_bgs_lock)) { in btrfs_reclaim_bgs_work()
1510 spin_lock(&fs_info->unused_bgs_lock); in btrfs_reclaim_bgs_work()
1511 while (!list_empty(&fs_info->reclaim_bgs)) { in btrfs_reclaim_bgs_work()
1515 bg = list_first_entry(&fs_info->reclaim_bgs, in btrfs_reclaim_bgs_work()
1518 list_del_init(&bg->bg_list); in btrfs_reclaim_bgs_work()
1520 space_info = bg->space_info; in btrfs_reclaim_bgs_work()
1521 spin_unlock(&fs_info->unused_bgs_lock); in btrfs_reclaim_bgs_work()
1524 down_write(&space_info->groups_sem); in btrfs_reclaim_bgs_work()
1526 spin_lock(&bg->lock); in btrfs_reclaim_bgs_work()
1527 if (bg->reserved || bg->pinned || bg->ro) { in btrfs_reclaim_bgs_work()
1530 * outstanding allocations in this block group. We do in btrfs_reclaim_bgs_work()
1532 * this block group. in btrfs_reclaim_bgs_work()
1534 spin_unlock(&bg->lock); in btrfs_reclaim_bgs_work()
1535 up_write(&space_info->groups_sem); in btrfs_reclaim_bgs_work()
1538 spin_unlock(&bg->lock); in btrfs_reclaim_bgs_work()
1542 up_write(&space_info->groups_sem); in btrfs_reclaim_bgs_work()
1547 * Cache the zone_unusable value before turning the block group in btrfs_reclaim_bgs_work()
1549 * zone_unusable value gets moved to the block group's read-only in btrfs_reclaim_bgs_work()
1552 zone_unusable = bg->zone_unusable; in btrfs_reclaim_bgs_work()
1554 up_write(&space_info->groups_sem); in btrfs_reclaim_bgs_work()
1560 bg->start, div_u64(bg->used * 100, bg->length), in btrfs_reclaim_bgs_work()
1561 div64_u64(zone_unusable * 100, bg->length)); in btrfs_reclaim_bgs_work()
1563 ret = btrfs_relocate_chunk(fs_info, bg->start); in btrfs_reclaim_bgs_work()
1564 if (ret && ret != -EAGAIN) in btrfs_reclaim_bgs_work()
1566 bg->start); in btrfs_reclaim_bgs_work()
1569 spin_lock(&fs_info->unused_bgs_lock); in btrfs_reclaim_bgs_work()
1570 if (ret == -EAGAIN && list_empty(&bg->bg_list)) in btrfs_reclaim_bgs_work()
1571 list_add_tail(&bg->bg_list, &again_list); in btrfs_reclaim_bgs_work()
1575 list_splice_tail(&again_list, &fs_info->reclaim_bgs); in btrfs_reclaim_bgs_work()
1576 spin_unlock(&fs_info->unused_bgs_lock); in btrfs_reclaim_bgs_work()
1577 mutex_unlock(&fs_info->reclaim_bgs_lock); in btrfs_reclaim_bgs_work()
1583 spin_lock(&fs_info->unused_bgs_lock); in btrfs_reclaim_bgs()
1584 if (!list_empty(&fs_info->reclaim_bgs)) in btrfs_reclaim_bgs()
1585 queue_work(system_unbound_wq, &fs_info->reclaim_bgs_work); in btrfs_reclaim_bgs()
1586 spin_unlock(&fs_info->unused_bgs_lock); in btrfs_reclaim_bgs()
1591 struct btrfs_fs_info *fs_info = bg->fs_info; in btrfs_mark_bg_to_reclaim()
1593 spin_lock(&fs_info->unused_bgs_lock); in btrfs_mark_bg_to_reclaim()
1594 if (list_empty(&bg->bg_list)) { in btrfs_mark_bg_to_reclaim()
1597 list_add_tail(&bg->bg_list, &fs_info->reclaim_bgs); in btrfs_mark_bg_to_reclaim()
1599 spin_unlock(&fs_info->unused_bgs_lock); in btrfs_mark_bg_to_reclaim()
1613 slot = path->slots[0]; in read_bg_from_eb()
1614 leaf = path->nodes[0]; in read_bg_from_eb()
1616 em_tree = &fs_info->mapping_tree; in read_bg_from_eb()
1617 read_lock(&em_tree->lock); in read_bg_from_eb()
1618 em = lookup_extent_mapping(em_tree, key->objectid, key->offset); in read_bg_from_eb()
1619 read_unlock(&em_tree->lock); in read_bg_from_eb()
1623 key->objectid, key->offset); in read_bg_from_eb()
1624 return -ENOENT; in read_bg_from_eb()
1627 if (em->start != key->objectid || em->len != key->offset) { in read_bg_from_eb()
1629 "block group %llu len %llu mismatch with chunk %llu len %llu", in read_bg_from_eb()
1630 key->objectid, key->offset, em->start, em->len); in read_bg_from_eb()
1631 ret = -EUCLEAN; in read_bg_from_eb()
1640 if (flags != (em->map_lookup->type & BTRFS_BLOCK_GROUP_TYPE_MASK)) { in read_bg_from_eb()
1642 "block group %llu len %llu type flags 0x%llx mismatch with chunk type flags 0x%llx", in read_bg_from_eb()
1643 key->objectid, key->offset, flags, in read_bg_from_eb()
1644 (BTRFS_BLOCK_GROUP_TYPE_MASK & em->map_lookup->type)); in read_bg_from_eb()
1645 ret = -EUCLEAN; in read_bg_from_eb()
1657 struct btrfs_root *root = fs_info->extent_root; in find_first_block_group()
1668 slot = path->slots[0]; in find_first_block_group()
1669 leaf = path->nodes[0]; in find_first_block_group()
1680 if (found_key.objectid >= key->objectid && in find_first_block_group()
1686 path->slots[0]++; in find_first_block_group()
1697 write_seqlock(&fs_info->profiles_lock); in set_avail_alloc_bits()
1699 fs_info->avail_data_alloc_bits |= extra_flags; in set_avail_alloc_bits()
1701 fs_info->avail_metadata_alloc_bits |= extra_flags; in set_avail_alloc_bits()
1703 fs_info->avail_system_alloc_bits |= extra_flags; in set_avail_alloc_bits()
1704 write_sequnlock(&fs_info->profiles_lock); in set_avail_alloc_bits()
1711 * @chunk_start: logical address of block group
1716 * @stripe_len: size of IO stripe for the given block group
1719 * Used primarily to exclude those portions of a block group that contain super
1720 * block copies.
1737 return -EIO; in btrfs_rmap_block()
1739 map = em->map_lookup; in btrfs_rmap_block()
1740 data_stripe_length = em->orig_block_len; in btrfs_rmap_block()
1741 io_stripe_size = map->stripe_len; in btrfs_rmap_block()
1742 chunk_start = em->start; in btrfs_rmap_block()
1745 if (map->type & BTRFS_BLOCK_GROUP_RAID56_MASK) in btrfs_rmap_block()
1746 io_stripe_size = map->stripe_len * nr_data_stripes(map); in btrfs_rmap_block()
1748 buf = kcalloc(map->num_stripes, sizeof(u64), GFP_NOFS); in btrfs_rmap_block()
1750 ret = -ENOMEM; in btrfs_rmap_block()
1754 for (i = 0; i < map->num_stripes; i++) { in btrfs_rmap_block()
1760 if (!in_range(physical, map->stripes[i].physical, in btrfs_rmap_block()
1764 if (bdev && map->stripes[i].dev->bdev != bdev) in btrfs_rmap_block()
1767 stripe_nr = physical - map->stripes[i].physical; in btrfs_rmap_block()
1768 stripe_nr = div64_u64_rem(stripe_nr, map->stripe_len, &offset); in btrfs_rmap_block()
1770 if (map->type & BTRFS_BLOCK_GROUP_RAID10) { in btrfs_rmap_block()
1771 stripe_nr = stripe_nr * map->num_stripes + i; in btrfs_rmap_block()
1772 stripe_nr = div_u64(stripe_nr, map->sub_stripes); in btrfs_rmap_block()
1773 } else if (map->type & BTRFS_BLOCK_GROUP_RAID0) { in btrfs_rmap_block()
1774 stripe_nr = stripe_nr * map->num_stripes + i; in btrfs_rmap_block()
1779 * instead of map->stripe_len in btrfs_rmap_block()
1804 static int exclude_super_stripes(struct btrfs_block_group *cache) in exclude_super_stripes() argument
1806 struct btrfs_fs_info *fs_info = cache->fs_info; in exclude_super_stripes()
1813 if (cache->start < BTRFS_SUPER_INFO_OFFSET) { in exclude_super_stripes()
1814 stripe_len = BTRFS_SUPER_INFO_OFFSET - cache->start; in exclude_super_stripes()
1815 cache->bytes_super += stripe_len; in exclude_super_stripes()
1816 ret = btrfs_add_excluded_extent(fs_info, cache->start, in exclude_super_stripes()
1824 ret = btrfs_rmap_block(fs_info, cache->start, NULL, in exclude_super_stripes()
1832 "zoned: block group %llu must not contain super block", in exclude_super_stripes()
1833 cache->start); in exclude_super_stripes()
1834 return -EUCLEAN; in exclude_super_stripes()
1837 while (nr--) { in exclude_super_stripes()
1839 cache->start + cache->length - logical[nr]); in exclude_super_stripes()
1841 cache->bytes_super += len; in exclude_super_stripes()
1855 static void link_block_group(struct btrfs_block_group *cache) in link_block_group() argument
1857 struct btrfs_space_info *space_info = cache->space_info; in link_block_group()
1858 int index = btrfs_bg_flags_to_raid_index(cache->flags); in link_block_group()
1860 down_write(&space_info->groups_sem); in link_block_group()
1861 list_add_tail(&cache->list, &space_info->block_groups[index]); in link_block_group()
1862 up_write(&space_info->groups_sem); in link_block_group()
1868 struct btrfs_block_group *cache; in btrfs_create_block_group_cache() local
1870 cache = kzalloc(sizeof(*cache), GFP_NOFS); in btrfs_create_block_group_cache()
1871 if (!cache) in btrfs_create_block_group_cache()
1874 cache->free_space_ctl = kzalloc(sizeof(*cache->free_space_ctl), in btrfs_create_block_group_cache()
1876 if (!cache->free_space_ctl) { in btrfs_create_block_group_cache()
1877 kfree(cache); in btrfs_create_block_group_cache()
1881 cache->start = start; in btrfs_create_block_group_cache()
1883 cache->fs_info = fs_info; in btrfs_create_block_group_cache()
1884 cache->full_stripe_len = btrfs_full_stripe_len(fs_info, start); in btrfs_create_block_group_cache()
1886 cache->discard_index = BTRFS_DISCARD_INDEX_UNUSED; in btrfs_create_block_group_cache()
1888 refcount_set(&cache->refs, 1); in btrfs_create_block_group_cache()
1889 spin_lock_init(&cache->lock); in btrfs_create_block_group_cache()
1890 init_rwsem(&cache->data_rwsem); in btrfs_create_block_group_cache()
1891 INIT_LIST_HEAD(&cache->list); in btrfs_create_block_group_cache()
1892 INIT_LIST_HEAD(&cache->cluster_list); in btrfs_create_block_group_cache()
1893 INIT_LIST_HEAD(&cache->bg_list); in btrfs_create_block_group_cache()
1894 INIT_LIST_HEAD(&cache->ro_list); in btrfs_create_block_group_cache()
1895 INIT_LIST_HEAD(&cache->discard_list); in btrfs_create_block_group_cache()
1896 INIT_LIST_HEAD(&cache->dirty_list); in btrfs_create_block_group_cache()
1897 INIT_LIST_HEAD(&cache->io_list); in btrfs_create_block_group_cache()
1898 btrfs_init_free_space_ctl(cache, cache->free_space_ctl); in btrfs_create_block_group_cache()
1899 atomic_set(&cache->frozen, 0); in btrfs_create_block_group_cache()
1900 mutex_init(&cache->free_space_lock); in btrfs_create_block_group_cache()
1901 btrfs_init_full_stripe_locks_tree(&cache->full_stripe_locks_root); in btrfs_create_block_group_cache()
1903 return cache; in btrfs_create_block_group_cache()
1907 * Iterate all chunks and verify that each of them has the corresponding block
1912 struct extent_map_tree *map_tree = &fs_info->mapping_tree; in check_chunk_block_group_mappings()
1919 read_lock(&map_tree->lock); in check_chunk_block_group_mappings()
1926 read_unlock(&map_tree->lock); in check_chunk_block_group_mappings()
1930 bg = btrfs_lookup_block_group(fs_info, em->start); in check_chunk_block_group_mappings()
1933 "chunk start=%llu len=%llu doesn't have corresponding block group", in check_chunk_block_group_mappings()
1934 em->start, em->len); in check_chunk_block_group_mappings()
1935 ret = -EUCLEAN; in check_chunk_block_group_mappings()
1939 if (bg->start != em->start || bg->length != em->len || in check_chunk_block_group_mappings()
1940 (bg->flags & BTRFS_BLOCK_GROUP_TYPE_MASK) != in check_chunk_block_group_mappings()
1941 (em->map_lookup->type & BTRFS_BLOCK_GROUP_TYPE_MASK)) { in check_chunk_block_group_mappings()
1943 "chunk start=%llu len=%llu flags=0x%llx doesn't match block group start=%llu len=%llu flags=0x%llx", in check_chunk_block_group_mappings()
1944 em->start, em->len, in check_chunk_block_group_mappings()
1945 em->map_lookup->type & BTRFS_BLOCK_GROUP_TYPE_MASK, in check_chunk_block_group_mappings()
1946 bg->start, bg->length, in check_chunk_block_group_mappings()
1947 bg->flags & BTRFS_BLOCK_GROUP_TYPE_MASK); in check_chunk_block_group_mappings()
1948 ret = -EUCLEAN; in check_chunk_block_group_mappings()
1953 start = em->start + em->len; in check_chunk_block_group_mappings()
1965 struct btrfs_block_group *cache; in read_one_block_group() local
1970 ASSERT(key->type == BTRFS_BLOCK_GROUP_ITEM_KEY); in read_one_block_group()
1972 cache = btrfs_create_block_group_cache(info, key->objectid); in read_one_block_group()
1973 if (!cache) in read_one_block_group()
1974 return -ENOMEM; in read_one_block_group()
1976 cache->length = key->offset; in read_one_block_group()
1977 cache->used = btrfs_stack_block_group_used(bgi); in read_one_block_group()
1978 cache->flags = btrfs_stack_block_group_flags(bgi); in read_one_block_group()
1980 set_free_space_tree_thresholds(cache); in read_one_block_group()
1984 * When we mount with old space cache, we need to in read_one_block_group()
1988 * truncate the old free space cache inode and in read_one_block_group()
1991 * the new space cache info onto disk. in read_one_block_group()
1994 cache->disk_cache_state = BTRFS_DC_CLEAR; in read_one_block_group()
1996 if (!mixed && ((cache->flags & BTRFS_BLOCK_GROUP_METADATA) && in read_one_block_group()
1997 (cache->flags & BTRFS_BLOCK_GROUP_DATA))) { in read_one_block_group()
1999 "bg %llu is a mixed block group but filesystem hasn't enabled mixed block groups", in read_one_block_group()
2000 cache->start); in read_one_block_group()
2001 ret = -EINVAL; in read_one_block_group()
2005 ret = btrfs_load_block_group_zone_info(cache, false); in read_one_block_group()
2008 cache->start); in read_one_block_group()
2017 ret = exclude_super_stripes(cache); in read_one_block_group()
2020 btrfs_free_excluded_extents(cache); in read_one_block_group()
2026 * free space for a block group. So, we don't need any caching work. in read_one_block_group()
2037 btrfs_calc_zone_unusable(cache); in read_one_block_group()
2038 } else if (cache->length == cache->used) { in read_one_block_group()
2039 cache->last_byte_to_unpin = (u64)-1; in read_one_block_group()
2040 cache->cached = BTRFS_CACHE_FINISHED; in read_one_block_group()
2041 btrfs_free_excluded_extents(cache); in read_one_block_group()
2042 } else if (cache->used == 0) { in read_one_block_group()
2043 cache->last_byte_to_unpin = (u64)-1; in read_one_block_group()
2044 cache->cached = BTRFS_CACHE_FINISHED; in read_one_block_group()
2045 add_new_free_space(cache, cache->start, in read_one_block_group()
2046 cache->start + cache->length); in read_one_block_group()
2047 btrfs_free_excluded_extents(cache); in read_one_block_group()
2050 ret = btrfs_add_block_group_cache(info, cache); in read_one_block_group()
2052 btrfs_remove_free_space_cache(cache); in read_one_block_group()
2055 trace_btrfs_add_block_group(info, cache, 0); in read_one_block_group()
2056 btrfs_update_space_info(info, cache->flags, cache->length, in read_one_block_group()
2057 cache->used, cache->bytes_super, in read_one_block_group()
2058 cache->zone_unusable, &space_info); in read_one_block_group()
2060 cache->space_info = space_info; in read_one_block_group()
2062 link_block_group(cache); in read_one_block_group()
2064 set_avail_alloc_bits(info, cache->flags); in read_one_block_group()
2065 if (btrfs_chunk_readonly(info, cache->start)) { in read_one_block_group()
2066 inc_block_group_ro(cache, 1); in read_one_block_group()
2067 } else if (cache->used == 0) { in read_one_block_group()
2068 ASSERT(list_empty(&cache->bg_list)); in read_one_block_group()
2070 btrfs_discard_queue_work(&info->discard_ctl, cache); in read_one_block_group()
2072 btrfs_mark_bg_unused(cache); in read_one_block_group()
2076 btrfs_put_block_group(cache); in read_one_block_group()
2082 struct extent_map_tree *em_tree = &fs_info->mapping_tree; in fill_dummy_bgs()
2087 for (node = rb_first_cached(&em_tree->map); node; node = rb_next(node)) { in fill_dummy_bgs()
2093 map = em->map_lookup; in fill_dummy_bgs()
2094 bg = btrfs_create_block_group_cache(fs_info, em->start); in fill_dummy_bgs()
2096 ret = -ENOMEM; in fill_dummy_bgs()
2100 /* Fill dummy cache as FULL */ in fill_dummy_bgs()
2101 bg->length = em->len; in fill_dummy_bgs()
2102 bg->flags = map->type; in fill_dummy_bgs()
2103 bg->last_byte_to_unpin = (u64)-1; in fill_dummy_bgs()
2104 bg->cached = BTRFS_CACHE_FINISHED; in fill_dummy_bgs()
2105 bg->used = em->len; in fill_dummy_bgs()
2106 bg->flags = map->type; in fill_dummy_bgs()
2109 * We may have some valid block group cache added already, in in fill_dummy_bgs()
2112 if (ret == -EEXIST) { in fill_dummy_bgs()
2124 btrfs_update_space_info(fs_info, bg->flags, em->len, em->len, in fill_dummy_bgs()
2126 bg->space_info = space_info; in fill_dummy_bgs()
2129 set_avail_alloc_bits(fs_info, bg->flags); in fill_dummy_bgs()
2140 struct btrfs_block_group *cache; in btrfs_read_block_groups() local
2146 if (!info->extent_root) in btrfs_read_block_groups()
2154 return -ENOMEM; in btrfs_read_block_groups()
2156 cache_gen = btrfs_super_cache_generation(info->super_copy); in btrfs_read_block_groups()
2158 btrfs_super_generation(info->super_copy) != cache_gen) in btrfs_read_block_groups()
2174 leaf = path->nodes[0]; in btrfs_read_block_groups()
2175 slot = path->slots[0]; in btrfs_read_block_groups()
2190 list_for_each_entry(space_info, &info->space_info, list) { in btrfs_read_block_groups()
2194 if (list_empty(&space_info->block_groups[i])) in btrfs_read_block_groups()
2196 cache = list_first_entry(&space_info->block_groups[i], in btrfs_read_block_groups()
2199 btrfs_sysfs_add_block_group_type(cache); in btrfs_read_block_groups()
2202 if (!(btrfs_get_alloc_profile(info, space_info->flags) & in btrfs_read_block_groups()
2209 * Avoid allocating from un-mirrored block group if there are in btrfs_read_block_groups()
2210 * mirrored block groups. in btrfs_read_block_groups()
2212 list_for_each_entry(cache, in btrfs_read_block_groups()
2213 &space_info->block_groups[BTRFS_RAID_RAID0], in btrfs_read_block_groups()
2215 inc_block_group_ro(cache, 1); in btrfs_read_block_groups()
2216 list_for_each_entry(cache, in btrfs_read_block_groups()
2217 &space_info->block_groups[BTRFS_RAID_SINGLE], in btrfs_read_block_groups()
2219 inc_block_group_ro(cache, 1); in btrfs_read_block_groups()
2229 * Try to fill the tree using dummy block groups so that the user can in btrfs_read_block_groups()
2247 struct btrfs_fs_info *fs_info = trans->fs_info; in insert_block_group_item()
2252 spin_lock(&block_group->lock); in insert_block_group_item()
2253 btrfs_set_stack_block_group_used(&bgi, block_group->used); in insert_block_group_item()
2256 btrfs_set_stack_block_group_flags(&bgi, block_group->flags); in insert_block_group_item()
2257 key.objectid = block_group->start; in insert_block_group_item()
2259 key.offset = block_group->length; in insert_block_group_item()
2260 spin_unlock(&block_group->lock); in insert_block_group_item()
2262 root = fs_info->extent_root; in insert_block_group_item()
2270 struct btrfs_fs_info *fs_info = device->fs_info; in insert_dev_extent()
2271 struct btrfs_root *root = fs_info->dev_root; in insert_dev_extent()
2278 WARN_ON(!test_bit(BTRFS_DEV_STATE_IN_FS_METADATA, &device->dev_state)); in insert_dev_extent()
2279 WARN_ON(test_bit(BTRFS_DEV_STATE_REPLACE_TGT, &device->dev_state)); in insert_dev_extent()
2282 return -ENOMEM; in insert_dev_extent()
2284 key.objectid = device->devid; in insert_dev_extent()
2291 leaf = path->nodes[0]; in insert_dev_extent()
2292 extent = btrfs_item_ptr(leaf, path->slots[0], struct btrfs_dev_extent); in insert_dev_extent()
2314 struct btrfs_fs_info *fs_info = trans->fs_info; in insert_dev_extents()
2327 map = em->map_lookup; in insert_dev_extents()
2328 stripe_size = em->orig_block_len; in insert_dev_extents()
2335 * (dev-replace.c:btrfs_dev_replace_finishing()), so we could grab the in insert_dev_extents()
2339 mutex_lock(&fs_info->fs_devices->device_list_mutex); in insert_dev_extents()
2340 for (i = 0; i < map->num_stripes; i++) { in insert_dev_extents()
2341 device = map->stripes[i].dev; in insert_dev_extents()
2342 dev_offset = map->stripes[i].physical; in insert_dev_extents()
2349 mutex_unlock(&fs_info->fs_devices->device_list_mutex); in insert_dev_extents()
2364 struct btrfs_fs_info *fs_info = trans->fs_info; in btrfs_create_pending_block_groups()
2368 while (!list_empty(&trans->new_bgs)) { in btrfs_create_pending_block_groups()
2371 block_group = list_first_entry(&trans->new_bgs, in btrfs_create_pending_block_groups()
2377 index = btrfs_bg_flags_to_raid_index(block_group->flags); in btrfs_create_pending_block_groups()
2382 if (!block_group->chunk_item_inserted) { in btrfs_create_pending_block_groups()
2383 mutex_lock(&fs_info->chunk_mutex); in btrfs_create_pending_block_groups()
2385 mutex_unlock(&fs_info->chunk_mutex); in btrfs_create_pending_block_groups()
2389 ret = insert_dev_extents(trans, block_group->start, in btrfs_create_pending_block_groups()
2390 block_group->length); in btrfs_create_pending_block_groups()
2401 if (block_group->space_info->block_group_kobjs[index] == NULL) in btrfs_create_pending_block_groups()
2407 list_del_init(&block_group->bg_list); in btrfs_create_pending_block_groups()
2414 u64 chunk_offset, u64 size) in btrfs_make_block_group() argument
2416 struct btrfs_fs_info *fs_info = trans->fs_info; in btrfs_make_block_group()
2417 struct btrfs_block_group *cache; in btrfs_make_block_group() local
2422 cache = btrfs_create_block_group_cache(fs_info, chunk_offset); in btrfs_make_block_group()
2423 if (!cache) in btrfs_make_block_group()
2424 return ERR_PTR(-ENOMEM); in btrfs_make_block_group()
2426 cache->length = size; in btrfs_make_block_group()
2427 set_free_space_tree_thresholds(cache); in btrfs_make_block_group()
2428 cache->used = bytes_used; in btrfs_make_block_group()
2429 cache->flags = type; in btrfs_make_block_group()
2430 cache->last_byte_to_unpin = (u64)-1; in btrfs_make_block_group()
2431 cache->cached = BTRFS_CACHE_FINISHED; in btrfs_make_block_group()
2433 cache->needs_free_space = 1; in btrfs_make_block_group()
2435 ret = btrfs_load_block_group_zone_info(cache, true); in btrfs_make_block_group()
2437 btrfs_put_block_group(cache); in btrfs_make_block_group()
2441 ret = exclude_super_stripes(cache); in btrfs_make_block_group()
2444 btrfs_free_excluded_extents(cache); in btrfs_make_block_group()
2445 btrfs_put_block_group(cache); in btrfs_make_block_group()
2449 add_new_free_space(cache, chunk_offset, chunk_offset + size); in btrfs_make_block_group()
2451 btrfs_free_excluded_extents(cache); in btrfs_make_block_group()
2454 if (btrfs_should_fragment_free_space(cache)) { in btrfs_make_block_group()
2455 u64 new_bytes_used = size - bytes_used; in btrfs_make_block_group()
2458 fragment_free_space(cache); in btrfs_make_block_group()
2463 * assigned to our block group. We want our bg to be added to the rbtree in btrfs_make_block_group()
2464 * with its ->space_info set. in btrfs_make_block_group()
2466 cache->space_info = btrfs_find_space_info(fs_info, cache->flags); in btrfs_make_block_group()
2467 ASSERT(cache->space_info); in btrfs_make_block_group()
2469 ret = btrfs_add_block_group_cache(fs_info, cache); in btrfs_make_block_group()
2471 btrfs_remove_free_space_cache(cache); in btrfs_make_block_group()
2472 btrfs_put_block_group(cache); in btrfs_make_block_group()
2477 * Now that our block group has its ->space_info set and is inserted in in btrfs_make_block_group()
2480 trace_btrfs_add_block_group(fs_info, cache, 1); in btrfs_make_block_group()
2481 btrfs_update_space_info(fs_info, cache->flags, size, bytes_used, in btrfs_make_block_group()
2482 cache->bytes_super, 0, &cache->space_info); in btrfs_make_block_group()
2485 link_block_group(cache); in btrfs_make_block_group()
2487 list_add_tail(&cache->bg_list, &trans->new_bgs); in btrfs_make_block_group()
2488 trans->delayed_ref_updates++; in btrfs_make_block_group()
2492 return cache; in btrfs_make_block_group()
2496 * Mark one block group RO, can be called several times for the same block
2499 * @cache: the destination block group
2500 * @do_chunk_alloc: whether need to do chunk pre-allocation, this is to
2502 * block group RO.
2504 int btrfs_inc_block_group_ro(struct btrfs_block_group *cache, in btrfs_inc_block_group_ro() argument
2507 struct btrfs_fs_info *fs_info = cache->fs_info; in btrfs_inc_block_group_ro()
2514 trans = btrfs_join_transaction(fs_info->extent_root); in btrfs_inc_block_group_ro()
2521 * We're not allowed to set block groups readonly after the dirty in btrfs_inc_block_group_ro()
2522 * block group cache has started writing. If it already started, in btrfs_inc_block_group_ro()
2525 mutex_lock(&fs_info->ro_block_group_mutex); in btrfs_inc_block_group_ro()
2526 if (test_bit(BTRFS_TRANS_DIRTY_BG_RUN, &trans->transaction->flags)) { in btrfs_inc_block_group_ro()
2527 u64 transid = trans->transid; in btrfs_inc_block_group_ro()
2529 mutex_unlock(&fs_info->ro_block_group_mutex); in btrfs_inc_block_group_ro()
2542 * corresponding block group with the new raid level. in btrfs_inc_block_group_ro()
2544 alloc_flags = btrfs_get_alloc_profile(fs_info, cache->flags); in btrfs_inc_block_group_ro()
2545 if (alloc_flags != cache->flags) { in btrfs_inc_block_group_ro()
2552 if (ret == -ENOSPC) in btrfs_inc_block_group_ro()
2559 ret = inc_block_group_ro(cache, 0); in btrfs_inc_block_group_ro()
2560 if (!do_chunk_alloc || ret == -ETXTBSY) in btrfs_inc_block_group_ro()
2564 alloc_flags = btrfs_get_alloc_profile(fs_info, cache->space_info->flags); in btrfs_inc_block_group_ro()
2568 ret = inc_block_group_ro(cache, 0); in btrfs_inc_block_group_ro()
2569 if (ret == -ETXTBSY) in btrfs_inc_block_group_ro()
2572 if (cache->flags & BTRFS_BLOCK_GROUP_SYSTEM) { in btrfs_inc_block_group_ro()
2573 alloc_flags = btrfs_get_alloc_profile(fs_info, cache->flags); in btrfs_inc_block_group_ro()
2574 mutex_lock(&fs_info->chunk_mutex); in btrfs_inc_block_group_ro()
2576 mutex_unlock(&fs_info->chunk_mutex); in btrfs_inc_block_group_ro()
2579 mutex_unlock(&fs_info->ro_block_group_mutex); in btrfs_inc_block_group_ro()
2585 void btrfs_dec_block_group_ro(struct btrfs_block_group *cache) in btrfs_dec_block_group_ro() argument
2587 struct btrfs_space_info *sinfo = cache->space_info; in btrfs_dec_block_group_ro()
2590 BUG_ON(!cache->ro); in btrfs_dec_block_group_ro()
2592 spin_lock(&sinfo->lock); in btrfs_dec_block_group_ro()
2593 spin_lock(&cache->lock); in btrfs_dec_block_group_ro()
2594 if (!--cache->ro) { in btrfs_dec_block_group_ro()
2595 if (btrfs_is_zoned(cache->fs_info)) { in btrfs_dec_block_group_ro()
2597 cache->zone_unusable = cache->alloc_offset - cache->used; in btrfs_dec_block_group_ro()
2598 sinfo->bytes_zone_unusable += cache->zone_unusable; in btrfs_dec_block_group_ro()
2599 sinfo->bytes_readonly -= cache->zone_unusable; in btrfs_dec_block_group_ro()
2601 num_bytes = cache->length - cache->reserved - in btrfs_dec_block_group_ro()
2602 cache->pinned - cache->bytes_super - in btrfs_dec_block_group_ro()
2603 cache->zone_unusable - cache->used; in btrfs_dec_block_group_ro()
2604 sinfo->bytes_readonly -= num_bytes; in btrfs_dec_block_group_ro()
2605 list_del_init(&cache->ro_list); in btrfs_dec_block_group_ro()
2607 spin_unlock(&cache->lock); in btrfs_dec_block_group_ro()
2608 spin_unlock(&sinfo->lock); in btrfs_dec_block_group_ro()
2613 struct btrfs_block_group *cache) in update_block_group_item() argument
2615 struct btrfs_fs_info *fs_info = trans->fs_info; in update_block_group_item()
2617 struct btrfs_root *root = fs_info->extent_root; in update_block_group_item()
2623 key.objectid = cache->start; in update_block_group_item()
2625 key.offset = cache->length; in update_block_group_item()
2630 ret = -ENOENT; in update_block_group_item()
2634 leaf = path->nodes[0]; in update_block_group_item()
2635 bi = btrfs_item_ptr_offset(leaf, path->slots[0]); in update_block_group_item()
2636 btrfs_set_stack_block_group_used(&bgi, cache->used); in update_block_group_item()
2639 btrfs_set_stack_block_group_flags(&bgi, cache->flags); in update_block_group_item()
2652 struct btrfs_fs_info *fs_info = block_group->fs_info; in cache_save_setup()
2653 struct btrfs_root *root = fs_info->tree_root; in cache_save_setup()
2666 * If this block group is smaller than 100 megs don't bother caching the in cache_save_setup()
2667 * block group. in cache_save_setup()
2669 if (block_group->length < (100 * SZ_1M)) { in cache_save_setup()
2670 spin_lock(&block_group->lock); in cache_save_setup()
2671 block_group->disk_cache_state = BTRFS_DC_WRITTEN; in cache_save_setup()
2672 spin_unlock(&block_group->lock); in cache_save_setup()
2680 if (IS_ERR(inode) && PTR_ERR(inode) != -ENOENT) { in cache_save_setup()
2690 if (block_group->ro) in cache_save_setup()
2701 * from here on out we know not to trust this cache when we load up next in cache_save_setup()
2704 BTRFS_I(inode)->generation = 0; in cache_save_setup()
2709 * super cache generation to 0 so we know to invalidate the in cache_save_setup()
2710 * cache, but then we'd have to keep track of the block groups in cache_save_setup()
2711 * that fail this way so we know we _have_ to reset this cache in cache_save_setup()
2712 * before the next commit or risk reading stale cache. So to in cache_save_setup()
2723 if (block_group->cache_generation == trans->transid && in cache_save_setup()
2731 &fs_info->global_block_rsv); in cache_save_setup()
2740 spin_lock(&block_group->lock); in cache_save_setup()
2741 if (block_group->cached != BTRFS_CACHE_FINISHED || in cache_save_setup()
2750 spin_unlock(&block_group->lock); in cache_save_setup()
2753 spin_unlock(&block_group->lock); in cache_save_setup()
2756 * We hit an ENOSPC when setting up the cache in this transaction, just in cache_save_setup()
2757 * skip doing the setup, we've already cleared the cache so we're safe. in cache_save_setup()
2759 if (test_bit(BTRFS_TRANS_CACHE_ENOSPC, &trans->transaction->flags)) { in cache_save_setup()
2760 ret = -ENOSPC; in cache_save_setup()
2765 * Try to preallocate enough space based on how big the block group is. in cache_save_setup()
2768 * cache. in cache_save_setup()
2770 cache_size = div_u64(block_group->length, SZ_256M); in cache_save_setup()
2775 cache_size *= fs_info->sectorsize; in cache_save_setup()
2786 * Our cache requires contiguous chunks so that we don't modify a bunch in cache_save_setup()
2787 * of metadata or split extents when writing the cache out, which means in cache_save_setup()
2790 * other block groups for this transaction, maybe we'll unpin enough in cache_save_setup()
2795 else if (ret == -ENOSPC) in cache_save_setup()
2796 set_bit(BTRFS_TRANS_CACHE_ENOSPC, &trans->transaction->flags); in cache_save_setup()
2803 spin_lock(&block_group->lock); in cache_save_setup()
2805 block_group->cache_generation = trans->transid; in cache_save_setup()
2806 block_group->disk_cache_state = dcs; in cache_save_setup()
2807 spin_unlock(&block_group->lock); in cache_save_setup()
2815 struct btrfs_fs_info *fs_info = trans->fs_info; in btrfs_setup_space_cache()
2816 struct btrfs_block_group *cache, *tmp; in btrfs_setup_space_cache() local
2817 struct btrfs_transaction *cur_trans = trans->transaction; in btrfs_setup_space_cache()
2820 if (list_empty(&cur_trans->dirty_bgs) || in btrfs_setup_space_cache()
2826 return -ENOMEM; in btrfs_setup_space_cache()
2828 /* Could add new block groups, use _safe just in case */ in btrfs_setup_space_cache()
2829 list_for_each_entry_safe(cache, tmp, &cur_trans->dirty_bgs, in btrfs_setup_space_cache()
2831 if (cache->disk_cache_state == BTRFS_DC_CLEAR) in btrfs_setup_space_cache()
2832 cache_save_setup(cache, trans, path); in btrfs_setup_space_cache()
2840 * Transaction commit does final block group cache writeback during a critical
2842 * order for the cache to actually match the block group, but can introduce a
2845 * So, btrfs_start_dirty_block_groups is here to kick off block group cache IO.
2846 * There's a chance we'll have to redo some of it if the block group changes
2848 * getting rid of the easy block groups while we're still allowing others to
2853 struct btrfs_fs_info *fs_info = trans->fs_info; in btrfs_start_dirty_block_groups()
2854 struct btrfs_block_group *cache; in btrfs_start_dirty_block_groups() local
2855 struct btrfs_transaction *cur_trans = trans->transaction; in btrfs_start_dirty_block_groups()
2860 struct list_head *io = &cur_trans->io_bgs; in btrfs_start_dirty_block_groups()
2864 spin_lock(&cur_trans->dirty_bgs_lock); in btrfs_start_dirty_block_groups()
2865 if (list_empty(&cur_trans->dirty_bgs)) { in btrfs_start_dirty_block_groups()
2866 spin_unlock(&cur_trans->dirty_bgs_lock); in btrfs_start_dirty_block_groups()
2869 list_splice_init(&cur_trans->dirty_bgs, &dirty); in btrfs_start_dirty_block_groups()
2870 spin_unlock(&cur_trans->dirty_bgs_lock); in btrfs_start_dirty_block_groups()
2873 /* Make sure all the block groups on our dirty list actually exist */ in btrfs_start_dirty_block_groups()
2879 ret = -ENOMEM; in btrfs_start_dirty_block_groups()
2886 * removal of empty block groups deleting this block group while we are in btrfs_start_dirty_block_groups()
2887 * writing out the cache in btrfs_start_dirty_block_groups()
2889 mutex_lock(&trans->transaction->cache_write_mutex); in btrfs_start_dirty_block_groups()
2893 cache = list_first_entry(&dirty, struct btrfs_block_group, in btrfs_start_dirty_block_groups()
2896 * This can happen if something re-dirties a block group that in btrfs_start_dirty_block_groups()
2900 if (!list_empty(&cache->io_list)) { in btrfs_start_dirty_block_groups()
2901 list_del_init(&cache->io_list); in btrfs_start_dirty_block_groups()
2902 btrfs_wait_cache_io(trans, cache, path); in btrfs_start_dirty_block_groups()
2903 btrfs_put_block_group(cache); in btrfs_start_dirty_block_groups()
2908 * btrfs_wait_cache_io uses the cache->dirty_list to decide if in btrfs_start_dirty_block_groups()
2915 spin_lock(&cur_trans->dirty_bgs_lock); in btrfs_start_dirty_block_groups()
2916 list_del_init(&cache->dirty_list); in btrfs_start_dirty_block_groups()
2917 spin_unlock(&cur_trans->dirty_bgs_lock); in btrfs_start_dirty_block_groups()
2921 cache_save_setup(cache, trans, path); in btrfs_start_dirty_block_groups()
2923 if (cache->disk_cache_state == BTRFS_DC_SETUP) { in btrfs_start_dirty_block_groups()
2924 cache->io_ctl.inode = NULL; in btrfs_start_dirty_block_groups()
2925 ret = btrfs_write_out_cache(trans, cache, path); in btrfs_start_dirty_block_groups()
2926 if (ret == 0 && cache->io_ctl.inode) { in btrfs_start_dirty_block_groups()
2935 list_add_tail(&cache->io_list, io); in btrfs_start_dirty_block_groups()
2938 * If we failed to write the cache, the in btrfs_start_dirty_block_groups()
2945 ret = update_block_group_item(trans, path, cache); in btrfs_start_dirty_block_groups()
2947 * Our block group might still be attached to the list in btrfs_start_dirty_block_groups()
2948 * of new block groups in the transaction handle of some in btrfs_start_dirty_block_groups()
2949 * other task (struct btrfs_trans_handle->new_bgs). This in btrfs_start_dirty_block_groups()
2950 * means its block group item isn't yet in the extent in btrfs_start_dirty_block_groups()
2955 if (ret == -ENOENT) { in btrfs_start_dirty_block_groups()
2957 spin_lock(&cur_trans->dirty_bgs_lock); in btrfs_start_dirty_block_groups()
2958 if (list_empty(&cache->dirty_list)) { in btrfs_start_dirty_block_groups()
2959 list_add_tail(&cache->dirty_list, in btrfs_start_dirty_block_groups()
2960 &cur_trans->dirty_bgs); in btrfs_start_dirty_block_groups()
2961 btrfs_get_block_group(cache); in btrfs_start_dirty_block_groups()
2964 spin_unlock(&cur_trans->dirty_bgs_lock); in btrfs_start_dirty_block_groups()
2970 /* If it's not on the io list, we need to put the block group */ in btrfs_start_dirty_block_groups()
2972 btrfs_put_block_group(cache); in btrfs_start_dirty_block_groups()
2977 * us from writing caches for block groups that are going to be in btrfs_start_dirty_block_groups()
2980 mutex_unlock(&trans->transaction->cache_write_mutex); in btrfs_start_dirty_block_groups()
2983 mutex_lock(&trans->transaction->cache_write_mutex); in btrfs_start_dirty_block_groups()
2985 mutex_unlock(&trans->transaction->cache_write_mutex); in btrfs_start_dirty_block_groups()
2995 spin_lock(&cur_trans->dirty_bgs_lock); in btrfs_start_dirty_block_groups()
2996 list_splice_init(&cur_trans->dirty_bgs, &dirty); in btrfs_start_dirty_block_groups()
2998 * dirty_bgs_lock protects us from concurrent block group in btrfs_start_dirty_block_groups()
3002 spin_unlock(&cur_trans->dirty_bgs_lock); in btrfs_start_dirty_block_groups()
3005 spin_unlock(&cur_trans->dirty_bgs_lock); in btrfs_start_dirty_block_groups()
3009 spin_lock(&cur_trans->dirty_bgs_lock); in btrfs_start_dirty_block_groups()
3010 list_splice_init(&dirty, &cur_trans->dirty_bgs); in btrfs_start_dirty_block_groups()
3011 spin_unlock(&cur_trans->dirty_bgs_lock); in btrfs_start_dirty_block_groups()
3021 struct btrfs_fs_info *fs_info = trans->fs_info; in btrfs_write_dirty_block_groups()
3022 struct btrfs_block_group *cache; in btrfs_write_dirty_block_groups() local
3023 struct btrfs_transaction *cur_trans = trans->transaction; in btrfs_write_dirty_block_groups()
3027 struct list_head *io = &cur_trans->io_bgs; in btrfs_write_dirty_block_groups()
3032 return -ENOMEM; in btrfs_write_dirty_block_groups()
3037 * transaction's list of dirty block groups. These tasks correspond to in btrfs_write_dirty_block_groups()
3039 * space cache, which run inode.c:btrfs_finish_ordered_io(), and can in btrfs_write_dirty_block_groups()
3040 * allocate new block groups as a result of COWing nodes of the root in btrfs_write_dirty_block_groups()
3049 spin_lock(&cur_trans->dirty_bgs_lock); in btrfs_write_dirty_block_groups()
3050 while (!list_empty(&cur_trans->dirty_bgs)) { in btrfs_write_dirty_block_groups()
3051 cache = list_first_entry(&cur_trans->dirty_bgs, in btrfs_write_dirty_block_groups()
3056 * This can happen if cache_save_setup re-dirties a block group in btrfs_write_dirty_block_groups()
3060 if (!list_empty(&cache->io_list)) { in btrfs_write_dirty_block_groups()
3061 spin_unlock(&cur_trans->dirty_bgs_lock); in btrfs_write_dirty_block_groups()
3062 list_del_init(&cache->io_list); in btrfs_write_dirty_block_groups()
3063 btrfs_wait_cache_io(trans, cache, path); in btrfs_write_dirty_block_groups()
3064 btrfs_put_block_group(cache); in btrfs_write_dirty_block_groups()
3065 spin_lock(&cur_trans->dirty_bgs_lock); in btrfs_write_dirty_block_groups()
3072 list_del_init(&cache->dirty_list); in btrfs_write_dirty_block_groups()
3073 spin_unlock(&cur_trans->dirty_bgs_lock); in btrfs_write_dirty_block_groups()
3076 cache_save_setup(cache, trans, path); in btrfs_write_dirty_block_groups()
3080 (unsigned long) -1); in btrfs_write_dirty_block_groups()
3082 if (!ret && cache->disk_cache_state == BTRFS_DC_SETUP) { in btrfs_write_dirty_block_groups()
3083 cache->io_ctl.inode = NULL; in btrfs_write_dirty_block_groups()
3084 ret = btrfs_write_out_cache(trans, cache, path); in btrfs_write_dirty_block_groups()
3085 if (ret == 0 && cache->io_ctl.inode) { in btrfs_write_dirty_block_groups()
3088 list_add_tail(&cache->io_list, io); in btrfs_write_dirty_block_groups()
3091 * If we failed to write the cache, the in btrfs_write_dirty_block_groups()
3098 ret = update_block_group_item(trans, path, cache); in btrfs_write_dirty_block_groups()
3101 * created a new block group while updating a free space in btrfs_write_dirty_block_groups()
3102 * cache's inode (at inode.c:btrfs_finish_ordered_io()) in btrfs_write_dirty_block_groups()
3104 * which case the new block group is still attached to in btrfs_write_dirty_block_groups()
3106 * finished yet (no block group item in the extent tree in btrfs_write_dirty_block_groups()
3112 if (ret == -ENOENT) { in btrfs_write_dirty_block_groups()
3113 wait_event(cur_trans->writer_wait, in btrfs_write_dirty_block_groups()
3114 atomic_read(&cur_trans->num_writers) == 1); in btrfs_write_dirty_block_groups()
3115 ret = update_block_group_item(trans, path, cache); in btrfs_write_dirty_block_groups()
3121 /* If its not on the io list, we need to put the block group */ in btrfs_write_dirty_block_groups()
3123 btrfs_put_block_group(cache); in btrfs_write_dirty_block_groups()
3125 spin_lock(&cur_trans->dirty_bgs_lock); in btrfs_write_dirty_block_groups()
3127 spin_unlock(&cur_trans->dirty_bgs_lock); in btrfs_write_dirty_block_groups()
3134 cache = list_first_entry(io, struct btrfs_block_group, in btrfs_write_dirty_block_groups()
3136 list_del_init(&cache->io_list); in btrfs_write_dirty_block_groups()
3137 btrfs_wait_cache_io(trans, cache, path); in btrfs_write_dirty_block_groups()
3138 btrfs_put_block_group(cache); in btrfs_write_dirty_block_groups()
3148 struct btrfs_fs_info *info = trans->fs_info; in btrfs_update_block_group()
3149 struct btrfs_block_group *cache = NULL; in btrfs_update_block_group() local
3156 /* Block accounting for super block */ in btrfs_update_block_group()
3157 spin_lock(&info->delalloc_root_lock); in btrfs_update_block_group()
3158 old_val = btrfs_super_bytes_used(info->super_copy); in btrfs_update_block_group()
3162 old_val -= num_bytes; in btrfs_update_block_group()
3163 btrfs_set_super_bytes_used(info->super_copy, old_val); in btrfs_update_block_group()
3164 spin_unlock(&info->delalloc_root_lock); in btrfs_update_block_group()
3167 cache = btrfs_lookup_block_group(info, bytenr); in btrfs_update_block_group()
3168 if (!cache) { in btrfs_update_block_group()
3169 ret = -ENOENT; in btrfs_update_block_group()
3172 factor = btrfs_bg_type_to_factor(cache->flags); in btrfs_update_block_group()
3175 * If this block group has free space cache written out, we in btrfs_update_block_group()
3178 * space back to the block group, otherwise we will leak space. in btrfs_update_block_group()
3180 if (!alloc && !btrfs_block_group_done(cache)) in btrfs_update_block_group()
3181 btrfs_cache_block_group(cache, 1); in btrfs_update_block_group()
3183 byte_in_group = bytenr - cache->start; in btrfs_update_block_group()
3184 WARN_ON(byte_in_group > cache->length); in btrfs_update_block_group()
3186 spin_lock(&cache->space_info->lock); in btrfs_update_block_group()
3187 spin_lock(&cache->lock); in btrfs_update_block_group()
3190 cache->disk_cache_state < BTRFS_DC_CLEAR) in btrfs_update_block_group()
3191 cache->disk_cache_state = BTRFS_DC_CLEAR; in btrfs_update_block_group()
3193 old_val = cache->used; in btrfs_update_block_group()
3194 num_bytes = min(total, cache->length - byte_in_group); in btrfs_update_block_group()
3197 cache->used = old_val; in btrfs_update_block_group()
3198 cache->reserved -= num_bytes; in btrfs_update_block_group()
3199 cache->space_info->bytes_reserved -= num_bytes; in btrfs_update_block_group()
3200 cache->space_info->bytes_used += num_bytes; in btrfs_update_block_group()
3201 cache->space_info->disk_used += num_bytes * factor; in btrfs_update_block_group()
3202 spin_unlock(&cache->lock); in btrfs_update_block_group()
3203 spin_unlock(&cache->space_info->lock); in btrfs_update_block_group()
3205 old_val -= num_bytes; in btrfs_update_block_group()
3206 cache->used = old_val; in btrfs_update_block_group()
3207 cache->pinned += num_bytes; in btrfs_update_block_group()
3209 cache->space_info, num_bytes); in btrfs_update_block_group()
3210 cache->space_info->bytes_used -= num_bytes; in btrfs_update_block_group()
3211 cache->space_info->disk_used -= num_bytes * factor; in btrfs_update_block_group()
3212 spin_unlock(&cache->lock); in btrfs_update_block_group()
3213 spin_unlock(&cache->space_info->lock); in btrfs_update_block_group()
3215 set_extent_dirty(&trans->transaction->pinned_extents, in btrfs_update_block_group()
3216 bytenr, bytenr + num_bytes - 1, in btrfs_update_block_group()
3220 spin_lock(&trans->transaction->dirty_bgs_lock); in btrfs_update_block_group()
3221 if (list_empty(&cache->dirty_list)) { in btrfs_update_block_group()
3222 list_add_tail(&cache->dirty_list, in btrfs_update_block_group()
3223 &trans->transaction->dirty_bgs); in btrfs_update_block_group()
3224 trans->delayed_ref_updates++; in btrfs_update_block_group()
3225 btrfs_get_block_group(cache); in btrfs_update_block_group()
3227 spin_unlock(&trans->transaction->dirty_bgs_lock); in btrfs_update_block_group()
3230 * No longer have used bytes in this block group, queue it for in btrfs_update_block_group()
3231 * deletion. We do this after adding the block group to the in btrfs_update_block_group()
3233 * cache writeout. in btrfs_update_block_group()
3237 btrfs_mark_bg_unused(cache); in btrfs_update_block_group()
3240 btrfs_put_block_group(cache); in btrfs_update_block_group()
3241 total -= num_bytes; in btrfs_update_block_group()
3245 /* Modified block groups are accounted for in the delayed_refs_rsv. */ in btrfs_update_block_group()
3251 * btrfs_add_reserved_bytes - update the block_group and space info counters
3252 * @cache: The cache we are manipulating
3259 * reservation and the block group has become read only we cannot make the
3260 * reservation and return -EAGAIN, otherwise this function always succeeds.
3262 int btrfs_add_reserved_bytes(struct btrfs_block_group *cache, in btrfs_add_reserved_bytes() argument
3265 struct btrfs_space_info *space_info = cache->space_info; in btrfs_add_reserved_bytes()
3268 spin_lock(&space_info->lock); in btrfs_add_reserved_bytes()
3269 spin_lock(&cache->lock); in btrfs_add_reserved_bytes()
3270 if (cache->ro) { in btrfs_add_reserved_bytes()
3271 ret = -EAGAIN; in btrfs_add_reserved_bytes()
3273 cache->reserved += num_bytes; in btrfs_add_reserved_bytes()
3274 space_info->bytes_reserved += num_bytes; in btrfs_add_reserved_bytes()
3275 trace_btrfs_space_reservation(cache->fs_info, "space_info", in btrfs_add_reserved_bytes()
3276 space_info->flags, num_bytes, 1); in btrfs_add_reserved_bytes()
3277 btrfs_space_info_update_bytes_may_use(cache->fs_info, in btrfs_add_reserved_bytes()
3278 space_info, -ram_bytes); in btrfs_add_reserved_bytes()
3280 cache->delalloc_bytes += num_bytes; in btrfs_add_reserved_bytes()
3287 btrfs_try_granting_tickets(cache->fs_info, space_info); in btrfs_add_reserved_bytes()
3289 spin_unlock(&cache->lock); in btrfs_add_reserved_bytes()
3290 spin_unlock(&space_info->lock); in btrfs_add_reserved_bytes()
3295 * btrfs_free_reserved_bytes - update the block_group and space info counters
3296 * @cache: The cache we are manipulating
3305 void btrfs_free_reserved_bytes(struct btrfs_block_group *cache, in btrfs_free_reserved_bytes() argument
3308 struct btrfs_space_info *space_info = cache->space_info; in btrfs_free_reserved_bytes()
3310 spin_lock(&space_info->lock); in btrfs_free_reserved_bytes()
3311 spin_lock(&cache->lock); in btrfs_free_reserved_bytes()
3312 if (cache->ro) in btrfs_free_reserved_bytes()
3313 space_info->bytes_readonly += num_bytes; in btrfs_free_reserved_bytes()
3314 cache->reserved -= num_bytes; in btrfs_free_reserved_bytes()
3315 space_info->bytes_reserved -= num_bytes; in btrfs_free_reserved_bytes()
3316 space_info->max_extent_size = 0; in btrfs_free_reserved_bytes()
3319 cache->delalloc_bytes -= num_bytes; in btrfs_free_reserved_bytes()
3320 spin_unlock(&cache->lock); in btrfs_free_reserved_bytes()
3322 btrfs_try_granting_tickets(cache->fs_info, space_info); in btrfs_free_reserved_bytes()
3323 spin_unlock(&space_info->lock); in btrfs_free_reserved_bytes()
3328 struct list_head *head = &info->space_info; in force_metadata_allocation()
3332 if (found->flags & BTRFS_BLOCK_GROUP_METADATA) in force_metadata_allocation()
3333 found->force_alloc = CHUNK_ALLOC_FORCE; in force_metadata_allocation()
3348 * about 1% of the FS size. in should_alloc_chunk()
3351 thresh = btrfs_super_total_bytes(fs_info->super_copy); in should_alloc_chunk()
3354 if (sinfo->total_bytes - bytes_used < thresh) in should_alloc_chunk()
3358 if (bytes_used + SZ_2M < div_factor(sinfo->total_bytes, 8)) in should_alloc_chunk()
3365 u64 alloc_flags = btrfs_get_alloc_profile(trans->fs_info, type); in btrfs_force_chunk_alloc()
3379 * system block group if needed. in do_chunk_alloc()
3410 * Normally we are not expected to fail with -ENOSPC here, since we have in do_chunk_alloc()
3415 * existing system block groups have a profile which can not be used in do_chunk_alloc()
3422 * none of the block groups can be used for extent allocation since they in do_chunk_alloc()
3426 * block groups and check if they have a usable profile and enough space in do_chunk_alloc()
3427 * can be slow on very large filesystems, so we tolerate the -ENOSPC and in do_chunk_alloc()
3433 * block group to allocate from when we called check_system_chunk() in do_chunk_alloc()
3434 * above. However right after we called it, the only system block group in do_chunk_alloc()
3438 * handle and scrub uses the commit root to search for block groups. in do_chunk_alloc()
3440 if (ret == -ENOSPC) { in do_chunk_alloc()
3441 const u64 sys_flags = btrfs_system_alloc_profile(trans->fs_info); in do_chunk_alloc()
3475 * 1) Phase 1 - through btrfs_chunk_alloc() we allocate device extents for
3476 * the chunk, the chunk mapping, create its block group and add the items
3477 * that belong in the chunk btree to it - more specifically, we need to
3480 * 2) Phase 2 - through btrfs_create_pending_block_groups(), we add the block
3486 * trigger chunk allocation and attempted to insert the new block group item
3497 * allocate a new block group (chunk) because the only one that had enough
3499 * device replace, block group reclaim thread, etc), so we can not use it
3504 * the filesystem was mounted in degraded mode, none of the existing block
3506 * profile (for e.g. mounting a 2 devices filesystem, where all block groups
3509 * example, it will trigger allocation of a new metadata block group with a
3515 * example, it does not find any free extent in any metadata block group,
3516 * therefore forced to try to allocate a new metadata block group.
3518 * meanwhile - this typically happens with tasks that don't reserve space
3525 * a seed device - we must create new metadata and system chunks without adding
3526 * any of the block group items to the chunk, extent and device btrees. If we
3528 * btrees, since all the chunks from the seed device are read-only.
3535 * superblock. This is easier to trigger if using a btree node/leaf size of 64K
3551 * holding fs_info->chunk_mutex. This is important to guarantee that while COWing
3557 * that mutex. The same logic applies to removing chunks - we must reserve system
3559 * while holding fs_info->chunk_mutex.
3564 * - return 1 if it successfully allocates a chunk,
3565 * - return errors including -ENOSPC otherwise.
3567 * - return 0 if it doesn't need to allocate a new chunk,
3568 * - return 1 if it successfully allocates a chunk,
3569 * - return errors including -ENOSPC otherwise.
3574 struct btrfs_fs_info *fs_info = trans->fs_info; in btrfs_chunk_alloc()
3580 /* Don't re-enter if we're already allocating a chunk */ in btrfs_chunk_alloc()
3581 if (trans->allocating_chunk) in btrfs_chunk_alloc()
3582 return -ENOSPC; in btrfs_chunk_alloc()
3584 * If we are removing a chunk, don't re-enter or we would deadlock. in btrfs_chunk_alloc()
3588 if (trans->removing_chunk) in btrfs_chunk_alloc()
3589 return -ENOSPC; in btrfs_chunk_alloc()
3595 spin_lock(&space_info->lock); in btrfs_chunk_alloc()
3596 if (force < space_info->force_alloc) in btrfs_chunk_alloc()
3597 force = space_info->force_alloc; in btrfs_chunk_alloc()
3599 if (space_info->full) { in btrfs_chunk_alloc()
3602 ret = -ENOSPC; in btrfs_chunk_alloc()
3605 spin_unlock(&space_info->lock); in btrfs_chunk_alloc()
3608 spin_unlock(&space_info->lock); in btrfs_chunk_alloc()
3610 } else if (space_info->chunk_alloc) { in btrfs_chunk_alloc()
3612 * Someone is already allocating, so we need to block in btrfs_chunk_alloc()
3618 spin_unlock(&space_info->lock); in btrfs_chunk_alloc()
3619 mutex_lock(&fs_info->chunk_mutex); in btrfs_chunk_alloc()
3620 mutex_unlock(&fs_info->chunk_mutex); in btrfs_chunk_alloc()
3623 space_info->chunk_alloc = 1; in btrfs_chunk_alloc()
3625 spin_unlock(&space_info->lock); in btrfs_chunk_alloc()
3631 mutex_lock(&fs_info->chunk_mutex); in btrfs_chunk_alloc()
3632 trans->allocating_chunk = true; in btrfs_chunk_alloc()
3646 if (flags & BTRFS_BLOCK_GROUP_DATA && fs_info->metadata_ratio) { in btrfs_chunk_alloc()
3647 fs_info->data_chunk_allocations++; in btrfs_chunk_alloc()
3648 if (!(fs_info->data_chunk_allocations % in btrfs_chunk_alloc()
3649 fs_info->metadata_ratio)) in btrfs_chunk_alloc()
3654 trans->allocating_chunk = false; in btrfs_chunk_alloc()
3656 spin_lock(&space_info->lock); in btrfs_chunk_alloc()
3658 if (ret == -ENOSPC) in btrfs_chunk_alloc()
3659 space_info->full = 1; in btrfs_chunk_alloc()
3664 space_info->max_extent_size = 0; in btrfs_chunk_alloc()
3667 space_info->force_alloc = CHUNK_ALLOC_NO_FORCE; in btrfs_chunk_alloc()
3669 space_info->chunk_alloc = 0; in btrfs_chunk_alloc()
3670 spin_unlock(&space_info->lock); in btrfs_chunk_alloc()
3671 mutex_unlock(&fs_info->chunk_mutex); in btrfs_chunk_alloc()
3682 num_dev = fs_info->fs_devices->rw_devices; in get_profile_num_devs()
3692 struct btrfs_fs_info *fs_info = trans->fs_info; in check_system_chunk()
3701 * atomic and race free space reservation in the chunk block reserve. in check_system_chunk()
3703 lockdep_assert_held(&fs_info->chunk_mutex); in check_system_chunk()
3706 spin_lock(&info->lock); in check_system_chunk()
3707 left = info->total_bytes - btrfs_space_info_used(info, true); in check_system_chunk()
3708 spin_unlock(&info->lock); in check_system_chunk()
3752 ret = btrfs_block_rsv_add(fs_info->chunk_root, in check_system_chunk()
3753 &fs_info->chunk_block_rsv, in check_system_chunk()
3756 trans->chunk_bytes_reserved += thresh; in check_system_chunk()
3771 spin_lock(&block_group->lock); in btrfs_put_block_group_cache()
3772 if (block_group->iref) in btrfs_put_block_group_cache()
3774 spin_unlock(&block_group->lock); in btrfs_put_block_group_cache()
3784 inode = block_group->inode; in btrfs_put_block_group_cache()
3785 block_group->iref = 0; in btrfs_put_block_group_cache()
3786 block_group->inode = NULL; in btrfs_put_block_group_cache()
3787 spin_unlock(&block_group->lock); in btrfs_put_block_group_cache()
3788 ASSERT(block_group->io_ctl.inode == NULL); in btrfs_put_block_group_cache()
3790 last = block_group->start + block_group->length; in btrfs_put_block_group_cache()
3796 * Must be called only after stopping all workers, since we could have block
3798 * freed the block groups before stopping them.
3807 spin_lock(&info->block_group_cache_lock); in btrfs_free_block_groups()
3808 while (!list_empty(&info->caching_block_groups)) { in btrfs_free_block_groups()
3809 caching_ctl = list_entry(info->caching_block_groups.next, in btrfs_free_block_groups()
3811 list_del(&caching_ctl->list); in btrfs_free_block_groups()
3814 spin_unlock(&info->block_group_cache_lock); in btrfs_free_block_groups()
3816 spin_lock(&info->unused_bgs_lock); in btrfs_free_block_groups()
3817 while (!list_empty(&info->unused_bgs)) { in btrfs_free_block_groups()
3818 block_group = list_first_entry(&info->unused_bgs, in btrfs_free_block_groups()
3821 list_del_init(&block_group->bg_list); in btrfs_free_block_groups()
3824 spin_unlock(&info->unused_bgs_lock); in btrfs_free_block_groups()
3826 spin_lock(&info->unused_bgs_lock); in btrfs_free_block_groups()
3827 while (!list_empty(&info->reclaim_bgs)) { in btrfs_free_block_groups()
3828 block_group = list_first_entry(&info->reclaim_bgs, in btrfs_free_block_groups()
3831 list_del_init(&block_group->bg_list); in btrfs_free_block_groups()
3834 spin_unlock(&info->unused_bgs_lock); in btrfs_free_block_groups()
3836 spin_lock(&info->block_group_cache_lock); in btrfs_free_block_groups()
3837 while ((n = rb_last(&info->block_group_cache_tree)) != NULL) { in btrfs_free_block_groups()
3840 rb_erase(&block_group->cache_node, in btrfs_free_block_groups()
3841 &info->block_group_cache_tree); in btrfs_free_block_groups()
3842 RB_CLEAR_NODE(&block_group->cache_node); in btrfs_free_block_groups()
3843 spin_unlock(&info->block_group_cache_lock); in btrfs_free_block_groups()
3845 down_write(&block_group->space_info->groups_sem); in btrfs_free_block_groups()
3846 list_del(&block_group->list); in btrfs_free_block_groups()
3847 up_write(&block_group->space_info->groups_sem); in btrfs_free_block_groups()
3850 * We haven't cached this block group, which means we could in btrfs_free_block_groups()
3851 * possibly have excluded extents on this block group. in btrfs_free_block_groups()
3853 if (block_group->cached == BTRFS_CACHE_NO || in btrfs_free_block_groups()
3854 block_group->cached == BTRFS_CACHE_ERROR) in btrfs_free_block_groups()
3858 ASSERT(block_group->cached != BTRFS_CACHE_STARTED); in btrfs_free_block_groups()
3859 ASSERT(list_empty(&block_group->dirty_list)); in btrfs_free_block_groups()
3860 ASSERT(list_empty(&block_group->io_list)); in btrfs_free_block_groups()
3861 ASSERT(list_empty(&block_group->bg_list)); in btrfs_free_block_groups()
3862 ASSERT(refcount_read(&block_group->refs) == 1); in btrfs_free_block_groups()
3863 ASSERT(block_group->swap_extents == 0); in btrfs_free_block_groups()
3866 spin_lock(&info->block_group_cache_lock); in btrfs_free_block_groups()
3868 spin_unlock(&info->block_group_cache_lock); in btrfs_free_block_groups()
3872 while (!list_empty(&info->space_info)) { in btrfs_free_block_groups()
3873 space_info = list_entry(info->space_info.next, in btrfs_free_block_groups()
3881 if (WARN_ON(space_info->bytes_pinned > 0 || in btrfs_free_block_groups()
3882 space_info->bytes_reserved > 0 || in btrfs_free_block_groups()
3883 space_info->bytes_may_use > 0)) in btrfs_free_block_groups()
3885 WARN_ON(space_info->reclaim_size > 0); in btrfs_free_block_groups()
3886 list_del(&space_info->list); in btrfs_free_block_groups()
3892 void btrfs_freeze_block_group(struct btrfs_block_group *cache) in btrfs_freeze_block_group() argument
3894 atomic_inc(&cache->frozen); in btrfs_freeze_block_group()
3899 struct btrfs_fs_info *fs_info = block_group->fs_info; in btrfs_unfreeze_block_group()
3904 spin_lock(&block_group->lock); in btrfs_unfreeze_block_group()
3905 cleanup = (atomic_dec_and_test(&block_group->frozen) && in btrfs_unfreeze_block_group()
3906 block_group->removed); in btrfs_unfreeze_block_group()
3907 spin_unlock(&block_group->lock); in btrfs_unfreeze_block_group()
3910 em_tree = &fs_info->mapping_tree; in btrfs_unfreeze_block_group()
3911 write_lock(&em_tree->lock); in btrfs_unfreeze_block_group()
3912 em = lookup_extent_mapping(em_tree, block_group->start, in btrfs_unfreeze_block_group()
3916 write_unlock(&em_tree->lock); in btrfs_unfreeze_block_group()
3924 * tasks trimming this block group have left 1 entry each one. in btrfs_unfreeze_block_group()
3927 __btrfs_remove_free_space_cache(block_group->free_space_ctl); in btrfs_unfreeze_block_group()
3935 spin_lock(&bg->lock); in btrfs_inc_block_group_swap_extents()
3936 if (bg->ro) in btrfs_inc_block_group_swap_extents()
3939 bg->swap_extents++; in btrfs_inc_block_group_swap_extents()
3940 spin_unlock(&bg->lock); in btrfs_inc_block_group_swap_extents()
3947 spin_lock(&bg->lock); in btrfs_dec_block_group_swap_extents()
3948 ASSERT(!bg->ro); in btrfs_dec_block_group_swap_extents()
3949 ASSERT(bg->swap_extents >= amount); in btrfs_dec_block_group_swap_extents()
3950 bg->swap_extents -= amount; in btrfs_dec_block_group_swap_extents()
3951 spin_unlock(&bg->lock); in btrfs_dec_block_group_swap_extents()