diff options
Diffstat (limited to 'fs/btrfs/extent-tree.c')
-rw-r--r-- | fs/btrfs/extent-tree.c | 34 |
1 files changed, 23 insertions, 11 deletions
diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c index 930ae8949737..f0d5718d2587 100644 --- a/fs/btrfs/extent-tree.c +++ b/fs/btrfs/extent-tree.c | |||
@@ -3888,9 +3888,9 @@ int btrfs_block_rsv_check(struct btrfs_root *root, | |||
3888 | return ret; | 3888 | return ret; |
3889 | } | 3889 | } |
3890 | 3890 | ||
3891 | int btrfs_block_rsv_refill(struct btrfs_root *root, | 3891 | static inline int __btrfs_block_rsv_refill(struct btrfs_root *root, |
3892 | struct btrfs_block_rsv *block_rsv, | 3892 | struct btrfs_block_rsv *block_rsv, |
3893 | u64 min_reserved) | 3893 | u64 min_reserved, int flush) |
3894 | { | 3894 | { |
3895 | u64 num_bytes = 0; | 3895 | u64 num_bytes = 0; |
3896 | int ret = -ENOSPC; | 3896 | int ret = -ENOSPC; |
@@ -3909,7 +3909,7 @@ int btrfs_block_rsv_refill(struct btrfs_root *root, | |||
3909 | if (!ret) | 3909 | if (!ret) |
3910 | return 0; | 3910 | return 0; |
3911 | 3911 | ||
3912 | ret = reserve_metadata_bytes(root, block_rsv, num_bytes, 1); | 3912 | ret = reserve_metadata_bytes(root, block_rsv, num_bytes, flush); |
3913 | if (!ret) { | 3913 | if (!ret) { |
3914 | block_rsv_add_bytes(block_rsv, num_bytes, 0); | 3914 | block_rsv_add_bytes(block_rsv, num_bytes, 0); |
3915 | return 0; | 3915 | return 0; |
@@ -3918,6 +3918,20 @@ int btrfs_block_rsv_refill(struct btrfs_root *root, | |||
3918 | return ret; | 3918 | return ret; |
3919 | } | 3919 | } |
3920 | 3920 | ||
3921 | int btrfs_block_rsv_refill(struct btrfs_root *root, | ||
3922 | struct btrfs_block_rsv *block_rsv, | ||
3923 | u64 min_reserved) | ||
3924 | { | ||
3925 | return __btrfs_block_rsv_refill(root, block_rsv, min_reserved, 1); | ||
3926 | } | ||
3927 | |||
3928 | int btrfs_block_rsv_refill_noflush(struct btrfs_root *root, | ||
3929 | struct btrfs_block_rsv *block_rsv, | ||
3930 | u64 min_reserved) | ||
3931 | { | ||
3932 | return __btrfs_block_rsv_refill(root, block_rsv, min_reserved, 0); | ||
3933 | } | ||
3934 | |||
3921 | int btrfs_block_rsv_migrate(struct btrfs_block_rsv *src_rsv, | 3935 | int btrfs_block_rsv_migrate(struct btrfs_block_rsv *src_rsv, |
3922 | struct btrfs_block_rsv *dst_rsv, | 3936 | struct btrfs_block_rsv *dst_rsv, |
3923 | u64 num_bytes) | 3937 | u64 num_bytes) |
@@ -5265,7 +5279,7 @@ alloc: | |||
5265 | spin_lock(&block_group->free_space_ctl->tree_lock); | 5279 | spin_lock(&block_group->free_space_ctl->tree_lock); |
5266 | if (cached && | 5280 | if (cached && |
5267 | block_group->free_space_ctl->free_space < | 5281 | block_group->free_space_ctl->free_space < |
5268 | num_bytes + empty_size) { | 5282 | num_bytes + empty_cluster + empty_size) { |
5269 | spin_unlock(&block_group->free_space_ctl->tree_lock); | 5283 | spin_unlock(&block_group->free_space_ctl->tree_lock); |
5270 | goto loop; | 5284 | goto loop; |
5271 | } | 5285 | } |
@@ -5286,12 +5300,10 @@ alloc: | |||
5286 | * people trying to start a new cluster | 5300 | * people trying to start a new cluster |
5287 | */ | 5301 | */ |
5288 | spin_lock(&last_ptr->refill_lock); | 5302 | spin_lock(&last_ptr->refill_lock); |
5289 | if (last_ptr->block_group && | 5303 | if (!last_ptr->block_group || |
5290 | (last_ptr->block_group->ro || | 5304 | last_ptr->block_group->ro || |
5291 | !block_group_bits(last_ptr->block_group, data))) { | 5305 | !block_group_bits(last_ptr->block_group, data)) |
5292 | offset = 0; | ||
5293 | goto refill_cluster; | 5306 | goto refill_cluster; |
5294 | } | ||
5295 | 5307 | ||
5296 | offset = btrfs_alloc_from_cluster(block_group, last_ptr, | 5308 | offset = btrfs_alloc_from_cluster(block_group, last_ptr, |
5297 | num_bytes, search_start); | 5309 | num_bytes, search_start); |
@@ -5342,7 +5354,7 @@ refill_cluster: | |||
5342 | /* allocate a cluster in this block group */ | 5354 | /* allocate a cluster in this block group */ |
5343 | ret = btrfs_find_space_cluster(trans, root, | 5355 | ret = btrfs_find_space_cluster(trans, root, |
5344 | block_group, last_ptr, | 5356 | block_group, last_ptr, |
5345 | offset, num_bytes, | 5357 | search_start, num_bytes, |
5346 | empty_cluster + empty_size); | 5358 | empty_cluster + empty_size); |
5347 | if (ret == 0) { | 5359 | if (ret == 0) { |
5348 | /* | 5360 | /* |