Lines Matching refs:cache
123 void btrfs_get_block_group(struct btrfs_block_group_cache *cache) in btrfs_get_block_group() argument
125 atomic_inc(&cache->count); in btrfs_get_block_group()
128 void btrfs_put_block_group(struct btrfs_block_group_cache *cache) in btrfs_put_block_group() argument
130 if (atomic_dec_and_test(&cache->count)) { in btrfs_put_block_group()
131 WARN_ON(cache->pinned > 0); in btrfs_put_block_group()
132 WARN_ON(cache->reserved > 0); in btrfs_put_block_group()
142 WARN_ON(!RB_EMPTY_ROOT(&cache->full_stripe_locks_root.root)); in btrfs_put_block_group()
143 kfree(cache->free_space_ctl); in btrfs_put_block_group()
144 kfree(cache); in btrfs_put_block_group()
156 struct btrfs_block_group_cache *cache; in btrfs_add_block_group_cache() local
163 cache = rb_entry(parent, struct btrfs_block_group_cache, in btrfs_add_block_group_cache()
165 if (block_group->key.objectid < cache->key.objectid) { in btrfs_add_block_group_cache()
167 } else if (block_group->key.objectid > cache->key.objectid) { in btrfs_add_block_group_cache()
194 struct btrfs_block_group_cache *cache, *ret = NULL; in block_group_cache_tree_search() local
202 cache = rb_entry(n, struct btrfs_block_group_cache, in block_group_cache_tree_search()
204 end = cache->key.objectid + cache->key.offset - 1; in block_group_cache_tree_search()
205 start = cache->key.objectid; in block_group_cache_tree_search()
209 ret = cache; in block_group_cache_tree_search()
213 ret = cache; in block_group_cache_tree_search()
218 ret = cache; in block_group_cache_tree_search()
251 struct btrfs_block_group_cache *cache) in btrfs_next_block_group() argument
253 struct btrfs_fs_info *fs_info = cache->fs_info; in btrfs_next_block_group()
259 if (RB_EMPTY_NODE(&cache->cache_node)) { in btrfs_next_block_group()
260 const u64 next_bytenr = cache->key.objectid + cache->key.offset; in btrfs_next_block_group()
263 btrfs_put_block_group(cache); in btrfs_next_block_group()
264 cache = btrfs_lookup_first_block_group(fs_info, next_bytenr); return cache; in btrfs_next_block_group()
266 node = rb_next(&cache->cache_node); in btrfs_next_block_group()
267 btrfs_put_block_group(cache); in btrfs_next_block_group()
269 cache = rb_entry(node, struct btrfs_block_group_cache, in btrfs_next_block_group()
271 btrfs_get_block_group(cache); in btrfs_next_block_group()
273 cache = NULL; in btrfs_next_block_group()
275 return cache; in btrfs_next_block_group()
360 struct btrfs_block_group_cache *cache) in btrfs_get_caching_control() argument
364 spin_lock(&cache->lock); in btrfs_get_caching_control()
365 if (!cache->caching_ctl) { in btrfs_get_caching_control()
366 spin_unlock(&cache->lock); in btrfs_get_caching_control()
370 ctl = cache->caching_ctl; in btrfs_get_caching_control()
372 spin_unlock(&cache->lock); in btrfs_get_caching_control()
395 void btrfs_wait_block_group_cache_progress(struct btrfs_block_group_cache *cache, in btrfs_wait_block_group_cache_progress() argument
400 caching_ctl = btrfs_get_caching_control(cache); in btrfs_wait_block_group_cache_progress()
404 wait_event(caching_ctl->wait, btrfs_block_group_cache_done(cache) || in btrfs_wait_block_group_cache_progress()
405 (cache->free_space_ctl->free_space >= num_bytes)); in btrfs_wait_block_group_cache_progress()
410 int btrfs_wait_block_group_cache_done(struct btrfs_block_group_cache *cache) in btrfs_wait_block_group_cache_done() argument
415 caching_ctl = btrfs_get_caching_control(cache); in btrfs_wait_block_group_cache_done()
417 return (cache->cached == BTRFS_CACHE_ERROR) ? -EIO : 0; in btrfs_wait_block_group_cache_done()
419 wait_event(caching_ctl->wait, btrfs_block_group_cache_done(cache)); in btrfs_wait_block_group_cache_done()
420 if (cache->cached == BTRFS_CACHE_ERROR) in btrfs_wait_block_group_cache_done()
680 int btrfs_cache_block_group(struct btrfs_block_group_cache *cache, in btrfs_cache_block_group() argument
684 struct btrfs_fs_info *fs_info = cache->fs_info; in btrfs_cache_block_group()
695 caching_ctl->block_group = cache; in btrfs_cache_block_group()
696 caching_ctl->progress = cache->key.objectid; in btrfs_cache_block_group()
700 spin_lock(&cache->lock); in btrfs_cache_block_group()
713 while (cache->cached == BTRFS_CACHE_FAST) { in btrfs_cache_block_group()
716 ctl = cache->caching_ctl; in btrfs_cache_block_group()
719 spin_unlock(&cache->lock); in btrfs_cache_block_group()
725 spin_lock(&cache->lock); in btrfs_cache_block_group()
728 if (cache->cached != BTRFS_CACHE_NO) { in btrfs_cache_block_group()
729 spin_unlock(&cache->lock); in btrfs_cache_block_group()
733 WARN_ON(cache->caching_ctl); in btrfs_cache_block_group()
734 cache->caching_ctl = caching_ctl; in btrfs_cache_block_group()
735 cache->cached = BTRFS_CACHE_FAST; in btrfs_cache_block_group()
736 spin_unlock(&cache->lock); in btrfs_cache_block_group()
740 ret = load_free_space_cache(cache); in btrfs_cache_block_group()
742 spin_lock(&cache->lock); in btrfs_cache_block_group()
744 cache->caching_ctl = NULL; in btrfs_cache_block_group()
745 cache->cached = BTRFS_CACHE_FINISHED; in btrfs_cache_block_group()
746 cache->last_byte_to_unpin = (u64)-1; in btrfs_cache_block_group()
750 cache->caching_ctl = NULL; in btrfs_cache_block_group()
751 cache->cached = BTRFS_CACHE_NO; in btrfs_cache_block_group()
753 cache->cached = BTRFS_CACHE_STARTED; in btrfs_cache_block_group()
754 cache->has_caching_ctl = 1; in btrfs_cache_block_group()
757 spin_unlock(&cache->lock); in btrfs_cache_block_group()
760 btrfs_should_fragment_free_space(cache)) { in btrfs_cache_block_group()
763 spin_lock(&cache->space_info->lock); in btrfs_cache_block_group()
764 spin_lock(&cache->lock); in btrfs_cache_block_group()
765 bytes_used = cache->key.offset - in btrfs_cache_block_group()
766 btrfs_block_group_used(&cache->item); in btrfs_cache_block_group()
767 cache->space_info->bytes_used += bytes_used >> 1; in btrfs_cache_block_group()
768 spin_unlock(&cache->lock); in btrfs_cache_block_group()
769 spin_unlock(&cache->space_info->lock); in btrfs_cache_block_group()
770 fragment_free_space(cache); in btrfs_cache_block_group()
778 btrfs_free_excluded_extents(cache); in btrfs_cache_block_group()
786 spin_lock(&cache->lock); in btrfs_cache_block_group()
788 cache->caching_ctl = NULL; in btrfs_cache_block_group()
789 cache->cached = BTRFS_CACHE_NO; in btrfs_cache_block_group()
791 cache->cached = BTRFS_CACHE_STARTED; in btrfs_cache_block_group()
792 cache->has_caching_ctl = 1; in btrfs_cache_block_group()
794 spin_unlock(&cache->lock); in btrfs_cache_block_group()
808 btrfs_get_block_group(cache); in btrfs_cache_block_group()
1182 static int inc_block_group_ro(struct btrfs_block_group_cache *cache, int force) in inc_block_group_ro() argument
1184 struct btrfs_space_info *sinfo = cache->space_info; in inc_block_group_ro()
1203 spin_lock(&cache->lock); in inc_block_group_ro()
1205 if (cache->ro) { in inc_block_group_ro()
1206 cache->ro++; in inc_block_group_ro()
1211 num_bytes = cache->key.offset - cache->reserved - cache->pinned - in inc_block_group_ro()
1212 cache->bytes_super - btrfs_block_group_used(&cache->item); in inc_block_group_ro()
1224 cache->ro++; in inc_block_group_ro()
1225 list_add_tail(&cache->ro_list, &sinfo->ro_bgs); in inc_block_group_ro()
1229 spin_unlock(&cache->lock); in inc_block_group_ro()
1231 if (ret == -ENOSPC && btrfs_test_opt(cache->fs_info, ENOSPC_DEBUG)) { in inc_block_group_ro()
1232 btrfs_info(cache->fs_info, in inc_block_group_ro()
1234 cache->key.objectid); in inc_block_group_ro()
1235 btrfs_info(cache->fs_info, in inc_block_group_ro()
1238 btrfs_dump_space_info(cache->fs_info, cache->space_info, 0, 0); in inc_block_group_ro()
1520 static int exclude_super_stripes(struct btrfs_block_group_cache *cache) in exclude_super_stripes() argument
1522 struct btrfs_fs_info *fs_info = cache->fs_info; in exclude_super_stripes()
1528 if (cache->key.objectid < BTRFS_SUPER_INFO_OFFSET) { in exclude_super_stripes()
1529 stripe_len = BTRFS_SUPER_INFO_OFFSET - cache->key.objectid; in exclude_super_stripes()
1530 cache->bytes_super += stripe_len; in exclude_super_stripes()
1531 ret = btrfs_add_excluded_extent(fs_info, cache->key.objectid, in exclude_super_stripes()
1539 ret = btrfs_rmap_block(fs_info, cache->key.objectid, in exclude_super_stripes()
1547 if (logical[nr] > cache->key.objectid + in exclude_super_stripes()
1548 cache->key.offset) in exclude_super_stripes()
1551 if (logical[nr] + stripe_len <= cache->key.objectid) in exclude_super_stripes()
1555 if (start < cache->key.objectid) { in exclude_super_stripes()
1556 start = cache->key.objectid; in exclude_super_stripes()
1560 cache->key.objectid + in exclude_super_stripes()
1561 cache->key.offset - start); in exclude_super_stripes()
1564 cache->bytes_super += len; in exclude_super_stripes()
1577 static void link_block_group(struct btrfs_block_group_cache *cache) in link_block_group() argument
1579 struct btrfs_space_info *space_info = cache->space_info; in link_block_group()
1580 int index = btrfs_bg_flags_to_raid_index(cache->flags); in link_block_group()
1586 list_add_tail(&cache->list, &space_info->block_groups[index]); in link_block_group()
1590 btrfs_sysfs_add_block_group_type(cache); in link_block_group()
1596 struct btrfs_block_group_cache *cache; in btrfs_create_block_group_cache() local
1598 cache = kzalloc(sizeof(*cache), GFP_NOFS); in btrfs_create_block_group_cache()
1599 if (!cache) in btrfs_create_block_group_cache()
1602 cache->free_space_ctl = kzalloc(sizeof(*cache->free_space_ctl), in btrfs_create_block_group_cache()
1604 if (!cache->free_space_ctl) { in btrfs_create_block_group_cache()
1605 kfree(cache); in btrfs_create_block_group_cache()
1609 cache->key.objectid = start; in btrfs_create_block_group_cache()
1610 cache->key.offset = size; in btrfs_create_block_group_cache()
1611 cache->key.type = BTRFS_BLOCK_GROUP_ITEM_KEY; in btrfs_create_block_group_cache()
1613 cache->fs_info = fs_info; in btrfs_create_block_group_cache()
1614 cache->full_stripe_len = btrfs_full_stripe_len(fs_info, start); in btrfs_create_block_group_cache()
1615 set_free_space_tree_thresholds(cache); in btrfs_create_block_group_cache()
1617 atomic_set(&cache->count, 1); in btrfs_create_block_group_cache()
1618 spin_lock_init(&cache->lock); in btrfs_create_block_group_cache()
1619 init_rwsem(&cache->data_rwsem); in btrfs_create_block_group_cache()
1620 INIT_LIST_HEAD(&cache->list); in btrfs_create_block_group_cache()
1621 INIT_LIST_HEAD(&cache->cluster_list); in btrfs_create_block_group_cache()
1622 INIT_LIST_HEAD(&cache->bg_list); in btrfs_create_block_group_cache()
1623 INIT_LIST_HEAD(&cache->ro_list); in btrfs_create_block_group_cache()
1624 INIT_LIST_HEAD(&cache->dirty_list); in btrfs_create_block_group_cache()
1625 INIT_LIST_HEAD(&cache->io_list); in btrfs_create_block_group_cache()
1626 btrfs_init_free_space_ctl(cache); in btrfs_create_block_group_cache()
1627 atomic_set(&cache->trimming, 0); in btrfs_create_block_group_cache()
1628 mutex_init(&cache->free_space_lock); in btrfs_create_block_group_cache()
1629 btrfs_init_full_stripe_locks_tree(&cache->full_stripe_locks_root); in btrfs_create_block_group_cache()
1631 return cache; in btrfs_create_block_group_cache()
1693 struct btrfs_block_group_cache *cache; in btrfs_read_block_groups() local
1731 cache = btrfs_create_block_group_cache(info, found_key.objectid, in btrfs_read_block_groups()
1733 if (!cache) { in btrfs_read_block_groups()
1750 cache->disk_cache_state = BTRFS_DC_CLEAR; in btrfs_read_block_groups()
1753 read_extent_buffer(leaf, &cache->item, in btrfs_read_block_groups()
1755 sizeof(cache->item)); in btrfs_read_block_groups()
1756 cache->flags = btrfs_block_group_flags(&cache->item); in btrfs_read_block_groups()
1758 ((cache->flags & BTRFS_BLOCK_GROUP_METADATA) && in btrfs_read_block_groups()
1759 (cache->flags & BTRFS_BLOCK_GROUP_DATA))) { in btrfs_read_block_groups()
1762 cache->key.objectid); in btrfs_read_block_groups()
1763 btrfs_put_block_group(cache); in btrfs_read_block_groups()
1776 ret = exclude_super_stripes(cache); in btrfs_read_block_groups()
1782 btrfs_free_excluded_extents(cache); in btrfs_read_block_groups()
1783 btrfs_put_block_group(cache); in btrfs_read_block_groups()
1794 if (found_key.offset == btrfs_block_group_used(&cache->item)) { in btrfs_read_block_groups()
1795 cache->last_byte_to_unpin = (u64)-1; in btrfs_read_block_groups()
1796 cache->cached = BTRFS_CACHE_FINISHED; in btrfs_read_block_groups()
1797 btrfs_free_excluded_extents(cache); in btrfs_read_block_groups()
1798 } else if (btrfs_block_group_used(&cache->item) == 0) { in btrfs_read_block_groups()
1799 cache->last_byte_to_unpin = (u64)-1; in btrfs_read_block_groups()
1800 cache->cached = BTRFS_CACHE_FINISHED; in btrfs_read_block_groups()
1801 add_new_free_space(cache, found_key.objectid, in btrfs_read_block_groups()
1804 btrfs_free_excluded_extents(cache); in btrfs_read_block_groups()
1807 ret = btrfs_add_block_group_cache(info, cache); in btrfs_read_block_groups()
1809 btrfs_remove_free_space_cache(cache); in btrfs_read_block_groups()
1810 btrfs_put_block_group(cache); in btrfs_read_block_groups()
1814 trace_btrfs_add_block_group(info, cache, 0); in btrfs_read_block_groups()
1815 btrfs_update_space_info(info, cache->flags, found_key.offset, in btrfs_read_block_groups()
1816 btrfs_block_group_used(&cache->item), in btrfs_read_block_groups()
1817 cache->bytes_super, &space_info); in btrfs_read_block_groups()
1819 cache->space_info = space_info; in btrfs_read_block_groups()
1821 link_block_group(cache); in btrfs_read_block_groups()
1823 set_avail_alloc_bits(info, cache->flags); in btrfs_read_block_groups()
1824 if (btrfs_chunk_readonly(info, cache->key.objectid)) { in btrfs_read_block_groups()
1825 inc_block_group_ro(cache, 1); in btrfs_read_block_groups()
1826 } else if (btrfs_block_group_used(&cache->item) == 0) { in btrfs_read_block_groups()
1827 ASSERT(list_empty(&cache->bg_list)); in btrfs_read_block_groups()
1828 btrfs_mark_bg_unused(cache); in btrfs_read_block_groups()
1843 list_for_each_entry(cache, in btrfs_read_block_groups()
1846 inc_block_group_ro(cache, 1); in btrfs_read_block_groups()
1847 list_for_each_entry(cache, in btrfs_read_block_groups()
1850 inc_block_group_ro(cache, 1); in btrfs_read_block_groups()
1904 struct btrfs_block_group_cache *cache; in btrfs_make_block_group() local
1909 cache = btrfs_create_block_group_cache(fs_info, chunk_offset, size); in btrfs_make_block_group()
1910 if (!cache) in btrfs_make_block_group()
1913 btrfs_set_block_group_used(&cache->item, bytes_used); in btrfs_make_block_group()
1914 btrfs_set_block_group_chunk_objectid(&cache->item, in btrfs_make_block_group()
1916 btrfs_set_block_group_flags(&cache->item, type); in btrfs_make_block_group()
1918 cache->flags = type; in btrfs_make_block_group()
1919 cache->last_byte_to_unpin = (u64)-1; in btrfs_make_block_group()
1920 cache->cached = BTRFS_CACHE_FINISHED; in btrfs_make_block_group()
1921 cache->needs_free_space = 1; in btrfs_make_block_group()
1922 ret = exclude_super_stripes(cache); in btrfs_make_block_group()
1925 btrfs_free_excluded_extents(cache); in btrfs_make_block_group()
1926 btrfs_put_block_group(cache); in btrfs_make_block_group()
1930 add_new_free_space(cache, chunk_offset, chunk_offset + size); in btrfs_make_block_group()
1932 btrfs_free_excluded_extents(cache); in btrfs_make_block_group()
1935 if (btrfs_should_fragment_free_space(cache)) { in btrfs_make_block_group()
1939 fragment_free_space(cache); in btrfs_make_block_group()
1947 cache->space_info = btrfs_find_space_info(fs_info, cache->flags); in btrfs_make_block_group()
1948 ASSERT(cache->space_info); in btrfs_make_block_group()
1950 ret = btrfs_add_block_group_cache(fs_info, cache); in btrfs_make_block_group()
1952 btrfs_remove_free_space_cache(cache); in btrfs_make_block_group()
1953 btrfs_put_block_group(cache); in btrfs_make_block_group()
1961 trace_btrfs_add_block_group(fs_info, cache, 1); in btrfs_make_block_group()
1962 btrfs_update_space_info(fs_info, cache->flags, size, bytes_used, in btrfs_make_block_group()
1963 cache->bytes_super, &cache->space_info); in btrfs_make_block_group()
1966 link_block_group(cache); in btrfs_make_block_group()
1968 list_add_tail(&cache->bg_list, &trans->new_bgs); in btrfs_make_block_group()
2024 int btrfs_inc_block_group_ro(struct btrfs_block_group_cache *cache) in btrfs_inc_block_group_ro() argument
2027 struct btrfs_fs_info *fs_info = cache->fs_info; in btrfs_inc_block_group_ro()
2059 alloc_flags = update_block_group_flags(fs_info, cache->flags); in btrfs_inc_block_group_ro()
2060 if (alloc_flags != cache->flags) { in btrfs_inc_block_group_ro()
2073 ret = inc_block_group_ro(cache, 0); in btrfs_inc_block_group_ro()
2076 alloc_flags = btrfs_get_alloc_profile(fs_info, cache->space_info->flags); in btrfs_inc_block_group_ro()
2080 ret = inc_block_group_ro(cache, 0); in btrfs_inc_block_group_ro()
2082 if (cache->flags & BTRFS_BLOCK_GROUP_SYSTEM) { in btrfs_inc_block_group_ro()
2083 alloc_flags = update_block_group_flags(fs_info, cache->flags); in btrfs_inc_block_group_ro()
2094 void btrfs_dec_block_group_ro(struct btrfs_block_group_cache *cache) in btrfs_dec_block_group_ro() argument
2096 struct btrfs_space_info *sinfo = cache->space_info; in btrfs_dec_block_group_ro()
2099 BUG_ON(!cache->ro); in btrfs_dec_block_group_ro()
2102 spin_lock(&cache->lock); in btrfs_dec_block_group_ro()
2103 if (!--cache->ro) { in btrfs_dec_block_group_ro()
2104 num_bytes = cache->key.offset - cache->reserved - in btrfs_dec_block_group_ro()
2105 cache->pinned - cache->bytes_super - in btrfs_dec_block_group_ro()
2106 btrfs_block_group_used(&cache->item); in btrfs_dec_block_group_ro()
2108 list_del_init(&cache->ro_list); in btrfs_dec_block_group_ro()
2110 spin_unlock(&cache->lock); in btrfs_dec_block_group_ro()
2116 struct btrfs_block_group_cache *cache) in write_one_cache_group() argument
2124 ret = btrfs_search_slot(trans, extent_root, &cache->key, path, 0, 1); in write_one_cache_group()
2133 write_extent_buffer(leaf, &cache->item, bi, sizeof(cache->item)); in write_one_cache_group()
2305 struct btrfs_block_group_cache *cache, *tmp; in btrfs_setup_space_cache() local
2318 list_for_each_entry_safe(cache, tmp, &cur_trans->dirty_bgs, in btrfs_setup_space_cache()
2320 if (cache->disk_cache_state == BTRFS_DC_CLEAR) in btrfs_setup_space_cache()
2321 cache_save_setup(cache, trans, path); in btrfs_setup_space_cache()
2343 struct btrfs_block_group_cache *cache; in btrfs_start_dirty_block_groups() local
2380 cache = list_first_entry(&dirty, in btrfs_start_dirty_block_groups()
2388 if (!list_empty(&cache->io_list)) { in btrfs_start_dirty_block_groups()
2389 list_del_init(&cache->io_list); in btrfs_start_dirty_block_groups()
2390 btrfs_wait_cache_io(trans, cache, path); in btrfs_start_dirty_block_groups()
2391 btrfs_put_block_group(cache); in btrfs_start_dirty_block_groups()
2404 list_del_init(&cache->dirty_list); in btrfs_start_dirty_block_groups()
2409 cache_save_setup(cache, trans, path); in btrfs_start_dirty_block_groups()
2411 if (cache->disk_cache_state == BTRFS_DC_SETUP) { in btrfs_start_dirty_block_groups()
2412 cache->io_ctl.inode = NULL; in btrfs_start_dirty_block_groups()
2413 ret = btrfs_write_out_cache(trans, cache, path); in btrfs_start_dirty_block_groups()
2414 if (ret == 0 && cache->io_ctl.inode) { in btrfs_start_dirty_block_groups()
2423 list_add_tail(&cache->io_list, io); in btrfs_start_dirty_block_groups()
2433 ret = write_one_cache_group(trans, path, cache); in btrfs_start_dirty_block_groups()
2446 if (list_empty(&cache->dirty_list)) { in btrfs_start_dirty_block_groups()
2447 list_add_tail(&cache->dirty_list, in btrfs_start_dirty_block_groups()
2449 btrfs_get_block_group(cache); in btrfs_start_dirty_block_groups()
2460 btrfs_put_block_group(cache); in btrfs_start_dirty_block_groups()
2506 struct btrfs_block_group_cache *cache; in btrfs_write_dirty_block_groups() local
2535 cache = list_first_entry(&cur_trans->dirty_bgs, in btrfs_write_dirty_block_groups()
2544 if (!list_empty(&cache->io_list)) { in btrfs_write_dirty_block_groups()
2546 list_del_init(&cache->io_list); in btrfs_write_dirty_block_groups()
2547 btrfs_wait_cache_io(trans, cache, path); in btrfs_write_dirty_block_groups()
2548 btrfs_put_block_group(cache); in btrfs_write_dirty_block_groups()
2556 list_del_init(&cache->dirty_list); in btrfs_write_dirty_block_groups()
2560 cache_save_setup(cache, trans, path); in btrfs_write_dirty_block_groups()
2566 if (!ret && cache->disk_cache_state == BTRFS_DC_SETUP) { in btrfs_write_dirty_block_groups()
2567 cache->io_ctl.inode = NULL; in btrfs_write_dirty_block_groups()
2568 ret = btrfs_write_out_cache(trans, cache, path); in btrfs_write_dirty_block_groups()
2569 if (ret == 0 && cache->io_ctl.inode) { in btrfs_write_dirty_block_groups()
2572 list_add_tail(&cache->io_list, io); in btrfs_write_dirty_block_groups()
2582 ret = write_one_cache_group(trans, path, cache); in btrfs_write_dirty_block_groups()
2599 ret = write_one_cache_group(trans, path, cache); in btrfs_write_dirty_block_groups()
2607 btrfs_put_block_group(cache); in btrfs_write_dirty_block_groups()
2618 cache = list_first_entry(io, struct btrfs_block_group_cache, in btrfs_write_dirty_block_groups()
2620 list_del_init(&cache->io_list); in btrfs_write_dirty_block_groups()
2621 btrfs_wait_cache_io(trans, cache, path); in btrfs_write_dirty_block_groups()
2622 btrfs_put_block_group(cache); in btrfs_write_dirty_block_groups()
2633 struct btrfs_block_group_cache *cache = NULL; in btrfs_update_block_group() local
2651 cache = btrfs_lookup_block_group(info, bytenr); in btrfs_update_block_group()
2652 if (!cache) { in btrfs_update_block_group()
2656 factor = btrfs_bg_type_to_factor(cache->flags); in btrfs_update_block_group()
2664 if (!alloc && !btrfs_block_group_cache_done(cache)) in btrfs_update_block_group()
2665 btrfs_cache_block_group(cache, 1); in btrfs_update_block_group()
2667 byte_in_group = bytenr - cache->key.objectid; in btrfs_update_block_group()
2668 WARN_ON(byte_in_group > cache->key.offset); in btrfs_update_block_group()
2670 spin_lock(&cache->space_info->lock); in btrfs_update_block_group()
2671 spin_lock(&cache->lock); in btrfs_update_block_group()
2674 cache->disk_cache_state < BTRFS_DC_CLEAR) in btrfs_update_block_group()
2675 cache->disk_cache_state = BTRFS_DC_CLEAR; in btrfs_update_block_group()
2677 old_val = btrfs_block_group_used(&cache->item); in btrfs_update_block_group()
2678 num_bytes = min(total, cache->key.offset - byte_in_group); in btrfs_update_block_group()
2681 btrfs_set_block_group_used(&cache->item, old_val); in btrfs_update_block_group()
2682 cache->reserved -= num_bytes; in btrfs_update_block_group()
2683 cache->space_info->bytes_reserved -= num_bytes; in btrfs_update_block_group()
2684 cache->space_info->bytes_used += num_bytes; in btrfs_update_block_group()
2685 cache->space_info->disk_used += num_bytes * factor; in btrfs_update_block_group()
2686 spin_unlock(&cache->lock); in btrfs_update_block_group()
2687 spin_unlock(&cache->space_info->lock); in btrfs_update_block_group()
2690 btrfs_set_block_group_used(&cache->item, old_val); in btrfs_update_block_group()
2691 cache->pinned += num_bytes; in btrfs_update_block_group()
2693 cache->space_info, num_bytes); in btrfs_update_block_group()
2694 cache->space_info->bytes_used -= num_bytes; in btrfs_update_block_group()
2695 cache->space_info->disk_used -= num_bytes * factor; in btrfs_update_block_group()
2696 spin_unlock(&cache->lock); in btrfs_update_block_group()
2697 spin_unlock(&cache->space_info->lock); in btrfs_update_block_group()
2700 &cache->space_info->total_bytes_pinned, in btrfs_update_block_group()
2709 if (list_empty(&cache->dirty_list)) { in btrfs_update_block_group()
2710 list_add_tail(&cache->dirty_list, in btrfs_update_block_group()
2713 btrfs_get_block_group(cache); in btrfs_update_block_group()
2724 btrfs_mark_bg_unused(cache); in btrfs_update_block_group()
2726 btrfs_put_block_group(cache); in btrfs_update_block_group()
2748 int btrfs_add_reserved_bytes(struct btrfs_block_group_cache *cache, in btrfs_add_reserved_bytes() argument
2751 struct btrfs_space_info *space_info = cache->space_info; in btrfs_add_reserved_bytes()
2755 spin_lock(&cache->lock); in btrfs_add_reserved_bytes()
2756 if (cache->ro) { in btrfs_add_reserved_bytes()
2759 cache->reserved += num_bytes; in btrfs_add_reserved_bytes()
2761 trace_btrfs_space_reservation(cache->fs_info, "space_info", in btrfs_add_reserved_bytes()
2763 btrfs_space_info_update_bytes_may_use(cache->fs_info, in btrfs_add_reserved_bytes()
2766 cache->delalloc_bytes += num_bytes; in btrfs_add_reserved_bytes()
2768 spin_unlock(&cache->lock); in btrfs_add_reserved_bytes()
2784 void btrfs_free_reserved_bytes(struct btrfs_block_group_cache *cache, in btrfs_free_reserved_bytes() argument
2787 struct btrfs_space_info *space_info = cache->space_info; in btrfs_free_reserved_bytes()
2790 spin_lock(&cache->lock); in btrfs_free_reserved_bytes()
2791 if (cache->ro) in btrfs_free_reserved_bytes()
2793 cache->reserved -= num_bytes; in btrfs_free_reserved_bytes()
2798 cache->delalloc_bytes -= num_bytes; in btrfs_free_reserved_bytes()
2799 spin_unlock(&cache->lock); in btrfs_free_reserved_bytes()