Lines Matching refs:cache

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()
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()
159 struct btrfs_block_group *cache; in btrfs_add_block_group_cache() local
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()
171 } else if (block_group->start > cache->start) { in btrfs_add_block_group_cache()
198 struct btrfs_block_group *cache, *ret = NULL; in block_group_cache_tree_search() local
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()
212 ret = cache; in block_group_cache_tree_search()
216 ret = cache; in block_group_cache_tree_search()
221 ret = cache; in block_group_cache_tree_search()
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()
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()
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()
277 return cache; in btrfs_next_block_group()
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()
374 spin_unlock(&cache->lock); in btrfs_get_caching_control()
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()
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()
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()
739 caching_ctl->block_group = cache; in btrfs_cache_block_group()
740 caching_ctl->progress = cache->start; 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()
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()
768 btrfs_get_block_group(cache); in btrfs_cache_block_group()
773 btrfs_wait_space_cache_v1_finished(cache, caching_ctl); in btrfs_cache_block_group()
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()
1163 spin_lock(&cache->lock); in inc_block_group_ro()
1165 if (cache->swap_extents) { 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()
1201 if (btrfs_can_overcommit(cache->fs_info, sinfo, 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()
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()
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()
1833 cache->start); 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()
1861 list_add_tail(&cache->list, &space_info->block_groups[index]); 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()
1965 struct btrfs_block_group *cache; in read_one_block_group() local
1972 cache = btrfs_create_block_group_cache(info, key->objectid); in read_one_block_group()
1973 if (!cache) 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()
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()
2000 cache->start); 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()
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()
2140 struct btrfs_block_group *cache; in btrfs_read_block_groups() local
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()
2212 list_for_each_entry(cache, 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()
2219 inc_block_group_ro(cache, 1); in btrfs_read_block_groups()
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()
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()
2458 fragment_free_space(cache); 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()
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()
2492 return cache; in btrfs_make_block_group()
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()
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()
2559 ret = inc_block_group_ro(cache, 0); 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()
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()
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()
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()
2605 list_del_init(&cache->ro_list); in btrfs_dec_block_group_ro()
2607 spin_unlock(&cache->lock); in btrfs_dec_block_group_ro()
2613 struct btrfs_block_group *cache) in update_block_group_item() argument
2623 key.objectid = cache->start; in update_block_group_item()
2625 key.offset = cache->length; 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()
2816 struct btrfs_block_group *cache, *tmp; in btrfs_setup_space_cache() local
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()
2854 struct btrfs_block_group *cache; in btrfs_start_dirty_block_groups() local
2893 cache = list_first_entry(&dirty, struct btrfs_block_group, 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()
2916 list_del_init(&cache->dirty_list); 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()
2945 ret = update_block_group_item(trans, path, cache); 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()
2961 btrfs_get_block_group(cache); in btrfs_start_dirty_block_groups()
2972 btrfs_put_block_group(cache); in btrfs_start_dirty_block_groups()
3022 struct btrfs_block_group *cache; in btrfs_write_dirty_block_groups() local
3051 cache = list_first_entry(&cur_trans->dirty_bgs, in btrfs_write_dirty_block_groups()
3060 if (!list_empty(&cache->io_list)) { 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()
3072 list_del_init(&cache->dirty_list); in btrfs_write_dirty_block_groups()
3076 cache_save_setup(cache, trans, path); 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()
3098 ret = update_block_group_item(trans, path, cache); in btrfs_write_dirty_block_groups()
3115 ret = update_block_group_item(trans, path, cache); in btrfs_write_dirty_block_groups()
3123 btrfs_put_block_group(cache); 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()
3149 struct btrfs_block_group *cache = NULL; in btrfs_update_block_group() local
3167 cache = btrfs_lookup_block_group(info, bytenr); in btrfs_update_block_group()
3168 if (!cache) { in btrfs_update_block_group()
3172 factor = btrfs_bg_type_to_factor(cache->flags); 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()
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()
3221 if (list_empty(&cache->dirty_list)) { in btrfs_update_block_group()
3222 list_add_tail(&cache->dirty_list, in btrfs_update_block_group()
3225 btrfs_get_block_group(cache); 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()
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()
3269 spin_lock(&cache->lock); in btrfs_add_reserved_bytes()
3270 if (cache->ro) { in btrfs_add_reserved_bytes()
3273 cache->reserved += num_bytes; in btrfs_add_reserved_bytes()
3275 trace_btrfs_space_reservation(cache->fs_info, "space_info", in btrfs_add_reserved_bytes()
3277 btrfs_space_info_update_bytes_may_use(cache->fs_info, 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()
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()
3311 spin_lock(&cache->lock); in btrfs_free_reserved_bytes()
3312 if (cache->ro) in btrfs_free_reserved_bytes()
3314 cache->reserved -= num_bytes; 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()
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()