diff options
author | Russell King <rmk+kernel@arm.linux.org.uk> | 2013-10-07 10:43:04 -0400 |
---|---|---|
committer | Russell King <rmk+kernel@arm.linux.org.uk> | 2013-10-07 10:43:04 -0400 |
commit | a56e74f546b64be93731e42d83baf5b538cc1b11 (patch) | |
tree | 18f6dee45d801e57ac9db2a31664b0d5c0762c50 /fs/btrfs/extent-tree.c | |
parent | d08e2e09042bd3f7ef66a35cb4bb92794ab26bb2 (diff) | |
parent | e4e7f10bfc4069925e99cc4b428c3434e30b6c3f (diff) |
Merge branch 'arm-aesbs' of git://git.linaro.org/people/ardbiesheuvel/linux-arm into devel-stable
Diffstat (limited to 'fs/btrfs/extent-tree.c')
-rw-r--r-- | fs/btrfs/extent-tree.c | 57 |
1 files changed, 30 insertions, 27 deletions
diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c index cfb3cf711b34..d58bef130a41 100644 --- a/fs/btrfs/extent-tree.c +++ b/fs/btrfs/extent-tree.c | |||
@@ -3925,7 +3925,6 @@ static int can_overcommit(struct btrfs_root *root, | |||
3925 | u64 space_size; | 3925 | u64 space_size; |
3926 | u64 avail; | 3926 | u64 avail; |
3927 | u64 used; | 3927 | u64 used; |
3928 | u64 to_add; | ||
3929 | 3928 | ||
3930 | used = space_info->bytes_used + space_info->bytes_reserved + | 3929 | used = space_info->bytes_used + space_info->bytes_reserved + |
3931 | space_info->bytes_pinned + space_info->bytes_readonly; | 3930 | space_info->bytes_pinned + space_info->bytes_readonly; |
@@ -3959,25 +3958,17 @@ static int can_overcommit(struct btrfs_root *root, | |||
3959 | BTRFS_BLOCK_GROUP_RAID10)) | 3958 | BTRFS_BLOCK_GROUP_RAID10)) |
3960 | avail >>= 1; | 3959 | avail >>= 1; |
3961 | 3960 | ||
3962 | to_add = space_info->total_bytes; | ||
3963 | |||
3964 | /* | 3961 | /* |
3965 | * If we aren't flushing all things, let us overcommit up to | 3962 | * If we aren't flushing all things, let us overcommit up to |
3966 | * 1/2th of the space. If we can flush, don't let us overcommit | 3963 | * 1/2th of the space. If we can flush, don't let us overcommit |
3967 | * too much, let it overcommit up to 1/8 of the space. | 3964 | * too much, let it overcommit up to 1/8 of the space. |
3968 | */ | 3965 | */ |
3969 | if (flush == BTRFS_RESERVE_FLUSH_ALL) | 3966 | if (flush == BTRFS_RESERVE_FLUSH_ALL) |
3970 | to_add >>= 3; | 3967 | avail >>= 3; |
3971 | else | 3968 | else |
3972 | to_add >>= 1; | 3969 | avail >>= 1; |
3973 | |||
3974 | /* | ||
3975 | * Limit the overcommit to the amount of free space we could possibly | ||
3976 | * allocate for chunks. | ||
3977 | */ | ||
3978 | to_add = min(avail, to_add); | ||
3979 | 3970 | ||
3980 | if (used + bytes < space_info->total_bytes + to_add) | 3971 | if (used + bytes < space_info->total_bytes + avail) |
3981 | return 1; | 3972 | return 1; |
3982 | return 0; | 3973 | return 0; |
3983 | } | 3974 | } |
@@ -4000,7 +3991,7 @@ static void btrfs_writeback_inodes_sb_nr(struct btrfs_root *root, | |||
4000 | */ | 3991 | */ |
4001 | btrfs_start_all_delalloc_inodes(root->fs_info, 0); | 3992 | btrfs_start_all_delalloc_inodes(root->fs_info, 0); |
4002 | if (!current->journal_info) | 3993 | if (!current->journal_info) |
4003 | btrfs_wait_all_ordered_extents(root->fs_info, 0); | 3994 | btrfs_wait_all_ordered_extents(root->fs_info); |
4004 | } | 3995 | } |
4005 | } | 3996 | } |
4006 | 3997 | ||
@@ -4030,7 +4021,7 @@ static void shrink_delalloc(struct btrfs_root *root, u64 to_reclaim, u64 orig, | |||
4030 | if (delalloc_bytes == 0) { | 4021 | if (delalloc_bytes == 0) { |
4031 | if (trans) | 4022 | if (trans) |
4032 | return; | 4023 | return; |
4033 | btrfs_wait_all_ordered_extents(root->fs_info, 0); | 4024 | btrfs_wait_all_ordered_extents(root->fs_info); |
4034 | return; | 4025 | return; |
4035 | } | 4026 | } |
4036 | 4027 | ||
@@ -4058,7 +4049,7 @@ static void shrink_delalloc(struct btrfs_root *root, u64 to_reclaim, u64 orig, | |||
4058 | 4049 | ||
4059 | loops++; | 4050 | loops++; |
4060 | if (wait_ordered && !trans) { | 4051 | if (wait_ordered && !trans) { |
4061 | btrfs_wait_all_ordered_extents(root->fs_info, 0); | 4052 | btrfs_wait_all_ordered_extents(root->fs_info); |
4062 | } else { | 4053 | } else { |
4063 | time_left = schedule_timeout_killable(1); | 4054 | time_left = schedule_timeout_killable(1); |
4064 | if (time_left) | 4055 | if (time_left) |
@@ -4465,7 +4456,6 @@ static void block_rsv_release_bytes(struct btrfs_fs_info *fs_info, | |||
4465 | space_info->bytes_may_use -= num_bytes; | 4456 | space_info->bytes_may_use -= num_bytes; |
4466 | trace_btrfs_space_reservation(fs_info, "space_info", | 4457 | trace_btrfs_space_reservation(fs_info, "space_info", |
4467 | space_info->flags, num_bytes, 0); | 4458 | space_info->flags, num_bytes, 0); |
4468 | space_info->reservation_progress++; | ||
4469 | spin_unlock(&space_info->lock); | 4459 | spin_unlock(&space_info->lock); |
4470 | } | 4460 | } |
4471 | } | 4461 | } |
@@ -4666,7 +4656,6 @@ static void update_global_block_rsv(struct btrfs_fs_info *fs_info) | |||
4666 | sinfo->bytes_may_use -= num_bytes; | 4656 | sinfo->bytes_may_use -= num_bytes; |
4667 | trace_btrfs_space_reservation(fs_info, "space_info", | 4657 | trace_btrfs_space_reservation(fs_info, "space_info", |
4668 | sinfo->flags, num_bytes, 0); | 4658 | sinfo->flags, num_bytes, 0); |
4669 | sinfo->reservation_progress++; | ||
4670 | block_rsv->reserved = block_rsv->size; | 4659 | block_rsv->reserved = block_rsv->size; |
4671 | block_rsv->full = 1; | 4660 | block_rsv->full = 1; |
4672 | } | 4661 | } |
@@ -5446,7 +5435,6 @@ static int btrfs_update_reserved_bytes(struct btrfs_block_group_cache *cache, | |||
5446 | space_info->bytes_readonly += num_bytes; | 5435 | space_info->bytes_readonly += num_bytes; |
5447 | cache->reserved -= num_bytes; | 5436 | cache->reserved -= num_bytes; |
5448 | space_info->bytes_reserved -= num_bytes; | 5437 | space_info->bytes_reserved -= num_bytes; |
5449 | space_info->reservation_progress++; | ||
5450 | } | 5438 | } |
5451 | spin_unlock(&cache->lock); | 5439 | spin_unlock(&cache->lock); |
5452 | spin_unlock(&space_info->lock); | 5440 | spin_unlock(&space_info->lock); |
@@ -6117,10 +6105,13 @@ enum btrfs_loop_type { | |||
6117 | /* | 6105 | /* |
6118 | * walks the btree of allocated extents and find a hole of a given size. | 6106 | * walks the btree of allocated extents and find a hole of a given size. |
6119 | * The key ins is changed to record the hole: | 6107 | * The key ins is changed to record the hole: |
6120 | * ins->objectid == block start | 6108 | * ins->objectid == start position |
6121 | * ins->flags = BTRFS_EXTENT_ITEM_KEY | 6109 | * ins->flags = BTRFS_EXTENT_ITEM_KEY |
6122 | * ins->offset == number of blocks | 6110 | * ins->offset == the size of the hole. |
6123 | * Any available blocks before search_start are skipped. | 6111 | * Any available blocks before search_start are skipped. |
6112 | * | ||
6113 | * If there is no suitable free space, we will record the max size of | ||
6114 | * the free space extent currently. | ||
6124 | */ | 6115 | */ |
6125 | static noinline int find_free_extent(struct btrfs_root *orig_root, | 6116 | static noinline int find_free_extent(struct btrfs_root *orig_root, |
6126 | u64 num_bytes, u64 empty_size, | 6117 | u64 num_bytes, u64 empty_size, |
@@ -6133,6 +6124,7 @@ static noinline int find_free_extent(struct btrfs_root *orig_root, | |||
6133 | struct btrfs_block_group_cache *block_group = NULL; | 6124 | struct btrfs_block_group_cache *block_group = NULL; |
6134 | struct btrfs_block_group_cache *used_block_group; | 6125 | struct btrfs_block_group_cache *used_block_group; |
6135 | u64 search_start = 0; | 6126 | u64 search_start = 0; |
6127 | u64 max_extent_size = 0; | ||
6136 | int empty_cluster = 2 * 1024 * 1024; | 6128 | int empty_cluster = 2 * 1024 * 1024; |
6137 | struct btrfs_space_info *space_info; | 6129 | struct btrfs_space_info *space_info; |
6138 | int loop = 0; | 6130 | int loop = 0; |
@@ -6292,7 +6284,10 @@ have_block_group: | |||
6292 | btrfs_get_block_group(used_block_group); | 6284 | btrfs_get_block_group(used_block_group); |
6293 | 6285 | ||
6294 | offset = btrfs_alloc_from_cluster(used_block_group, | 6286 | offset = btrfs_alloc_from_cluster(used_block_group, |
6295 | last_ptr, num_bytes, used_block_group->key.objectid); | 6287 | last_ptr, |
6288 | num_bytes, | ||
6289 | used_block_group->key.objectid, | ||
6290 | &max_extent_size); | ||
6296 | if (offset) { | 6291 | if (offset) { |
6297 | /* we have a block, we're done */ | 6292 | /* we have a block, we're done */ |
6298 | spin_unlock(&last_ptr->refill_lock); | 6293 | spin_unlock(&last_ptr->refill_lock); |
@@ -6355,8 +6350,10 @@ refill_cluster: | |||
6355 | * cluster | 6350 | * cluster |
6356 | */ | 6351 | */ |
6357 | offset = btrfs_alloc_from_cluster(block_group, | 6352 | offset = btrfs_alloc_from_cluster(block_group, |
6358 | last_ptr, num_bytes, | 6353 | last_ptr, |
6359 | search_start); | 6354 | num_bytes, |
6355 | search_start, | ||
6356 | &max_extent_size); | ||
6360 | if (offset) { | 6357 | if (offset) { |
6361 | /* we found one, proceed */ | 6358 | /* we found one, proceed */ |
6362 | spin_unlock(&last_ptr->refill_lock); | 6359 | spin_unlock(&last_ptr->refill_lock); |
@@ -6391,13 +6388,18 @@ unclustered_alloc: | |||
6391 | if (cached && | 6388 | if (cached && |
6392 | block_group->free_space_ctl->free_space < | 6389 | block_group->free_space_ctl->free_space < |
6393 | num_bytes + empty_cluster + empty_size) { | 6390 | num_bytes + empty_cluster + empty_size) { |
6391 | if (block_group->free_space_ctl->free_space > | ||
6392 | max_extent_size) | ||
6393 | max_extent_size = | ||
6394 | block_group->free_space_ctl->free_space; | ||
6394 | spin_unlock(&block_group->free_space_ctl->tree_lock); | 6395 | spin_unlock(&block_group->free_space_ctl->tree_lock); |
6395 | goto loop; | 6396 | goto loop; |
6396 | } | 6397 | } |
6397 | spin_unlock(&block_group->free_space_ctl->tree_lock); | 6398 | spin_unlock(&block_group->free_space_ctl->tree_lock); |
6398 | 6399 | ||
6399 | offset = btrfs_find_space_for_alloc(block_group, search_start, | 6400 | offset = btrfs_find_space_for_alloc(block_group, search_start, |
6400 | num_bytes, empty_size); | 6401 | num_bytes, empty_size, |
6402 | &max_extent_size); | ||
6401 | /* | 6403 | /* |
6402 | * If we didn't find a chunk, and we haven't failed on this | 6404 | * If we didn't find a chunk, and we haven't failed on this |
6403 | * block group before, and this block group is in the middle of | 6405 | * block group before, and this block group is in the middle of |
@@ -6515,7 +6517,8 @@ loop: | |||
6515 | ret = 0; | 6517 | ret = 0; |
6516 | } | 6518 | } |
6517 | out: | 6519 | out: |
6518 | 6520 | if (ret == -ENOSPC) | |
6521 | ins->offset = max_extent_size; | ||
6519 | return ret; | 6522 | return ret; |
6520 | } | 6523 | } |
6521 | 6524 | ||
@@ -6573,8 +6576,8 @@ again: | |||
6573 | flags); | 6576 | flags); |
6574 | 6577 | ||
6575 | if (ret == -ENOSPC) { | 6578 | if (ret == -ENOSPC) { |
6576 | if (!final_tried) { | 6579 | if (!final_tried && ins->offset) { |
6577 | num_bytes = num_bytes >> 1; | 6580 | num_bytes = min(num_bytes >> 1, ins->offset); |
6578 | num_bytes = round_down(num_bytes, root->sectorsize); | 6581 | num_bytes = round_down(num_bytes, root->sectorsize); |
6579 | num_bytes = max(num_bytes, min_alloc_size); | 6582 | num_bytes = max(num_bytes, min_alloc_size); |
6580 | if (num_bytes == min_alloc_size) | 6583 | if (num_bytes == min_alloc_size) |