aboutsummaryrefslogtreecommitdiffstats
path: root/fs/btrfs/extent-tree.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/btrfs/extent-tree.c')
-rw-r--r--fs/btrfs/extent-tree.c148
1 files changed, 113 insertions, 35 deletions
diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c
index fafb3e53ecde..813537f362f9 100644
--- a/fs/btrfs/extent-tree.c
+++ b/fs/btrfs/extent-tree.c
@@ -105,7 +105,8 @@ static int find_next_key(struct btrfs_path *path, int level,
105static void dump_space_info(struct btrfs_space_info *info, u64 bytes, 105static void dump_space_info(struct btrfs_space_info *info, u64 bytes,
106 int dump_block_groups); 106 int dump_block_groups);
107static int btrfs_update_reserved_bytes(struct btrfs_block_group_cache *cache, 107static int btrfs_update_reserved_bytes(struct btrfs_block_group_cache *cache,
108 u64 num_bytes, int reserve); 108 u64 num_bytes, int reserve,
109 int delalloc);
109static int block_rsv_use_bytes(struct btrfs_block_rsv *block_rsv, 110static int block_rsv_use_bytes(struct btrfs_block_rsv *block_rsv,
110 u64 num_bytes); 111 u64 num_bytes);
111int btrfs_pin_extent(struct btrfs_root *root, 112int btrfs_pin_extent(struct btrfs_root *root,
@@ -3260,7 +3261,8 @@ again:
3260 3261
3261 spin_lock(&block_group->lock); 3262 spin_lock(&block_group->lock);
3262 if (block_group->cached != BTRFS_CACHE_FINISHED || 3263 if (block_group->cached != BTRFS_CACHE_FINISHED ||
3263 !btrfs_test_opt(root, SPACE_CACHE)) { 3264 !btrfs_test_opt(root, SPACE_CACHE) ||
3265 block_group->delalloc_bytes) {
3264 /* 3266 /*
3265 * don't bother trying to write stuff out _if_ 3267 * don't bother trying to write stuff out _if_
3266 * a) we're not cached, 3268 * a) we're not cached,
@@ -5613,6 +5615,7 @@ int btrfs_exclude_logged_extents(struct btrfs_root *log,
5613 * @cache: The cache we are manipulating 5615 * @cache: The cache we are manipulating
5614 * @num_bytes: The number of bytes in question 5616 * @num_bytes: The number of bytes in question
5615 * @reserve: One of the reservation enums 5617 * @reserve: One of the reservation enums
5618 * @delalloc: The blocks are allocated for the delalloc write
5616 * 5619 *
5617 * This is called by the allocator when it reserves space, or by somebody who is 5620 * This is called by the allocator when it reserves space, or by somebody who is
5618 * freeing space that was never actually used on disk. For example if you 5621 * freeing space that was never actually used on disk. For example if you
@@ -5631,7 +5634,7 @@ int btrfs_exclude_logged_extents(struct btrfs_root *log,
5631 * succeeds. 5634 * succeeds.
5632 */ 5635 */
5633static int btrfs_update_reserved_bytes(struct btrfs_block_group_cache *cache, 5636static int btrfs_update_reserved_bytes(struct btrfs_block_group_cache *cache,
5634 u64 num_bytes, int reserve) 5637 u64 num_bytes, int reserve, int delalloc)
5635{ 5638{
5636 struct btrfs_space_info *space_info = cache->space_info; 5639 struct btrfs_space_info *space_info = cache->space_info;
5637 int ret = 0; 5640 int ret = 0;
@@ -5650,12 +5653,18 @@ static int btrfs_update_reserved_bytes(struct btrfs_block_group_cache *cache,
5650 num_bytes, 0); 5653 num_bytes, 0);
5651 space_info->bytes_may_use -= num_bytes; 5654 space_info->bytes_may_use -= num_bytes;
5652 } 5655 }
5656
5657 if (delalloc)
5658 cache->delalloc_bytes += num_bytes;
5653 } 5659 }
5654 } else { 5660 } else {
5655 if (cache->ro) 5661 if (cache->ro)
5656 space_info->bytes_readonly += num_bytes; 5662 space_info->bytes_readonly += num_bytes;
5657 cache->reserved -= num_bytes; 5663 cache->reserved -= num_bytes;
5658 space_info->bytes_reserved -= num_bytes; 5664 space_info->bytes_reserved -= num_bytes;
5665
5666 if (delalloc)
5667 cache->delalloc_bytes -= num_bytes;
5659 } 5668 }
5660 spin_unlock(&cache->lock); 5669 spin_unlock(&cache->lock);
5661 spin_unlock(&space_info->lock); 5670 spin_unlock(&space_info->lock);
@@ -5669,7 +5678,6 @@ void btrfs_prepare_extent_commit(struct btrfs_trans_handle *trans,
5669 struct btrfs_caching_control *next; 5678 struct btrfs_caching_control *next;
5670 struct btrfs_caching_control *caching_ctl; 5679 struct btrfs_caching_control *caching_ctl;
5671 struct btrfs_block_group_cache *cache; 5680 struct btrfs_block_group_cache *cache;
5672 struct btrfs_space_info *space_info;
5673 5681
5674 down_write(&fs_info->commit_root_sem); 5682 down_write(&fs_info->commit_root_sem);
5675 5683
@@ -5692,9 +5700,6 @@ void btrfs_prepare_extent_commit(struct btrfs_trans_handle *trans,
5692 5700
5693 up_write(&fs_info->commit_root_sem); 5701 up_write(&fs_info->commit_root_sem);
5694 5702
5695 list_for_each_entry_rcu(space_info, &fs_info->space_info, list)
5696 percpu_counter_set(&space_info->total_bytes_pinned, 0);
5697
5698 update_global_block_rsv(fs_info); 5703 update_global_block_rsv(fs_info);
5699} 5704}
5700 5705
@@ -5732,6 +5737,7 @@ static int unpin_extent_range(struct btrfs_root *root, u64 start, u64 end)
5732 spin_lock(&cache->lock); 5737 spin_lock(&cache->lock);
5733 cache->pinned -= len; 5738 cache->pinned -= len;
5734 space_info->bytes_pinned -= len; 5739 space_info->bytes_pinned -= len;
5740 percpu_counter_add(&space_info->total_bytes_pinned, -len);
5735 if (cache->ro) { 5741 if (cache->ro) {
5736 space_info->bytes_readonly += len; 5742 space_info->bytes_readonly += len;
5737 readonly = true; 5743 readonly = true;
@@ -6206,7 +6212,7 @@ void btrfs_free_tree_block(struct btrfs_trans_handle *trans,
6206 WARN_ON(test_bit(EXTENT_BUFFER_DIRTY, &buf->bflags)); 6212 WARN_ON(test_bit(EXTENT_BUFFER_DIRTY, &buf->bflags));
6207 6213
6208 btrfs_add_free_space(cache, buf->start, buf->len); 6214 btrfs_add_free_space(cache, buf->start, buf->len);
6209 btrfs_update_reserved_bytes(cache, buf->len, RESERVE_FREE); 6215 btrfs_update_reserved_bytes(cache, buf->len, RESERVE_FREE, 0);
6210 trace_btrfs_reserved_extent_free(root, buf->start, buf->len); 6216 trace_btrfs_reserved_extent_free(root, buf->start, buf->len);
6211 pin = 0; 6217 pin = 0;
6212 } 6218 }
@@ -6365,6 +6371,70 @@ enum btrfs_loop_type {
6365 LOOP_NO_EMPTY_SIZE = 3, 6371 LOOP_NO_EMPTY_SIZE = 3,
6366}; 6372};
6367 6373
6374static inline void
6375btrfs_lock_block_group(struct btrfs_block_group_cache *cache,
6376 int delalloc)
6377{
6378 if (delalloc)
6379 down_read(&cache->data_rwsem);
6380}
6381
6382static inline void
6383btrfs_grab_block_group(struct btrfs_block_group_cache *cache,
6384 int delalloc)
6385{
6386 btrfs_get_block_group(cache);
6387 if (delalloc)
6388 down_read(&cache->data_rwsem);
6389}
6390
6391static struct btrfs_block_group_cache *
6392btrfs_lock_cluster(struct btrfs_block_group_cache *block_group,
6393 struct btrfs_free_cluster *cluster,
6394 int delalloc)
6395{
6396 struct btrfs_block_group_cache *used_bg;
6397 bool locked = false;
6398again:
6399 spin_lock(&cluster->refill_lock);
6400 if (locked) {
6401 if (used_bg == cluster->block_group)
6402 return used_bg;
6403
6404 up_read(&used_bg->data_rwsem);
6405 btrfs_put_block_group(used_bg);
6406 }
6407
6408 used_bg = cluster->block_group;
6409 if (!used_bg)
6410 return NULL;
6411
6412 if (used_bg == block_group)
6413 return used_bg;
6414
6415 btrfs_get_block_group(used_bg);
6416
6417 if (!delalloc)
6418 return used_bg;
6419
6420 if (down_read_trylock(&used_bg->data_rwsem))
6421 return used_bg;
6422
6423 spin_unlock(&cluster->refill_lock);
6424 down_read(&used_bg->data_rwsem);
6425 locked = true;
6426 goto again;
6427}
6428
6429static inline void
6430btrfs_release_block_group(struct btrfs_block_group_cache *cache,
6431 int delalloc)
6432{
6433 if (delalloc)
6434 up_read(&cache->data_rwsem);
6435 btrfs_put_block_group(cache);
6436}
6437
6368/* 6438/*
6369 * walks the btree of allocated extents and find a hole of a given size. 6439 * walks the btree of allocated extents and find a hole of a given size.
6370 * The key ins is changed to record the hole: 6440 * The key ins is changed to record the hole:
@@ -6379,7 +6449,7 @@ enum btrfs_loop_type {
6379static noinline int find_free_extent(struct btrfs_root *orig_root, 6449static noinline int find_free_extent(struct btrfs_root *orig_root,
6380 u64 num_bytes, u64 empty_size, 6450 u64 num_bytes, u64 empty_size,
6381 u64 hint_byte, struct btrfs_key *ins, 6451 u64 hint_byte, struct btrfs_key *ins,
6382 u64 flags) 6452 u64 flags, int delalloc)
6383{ 6453{
6384 int ret = 0; 6454 int ret = 0;
6385 struct btrfs_root *root = orig_root->fs_info->extent_root; 6455 struct btrfs_root *root = orig_root->fs_info->extent_root;
@@ -6467,6 +6537,7 @@ static noinline int find_free_extent(struct btrfs_root *orig_root,
6467 up_read(&space_info->groups_sem); 6537 up_read(&space_info->groups_sem);
6468 } else { 6538 } else {
6469 index = get_block_group_index(block_group); 6539 index = get_block_group_index(block_group);
6540 btrfs_lock_block_group(block_group, delalloc);
6470 goto have_block_group; 6541 goto have_block_group;
6471 } 6542 }
6472 } else if (block_group) { 6543 } else if (block_group) {
@@ -6481,7 +6552,7 @@ search:
6481 u64 offset; 6552 u64 offset;
6482 int cached; 6553 int cached;
6483 6554
6484 btrfs_get_block_group(block_group); 6555 btrfs_grab_block_group(block_group, delalloc);
6485 search_start = block_group->key.objectid; 6556 search_start = block_group->key.objectid;
6486 6557
6487 /* 6558 /*
@@ -6529,16 +6600,16 @@ have_block_group:
6529 * the refill lock keeps out other 6600 * the refill lock keeps out other
6530 * people trying to start a new cluster 6601 * people trying to start a new cluster
6531 */ 6602 */
6532 spin_lock(&last_ptr->refill_lock); 6603 used_block_group = btrfs_lock_cluster(block_group,
6533 used_block_group = last_ptr->block_group; 6604 last_ptr,
6534 if (used_block_group != block_group && 6605 delalloc);
6535 (!used_block_group || 6606 if (!used_block_group)
6536 used_block_group->ro ||
6537 !block_group_bits(used_block_group, flags)))
6538 goto refill_cluster; 6607 goto refill_cluster;
6539 6608
6540 if (used_block_group != block_group) 6609 if (used_block_group != block_group &&
6541 btrfs_get_block_group(used_block_group); 6610 (used_block_group->ro ||
6611 !block_group_bits(used_block_group, flags)))
6612 goto release_cluster;
6542 6613
6543 offset = btrfs_alloc_from_cluster(used_block_group, 6614 offset = btrfs_alloc_from_cluster(used_block_group,
6544 last_ptr, 6615 last_ptr,
@@ -6552,16 +6623,15 @@ have_block_group:
6552 used_block_group, 6623 used_block_group,
6553 search_start, num_bytes); 6624 search_start, num_bytes);
6554 if (used_block_group != block_group) { 6625 if (used_block_group != block_group) {
6555 btrfs_put_block_group(block_group); 6626 btrfs_release_block_group(block_group,
6627 delalloc);
6556 block_group = used_block_group; 6628 block_group = used_block_group;
6557 } 6629 }
6558 goto checks; 6630 goto checks;
6559 } 6631 }
6560 6632
6561 WARN_ON(last_ptr->block_group != used_block_group); 6633 WARN_ON(last_ptr->block_group != used_block_group);
6562 if (used_block_group != block_group) 6634release_cluster:
6563 btrfs_put_block_group(used_block_group);
6564refill_cluster:
6565 /* If we are on LOOP_NO_EMPTY_SIZE, we can't 6635 /* If we are on LOOP_NO_EMPTY_SIZE, we can't
6566 * set up a new clusters, so lets just skip it 6636 * set up a new clusters, so lets just skip it
6567 * and let the allocator find whatever block 6637 * and let the allocator find whatever block
@@ -6578,8 +6648,10 @@ refill_cluster:
6578 * succeeding in the unclustered 6648 * succeeding in the unclustered
6579 * allocation. */ 6649 * allocation. */
6580 if (loop >= LOOP_NO_EMPTY_SIZE && 6650 if (loop >= LOOP_NO_EMPTY_SIZE &&
6581 last_ptr->block_group != block_group) { 6651 used_block_group != block_group) {
6582 spin_unlock(&last_ptr->refill_lock); 6652 spin_unlock(&last_ptr->refill_lock);
6653 btrfs_release_block_group(used_block_group,
6654 delalloc);
6583 goto unclustered_alloc; 6655 goto unclustered_alloc;
6584 } 6656 }
6585 6657
@@ -6589,6 +6661,10 @@ refill_cluster:
6589 */ 6661 */
6590 btrfs_return_cluster_to_free_space(NULL, last_ptr); 6662 btrfs_return_cluster_to_free_space(NULL, last_ptr);
6591 6663
6664 if (used_block_group != block_group)
6665 btrfs_release_block_group(used_block_group,
6666 delalloc);
6667refill_cluster:
6592 if (loop >= LOOP_NO_EMPTY_SIZE) { 6668 if (loop >= LOOP_NO_EMPTY_SIZE) {
6593 spin_unlock(&last_ptr->refill_lock); 6669 spin_unlock(&last_ptr->refill_lock);
6594 goto unclustered_alloc; 6670 goto unclustered_alloc;
@@ -6696,7 +6772,7 @@ checks:
6696 BUG_ON(offset > search_start); 6772 BUG_ON(offset > search_start);
6697 6773
6698 ret = btrfs_update_reserved_bytes(block_group, num_bytes, 6774 ret = btrfs_update_reserved_bytes(block_group, num_bytes,
6699 alloc_type); 6775 alloc_type, delalloc);
6700 if (ret == -EAGAIN) { 6776 if (ret == -EAGAIN) {
6701 btrfs_add_free_space(block_group, offset, num_bytes); 6777 btrfs_add_free_space(block_group, offset, num_bytes);
6702 goto loop; 6778 goto loop;
@@ -6708,13 +6784,13 @@ checks:
6708 6784
6709 trace_btrfs_reserve_extent(orig_root, block_group, 6785 trace_btrfs_reserve_extent(orig_root, block_group,
6710 search_start, num_bytes); 6786 search_start, num_bytes);
6711 btrfs_put_block_group(block_group); 6787 btrfs_release_block_group(block_group, delalloc);
6712 break; 6788 break;
6713loop: 6789loop:
6714 failed_cluster_refill = false; 6790 failed_cluster_refill = false;
6715 failed_alloc = false; 6791 failed_alloc = false;
6716 BUG_ON(index != get_block_group_index(block_group)); 6792 BUG_ON(index != get_block_group_index(block_group));
6717 btrfs_put_block_group(block_group); 6793 btrfs_release_block_group(block_group, delalloc);
6718 } 6794 }
6719 up_read(&space_info->groups_sem); 6795 up_read(&space_info->groups_sem);
6720 6796
@@ -6827,7 +6903,7 @@ again:
6827int btrfs_reserve_extent(struct btrfs_root *root, 6903int btrfs_reserve_extent(struct btrfs_root *root,
6828 u64 num_bytes, u64 min_alloc_size, 6904 u64 num_bytes, u64 min_alloc_size,
6829 u64 empty_size, u64 hint_byte, 6905 u64 empty_size, u64 hint_byte,
6830 struct btrfs_key *ins, int is_data) 6906 struct btrfs_key *ins, int is_data, int delalloc)
6831{ 6907{
6832 bool final_tried = false; 6908 bool final_tried = false;
6833 u64 flags; 6909 u64 flags;
@@ -6837,7 +6913,7 @@ int btrfs_reserve_extent(struct btrfs_root *root,
6837again: 6913again:
6838 WARN_ON(num_bytes < root->sectorsize); 6914 WARN_ON(num_bytes < root->sectorsize);
6839 ret = find_free_extent(root, num_bytes, empty_size, hint_byte, ins, 6915 ret = find_free_extent(root, num_bytes, empty_size, hint_byte, ins,
6840 flags); 6916 flags, delalloc);
6841 6917
6842 if (ret == -ENOSPC) { 6918 if (ret == -ENOSPC) {
6843 if (!final_tried && ins->offset) { 6919 if (!final_tried && ins->offset) {
@@ -6862,7 +6938,8 @@ again:
6862} 6938}
6863 6939
6864static int __btrfs_free_reserved_extent(struct btrfs_root *root, 6940static int __btrfs_free_reserved_extent(struct btrfs_root *root,
6865 u64 start, u64 len, int pin) 6941 u64 start, u64 len,
6942 int pin, int delalloc)
6866{ 6943{
6867 struct btrfs_block_group_cache *cache; 6944 struct btrfs_block_group_cache *cache;
6868 int ret = 0; 6945 int ret = 0;
@@ -6881,7 +6958,7 @@ static int __btrfs_free_reserved_extent(struct btrfs_root *root,
6881 pin_down_extent(root, cache, start, len, 1); 6958 pin_down_extent(root, cache, start, len, 1);
6882 else { 6959 else {
6883 btrfs_add_free_space(cache, start, len); 6960 btrfs_add_free_space(cache, start, len);
6884 btrfs_update_reserved_bytes(cache, len, RESERVE_FREE); 6961 btrfs_update_reserved_bytes(cache, len, RESERVE_FREE, delalloc);
6885 } 6962 }
6886 btrfs_put_block_group(cache); 6963 btrfs_put_block_group(cache);
6887 6964
@@ -6891,15 +6968,15 @@ static int __btrfs_free_reserved_extent(struct btrfs_root *root,
6891} 6968}
6892 6969
6893int btrfs_free_reserved_extent(struct btrfs_root *root, 6970int btrfs_free_reserved_extent(struct btrfs_root *root,
6894 u64 start, u64 len) 6971 u64 start, u64 len, int delalloc)
6895{ 6972{
6896 return __btrfs_free_reserved_extent(root, start, len, 0); 6973 return __btrfs_free_reserved_extent(root, start, len, 0, delalloc);
6897} 6974}
6898 6975
6899int btrfs_free_and_pin_reserved_extent(struct btrfs_root *root, 6976int btrfs_free_and_pin_reserved_extent(struct btrfs_root *root,
6900 u64 start, u64 len) 6977 u64 start, u64 len)
6901{ 6978{
6902 return __btrfs_free_reserved_extent(root, start, len, 1); 6979 return __btrfs_free_reserved_extent(root, start, len, 1, 0);
6903} 6980}
6904 6981
6905static int alloc_reserved_file_extent(struct btrfs_trans_handle *trans, 6982static int alloc_reserved_file_extent(struct btrfs_trans_handle *trans,
@@ -7114,7 +7191,7 @@ int btrfs_alloc_logged_file_extent(struct btrfs_trans_handle *trans,
7114 return -EINVAL; 7191 return -EINVAL;
7115 7192
7116 ret = btrfs_update_reserved_bytes(block_group, ins->offset, 7193 ret = btrfs_update_reserved_bytes(block_group, ins->offset,
7117 RESERVE_ALLOC_NO_ACCOUNT); 7194 RESERVE_ALLOC_NO_ACCOUNT, 0);
7118 BUG_ON(ret); /* logic error */ 7195 BUG_ON(ret); /* logic error */
7119 ret = alloc_reserved_file_extent(trans, root, 0, root_objectid, 7196 ret = alloc_reserved_file_extent(trans, root, 0, root_objectid,
7120 0, owner, offset, ins, 1); 7197 0, owner, offset, ins, 1);
@@ -7256,7 +7333,7 @@ struct extent_buffer *btrfs_alloc_free_block(struct btrfs_trans_handle *trans,
7256 return ERR_CAST(block_rsv); 7333 return ERR_CAST(block_rsv);
7257 7334
7258 ret = btrfs_reserve_extent(root, blocksize, blocksize, 7335 ret = btrfs_reserve_extent(root, blocksize, blocksize,
7259 empty_size, hint, &ins, 0); 7336 empty_size, hint, &ins, 0, 0);
7260 if (ret) { 7337 if (ret) {
7261 unuse_block_rsv(root->fs_info, block_rsv, blocksize); 7338 unuse_block_rsv(root->fs_info, block_rsv, blocksize);
7262 return ERR_PTR(ret); 7339 return ERR_PTR(ret);
@@ -8659,6 +8736,7 @@ btrfs_create_block_group_cache(struct btrfs_root *root, u64 start, u64 size)
8659 start); 8736 start);
8660 atomic_set(&cache->count, 1); 8737 atomic_set(&cache->count, 1);
8661 spin_lock_init(&cache->lock); 8738 spin_lock_init(&cache->lock);
8739 init_rwsem(&cache->data_rwsem);
8662 INIT_LIST_HEAD(&cache->list); 8740 INIT_LIST_HEAD(&cache->list);
8663 INIT_LIST_HEAD(&cache->cluster_list); 8741 INIT_LIST_HEAD(&cache->cluster_list);
8664 INIT_LIST_HEAD(&cache->new_bg_list); 8742 INIT_LIST_HEAD(&cache->new_bg_list);