diff options
Diffstat (limited to 'fs/btrfs/extent-tree.c')
-rw-r--r-- | fs/btrfs/extent-tree.c | 227 |
1 files changed, 135 insertions, 92 deletions
diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c index 06b2635073f3..521e9d4424f6 100644 --- a/fs/btrfs/extent-tree.c +++ b/fs/btrfs/extent-tree.c | |||
@@ -33,6 +33,7 @@ | |||
33 | #include "volumes.h" | 33 | #include "volumes.h" |
34 | #include "locking.h" | 34 | #include "locking.h" |
35 | #include "free-space-cache.h" | 35 | #include "free-space-cache.h" |
36 | #include "math.h" | ||
36 | 37 | ||
37 | #undef SCRAMBLE_DELAYED_REFS | 38 | #undef SCRAMBLE_DELAYED_REFS |
38 | 39 | ||
@@ -649,24 +650,6 @@ void btrfs_clear_space_info_full(struct btrfs_fs_info *info) | |||
649 | rcu_read_unlock(); | 650 | rcu_read_unlock(); |
650 | } | 651 | } |
651 | 652 | ||
652 | static u64 div_factor(u64 num, int factor) | ||
653 | { | ||
654 | if (factor == 10) | ||
655 | return num; | ||
656 | num *= factor; | ||
657 | do_div(num, 10); | ||
658 | return num; | ||
659 | } | ||
660 | |||
661 | static u64 div_factor_fine(u64 num, int factor) | ||
662 | { | ||
663 | if (factor == 100) | ||
664 | return num; | ||
665 | num *= factor; | ||
666 | do_div(num, 100); | ||
667 | return num; | ||
668 | } | ||
669 | |||
670 | u64 btrfs_find_block_group(struct btrfs_root *root, | 653 | u64 btrfs_find_block_group(struct btrfs_root *root, |
671 | u64 search_start, u64 search_hint, int owner) | 654 | u64 search_start, u64 search_hint, int owner) |
672 | { | 655 | { |
@@ -1835,7 +1818,7 @@ static int btrfs_discard_extent(struct btrfs_root *root, u64 bytenr, | |||
1835 | 1818 | ||
1836 | 1819 | ||
1837 | /* Tell the block device(s) that the sectors can be discarded */ | 1820 | /* Tell the block device(s) that the sectors can be discarded */ |
1838 | ret = btrfs_map_block(&root->fs_info->mapping_tree, REQ_DISCARD, | 1821 | ret = btrfs_map_block(root->fs_info, REQ_DISCARD, |
1839 | bytenr, &num_bytes, &bbio, 0); | 1822 | bytenr, &num_bytes, &bbio, 0); |
1840 | /* Error condition is -ENOMEM */ | 1823 | /* Error condition is -ENOMEM */ |
1841 | if (!ret) { | 1824 | if (!ret) { |
@@ -2314,6 +2297,9 @@ static noinline int run_clustered_refs(struct btrfs_trans_handle *trans, | |||
2314 | kfree(extent_op); | 2297 | kfree(extent_op); |
2315 | 2298 | ||
2316 | if (ret) { | 2299 | if (ret) { |
2300 | list_del_init(&locked_ref->cluster); | ||
2301 | mutex_unlock(&locked_ref->mutex); | ||
2302 | |||
2317 | printk(KERN_DEBUG "btrfs: run_delayed_extent_op returned %d\n", ret); | 2303 | printk(KERN_DEBUG "btrfs: run_delayed_extent_op returned %d\n", ret); |
2318 | spin_lock(&delayed_refs->lock); | 2304 | spin_lock(&delayed_refs->lock); |
2319 | return ret; | 2305 | return ret; |
@@ -2356,6 +2342,10 @@ static noinline int run_clustered_refs(struct btrfs_trans_handle *trans, | |||
2356 | count++; | 2342 | count++; |
2357 | 2343 | ||
2358 | if (ret) { | 2344 | if (ret) { |
2345 | if (locked_ref) { | ||
2346 | list_del_init(&locked_ref->cluster); | ||
2347 | mutex_unlock(&locked_ref->mutex); | ||
2348 | } | ||
2359 | printk(KERN_DEBUG "btrfs: run_one_delayed_ref returned %d\n", ret); | 2349 | printk(KERN_DEBUG "btrfs: run_one_delayed_ref returned %d\n", ret); |
2360 | spin_lock(&delayed_refs->lock); | 2350 | spin_lock(&delayed_refs->lock); |
2361 | return ret; | 2351 | return ret; |
@@ -3661,7 +3651,7 @@ out: | |||
3661 | 3651 | ||
3662 | static int can_overcommit(struct btrfs_root *root, | 3652 | static int can_overcommit(struct btrfs_root *root, |
3663 | struct btrfs_space_info *space_info, u64 bytes, | 3653 | struct btrfs_space_info *space_info, u64 bytes, |
3664 | int flush) | 3654 | enum btrfs_reserve_flush_enum flush) |
3665 | { | 3655 | { |
3666 | u64 profile = btrfs_get_alloc_profile(root, 0); | 3656 | u64 profile = btrfs_get_alloc_profile(root, 0); |
3667 | u64 avail; | 3657 | u64 avail; |
@@ -3685,11 +3675,11 @@ static int can_overcommit(struct btrfs_root *root, | |||
3685 | avail >>= 1; | 3675 | avail >>= 1; |
3686 | 3676 | ||
3687 | /* | 3677 | /* |
3688 | * If we aren't flushing don't let us overcommit too much, say | 3678 | * If we aren't flushing all things, let us overcommit up to |
3689 | * 1/8th of the space. If we can flush, let it overcommit up to | 3679 | * 1/2th of the space. If we can flush, don't let us overcommit |
3690 | * 1/2 of the space. | 3680 | * too much, let it overcommit up to 1/8 of the space. |
3691 | */ | 3681 | */ |
3692 | if (flush) | 3682 | if (flush == BTRFS_RESERVE_FLUSH_ALL) |
3693 | avail >>= 3; | 3683 | avail >>= 3; |
3694 | else | 3684 | else |
3695 | avail >>= 1; | 3685 | avail >>= 1; |
@@ -3699,6 +3689,20 @@ static int can_overcommit(struct btrfs_root *root, | |||
3699 | return 0; | 3689 | return 0; |
3700 | } | 3690 | } |
3701 | 3691 | ||
3692 | static int writeback_inodes_sb_nr_if_idle_safe(struct super_block *sb, | ||
3693 | unsigned long nr_pages, | ||
3694 | enum wb_reason reason) | ||
3695 | { | ||
3696 | if (!writeback_in_progress(sb->s_bdi) && | ||
3697 | down_read_trylock(&sb->s_umount)) { | ||
3698 | writeback_inodes_sb_nr(sb, nr_pages, reason); | ||
3699 | up_read(&sb->s_umount); | ||
3700 | return 1; | ||
3701 | } | ||
3702 | |||
3703 | return 0; | ||
3704 | } | ||
3705 | |||
3702 | /* | 3706 | /* |
3703 | * shrink metadata reservation for delalloc | 3707 | * shrink metadata reservation for delalloc |
3704 | */ | 3708 | */ |
@@ -3713,6 +3717,7 @@ static void shrink_delalloc(struct btrfs_root *root, u64 to_reclaim, u64 orig, | |||
3713 | long time_left; | 3717 | long time_left; |
3714 | unsigned long nr_pages = (2 * 1024 * 1024) >> PAGE_CACHE_SHIFT; | 3718 | unsigned long nr_pages = (2 * 1024 * 1024) >> PAGE_CACHE_SHIFT; |
3715 | int loops = 0; | 3719 | int loops = 0; |
3720 | enum btrfs_reserve_flush_enum flush; | ||
3716 | 3721 | ||
3717 | trans = (struct btrfs_trans_handle *)current->journal_info; | 3722 | trans = (struct btrfs_trans_handle *)current->journal_info; |
3718 | block_rsv = &root->fs_info->delalloc_block_rsv; | 3723 | block_rsv = &root->fs_info->delalloc_block_rsv; |
@@ -3730,8 +3735,9 @@ static void shrink_delalloc(struct btrfs_root *root, u64 to_reclaim, u64 orig, | |||
3730 | while (delalloc_bytes && loops < 3) { | 3735 | while (delalloc_bytes && loops < 3) { |
3731 | max_reclaim = min(delalloc_bytes, to_reclaim); | 3736 | max_reclaim = min(delalloc_bytes, to_reclaim); |
3732 | nr_pages = max_reclaim >> PAGE_CACHE_SHIFT; | 3737 | nr_pages = max_reclaim >> PAGE_CACHE_SHIFT; |
3733 | writeback_inodes_sb_nr_if_idle(root->fs_info->sb, nr_pages, | 3738 | writeback_inodes_sb_nr_if_idle_safe(root->fs_info->sb, |
3734 | WB_REASON_FS_FREE_SPACE); | 3739 | nr_pages, |
3740 | WB_REASON_FS_FREE_SPACE); | ||
3735 | 3741 | ||
3736 | /* | 3742 | /* |
3737 | * We need to wait for the async pages to actually start before | 3743 | * We need to wait for the async pages to actually start before |
@@ -3740,8 +3746,12 @@ static void shrink_delalloc(struct btrfs_root *root, u64 to_reclaim, u64 orig, | |||
3740 | wait_event(root->fs_info->async_submit_wait, | 3746 | wait_event(root->fs_info->async_submit_wait, |
3741 | !atomic_read(&root->fs_info->async_delalloc_pages)); | 3747 | !atomic_read(&root->fs_info->async_delalloc_pages)); |
3742 | 3748 | ||
3749 | if (!trans) | ||
3750 | flush = BTRFS_RESERVE_FLUSH_ALL; | ||
3751 | else | ||
3752 | flush = BTRFS_RESERVE_NO_FLUSH; | ||
3743 | spin_lock(&space_info->lock); | 3753 | spin_lock(&space_info->lock); |
3744 | if (can_overcommit(root, space_info, orig, !trans)) { | 3754 | if (can_overcommit(root, space_info, orig, flush)) { |
3745 | spin_unlock(&space_info->lock); | 3755 | spin_unlock(&space_info->lock); |
3746 | break; | 3756 | break; |
3747 | } | 3757 | } |
@@ -3899,7 +3909,8 @@ static int flush_space(struct btrfs_root *root, | |||
3899 | */ | 3909 | */ |
3900 | static int reserve_metadata_bytes(struct btrfs_root *root, | 3910 | static int reserve_metadata_bytes(struct btrfs_root *root, |
3901 | struct btrfs_block_rsv *block_rsv, | 3911 | struct btrfs_block_rsv *block_rsv, |
3902 | u64 orig_bytes, int flush) | 3912 | u64 orig_bytes, |
3913 | enum btrfs_reserve_flush_enum flush) | ||
3903 | { | 3914 | { |
3904 | struct btrfs_space_info *space_info = block_rsv->space_info; | 3915 | struct btrfs_space_info *space_info = block_rsv->space_info; |
3905 | u64 used; | 3916 | u64 used; |
@@ -3912,10 +3923,11 @@ again: | |||
3912 | ret = 0; | 3923 | ret = 0; |
3913 | spin_lock(&space_info->lock); | 3924 | spin_lock(&space_info->lock); |
3914 | /* | 3925 | /* |
3915 | * We only want to wait if somebody other than us is flushing and we are | 3926 | * We only want to wait if somebody other than us is flushing and we |
3916 | * actually alloed to flush. | 3927 | * are actually allowed to flush all things. |
3917 | */ | 3928 | */ |
3918 | while (flush && !flushing && space_info->flush) { | 3929 | while (flush == BTRFS_RESERVE_FLUSH_ALL && !flushing && |
3930 | space_info->flush) { | ||
3919 | spin_unlock(&space_info->lock); | 3931 | spin_unlock(&space_info->lock); |
3920 | /* | 3932 | /* |
3921 | * If we have a trans handle we can't wait because the flusher | 3933 | * If we have a trans handle we can't wait because the flusher |
@@ -3981,23 +3993,40 @@ again: | |||
3981 | * Couldn't make our reservation, save our place so while we're trying | 3993 | * Couldn't make our reservation, save our place so while we're trying |
3982 | * to reclaim space we can actually use it instead of somebody else | 3994 | * to reclaim space we can actually use it instead of somebody else |
3983 | * stealing it from us. | 3995 | * stealing it from us. |
3996 | * | ||
3997 | * We make the other tasks wait for the flush only when we can flush | ||
3998 | * all things. | ||
3984 | */ | 3999 | */ |
3985 | if (ret && flush) { | 4000 | if (ret && flush == BTRFS_RESERVE_FLUSH_ALL) { |
3986 | flushing = true; | 4001 | flushing = true; |
3987 | space_info->flush = 1; | 4002 | space_info->flush = 1; |
3988 | } | 4003 | } |
3989 | 4004 | ||
3990 | spin_unlock(&space_info->lock); | 4005 | spin_unlock(&space_info->lock); |
3991 | 4006 | ||
3992 | if (!ret || !flush) | 4007 | if (!ret || flush == BTRFS_RESERVE_NO_FLUSH) |
3993 | goto out; | 4008 | goto out; |
3994 | 4009 | ||
3995 | ret = flush_space(root, space_info, num_bytes, orig_bytes, | 4010 | ret = flush_space(root, space_info, num_bytes, orig_bytes, |
3996 | flush_state); | 4011 | flush_state); |
3997 | flush_state++; | 4012 | flush_state++; |
4013 | |||
4014 | /* | ||
4015 | * If we are FLUSH_LIMIT, we can not flush delalloc, or the deadlock | ||
4016 | * would happen. So skip delalloc flush. | ||
4017 | */ | ||
4018 | if (flush == BTRFS_RESERVE_FLUSH_LIMIT && | ||
4019 | (flush_state == FLUSH_DELALLOC || | ||
4020 | flush_state == FLUSH_DELALLOC_WAIT)) | ||
4021 | flush_state = ALLOC_CHUNK; | ||
4022 | |||
3998 | if (!ret) | 4023 | if (!ret) |
3999 | goto again; | 4024 | goto again; |
4000 | else if (flush_state <= COMMIT_TRANS) | 4025 | else if (flush == BTRFS_RESERVE_FLUSH_LIMIT && |
4026 | flush_state < COMMIT_TRANS) | ||
4027 | goto again; | ||
4028 | else if (flush == BTRFS_RESERVE_FLUSH_ALL && | ||
4029 | flush_state <= COMMIT_TRANS) | ||
4001 | goto again; | 4030 | goto again; |
4002 | 4031 | ||
4003 | out: | 4032 | out: |
@@ -4148,9 +4177,9 @@ void btrfs_free_block_rsv(struct btrfs_root *root, | |||
4148 | kfree(rsv); | 4177 | kfree(rsv); |
4149 | } | 4178 | } |
4150 | 4179 | ||
4151 | static inline int __block_rsv_add(struct btrfs_root *root, | 4180 | int btrfs_block_rsv_add(struct btrfs_root *root, |
4152 | struct btrfs_block_rsv *block_rsv, | 4181 | struct btrfs_block_rsv *block_rsv, u64 num_bytes, |
4153 | u64 num_bytes, int flush) | 4182 | enum btrfs_reserve_flush_enum flush) |
4154 | { | 4183 | { |
4155 | int ret; | 4184 | int ret; |
4156 | 4185 | ||
@@ -4166,20 +4195,6 @@ static inline int __block_rsv_add(struct btrfs_root *root, | |||
4166 | return ret; | 4195 | return ret; |
4167 | } | 4196 | } |
4168 | 4197 | ||
4169 | int btrfs_block_rsv_add(struct btrfs_root *root, | ||
4170 | struct btrfs_block_rsv *block_rsv, | ||
4171 | u64 num_bytes) | ||
4172 | { | ||
4173 | return __block_rsv_add(root, block_rsv, num_bytes, 1); | ||
4174 | } | ||
4175 | |||
4176 | int btrfs_block_rsv_add_noflush(struct btrfs_root *root, | ||
4177 | struct btrfs_block_rsv *block_rsv, | ||
4178 | u64 num_bytes) | ||
4179 | { | ||
4180 | return __block_rsv_add(root, block_rsv, num_bytes, 0); | ||
4181 | } | ||
4182 | |||
4183 | int btrfs_block_rsv_check(struct btrfs_root *root, | 4198 | int btrfs_block_rsv_check(struct btrfs_root *root, |
4184 | struct btrfs_block_rsv *block_rsv, int min_factor) | 4199 | struct btrfs_block_rsv *block_rsv, int min_factor) |
4185 | { | 4200 | { |
@@ -4198,9 +4213,9 @@ int btrfs_block_rsv_check(struct btrfs_root *root, | |||
4198 | return ret; | 4213 | return ret; |
4199 | } | 4214 | } |
4200 | 4215 | ||
4201 | static inline int __btrfs_block_rsv_refill(struct btrfs_root *root, | 4216 | int btrfs_block_rsv_refill(struct btrfs_root *root, |
4202 | struct btrfs_block_rsv *block_rsv, | 4217 | struct btrfs_block_rsv *block_rsv, u64 min_reserved, |
4203 | u64 min_reserved, int flush) | 4218 | enum btrfs_reserve_flush_enum flush) |
4204 | { | 4219 | { |
4205 | u64 num_bytes = 0; | 4220 | u64 num_bytes = 0; |
4206 | int ret = -ENOSPC; | 4221 | int ret = -ENOSPC; |
@@ -4228,20 +4243,6 @@ static inline int __btrfs_block_rsv_refill(struct btrfs_root *root, | |||
4228 | return ret; | 4243 | return ret; |
4229 | } | 4244 | } |
4230 | 4245 | ||
4231 | int btrfs_block_rsv_refill(struct btrfs_root *root, | ||
4232 | struct btrfs_block_rsv *block_rsv, | ||
4233 | u64 min_reserved) | ||
4234 | { | ||
4235 | return __btrfs_block_rsv_refill(root, block_rsv, min_reserved, 1); | ||
4236 | } | ||
4237 | |||
4238 | int btrfs_block_rsv_refill_noflush(struct btrfs_root *root, | ||
4239 | struct btrfs_block_rsv *block_rsv, | ||
4240 | u64 min_reserved) | ||
4241 | { | ||
4242 | return __btrfs_block_rsv_refill(root, block_rsv, min_reserved, 0); | ||
4243 | } | ||
4244 | |||
4245 | int btrfs_block_rsv_migrate(struct btrfs_block_rsv *src_rsv, | 4246 | int btrfs_block_rsv_migrate(struct btrfs_block_rsv *src_rsv, |
4246 | struct btrfs_block_rsv *dst_rsv, | 4247 | struct btrfs_block_rsv *dst_rsv, |
4247 | u64 num_bytes) | 4248 | u64 num_bytes) |
@@ -4532,17 +4533,27 @@ int btrfs_delalloc_reserve_metadata(struct inode *inode, u64 num_bytes) | |||
4532 | u64 csum_bytes; | 4533 | u64 csum_bytes; |
4533 | unsigned nr_extents = 0; | 4534 | unsigned nr_extents = 0; |
4534 | int extra_reserve = 0; | 4535 | int extra_reserve = 0; |
4535 | int flush = 1; | 4536 | enum btrfs_reserve_flush_enum flush = BTRFS_RESERVE_FLUSH_ALL; |
4536 | int ret; | 4537 | int ret; |
4538 | bool delalloc_lock = true; | ||
4537 | 4539 | ||
4538 | /* Need to be holding the i_mutex here if we aren't free space cache */ | 4540 | /* If we are a free space inode we need to not flush since we will be in |
4539 | if (btrfs_is_free_space_inode(inode)) | 4541 | * the middle of a transaction commit. We also don't need the delalloc |
4540 | flush = 0; | 4542 | * mutex since we won't race with anybody. We need this mostly to make |
4543 | * lockdep shut its filthy mouth. | ||
4544 | */ | ||
4545 | if (btrfs_is_free_space_inode(inode)) { | ||
4546 | flush = BTRFS_RESERVE_NO_FLUSH; | ||
4547 | delalloc_lock = false; | ||
4548 | } | ||
4541 | 4549 | ||
4542 | if (flush && btrfs_transaction_in_commit(root->fs_info)) | 4550 | if (flush != BTRFS_RESERVE_NO_FLUSH && |
4551 | btrfs_transaction_in_commit(root->fs_info)) | ||
4543 | schedule_timeout(1); | 4552 | schedule_timeout(1); |
4544 | 4553 | ||
4545 | mutex_lock(&BTRFS_I(inode)->delalloc_mutex); | 4554 | if (delalloc_lock) |
4555 | mutex_lock(&BTRFS_I(inode)->delalloc_mutex); | ||
4556 | |||
4546 | num_bytes = ALIGN(num_bytes, root->sectorsize); | 4557 | num_bytes = ALIGN(num_bytes, root->sectorsize); |
4547 | 4558 | ||
4548 | spin_lock(&BTRFS_I(inode)->lock); | 4559 | spin_lock(&BTRFS_I(inode)->lock); |
@@ -4572,7 +4583,11 @@ int btrfs_delalloc_reserve_metadata(struct inode *inode, u64 num_bytes) | |||
4572 | ret = btrfs_qgroup_reserve(root, num_bytes + | 4583 | ret = btrfs_qgroup_reserve(root, num_bytes + |
4573 | nr_extents * root->leafsize); | 4584 | nr_extents * root->leafsize); |
4574 | if (ret) { | 4585 | if (ret) { |
4575 | mutex_unlock(&BTRFS_I(inode)->delalloc_mutex); | 4586 | spin_lock(&BTRFS_I(inode)->lock); |
4587 | calc_csum_metadata_size(inode, num_bytes, 0); | ||
4588 | spin_unlock(&BTRFS_I(inode)->lock); | ||
4589 | if (delalloc_lock) | ||
4590 | mutex_unlock(&BTRFS_I(inode)->delalloc_mutex); | ||
4576 | return ret; | 4591 | return ret; |
4577 | } | 4592 | } |
4578 | } | 4593 | } |
@@ -4607,7 +4622,12 @@ int btrfs_delalloc_reserve_metadata(struct inode *inode, u64 num_bytes) | |||
4607 | btrfs_ino(inode), | 4622 | btrfs_ino(inode), |
4608 | to_free, 0); | 4623 | to_free, 0); |
4609 | } | 4624 | } |
4610 | mutex_unlock(&BTRFS_I(inode)->delalloc_mutex); | 4625 | if (root->fs_info->quota_enabled) { |
4626 | btrfs_qgroup_free(root, num_bytes + | ||
4627 | nr_extents * root->leafsize); | ||
4628 | } | ||
4629 | if (delalloc_lock) | ||
4630 | mutex_unlock(&BTRFS_I(inode)->delalloc_mutex); | ||
4611 | return ret; | 4631 | return ret; |
4612 | } | 4632 | } |
4613 | 4633 | ||
@@ -4619,7 +4639,9 @@ int btrfs_delalloc_reserve_metadata(struct inode *inode, u64 num_bytes) | |||
4619 | } | 4639 | } |
4620 | BTRFS_I(inode)->reserved_extents += nr_extents; | 4640 | BTRFS_I(inode)->reserved_extents += nr_extents; |
4621 | spin_unlock(&BTRFS_I(inode)->lock); | 4641 | spin_unlock(&BTRFS_I(inode)->lock); |
4622 | mutex_unlock(&BTRFS_I(inode)->delalloc_mutex); | 4642 | |
4643 | if (delalloc_lock) | ||
4644 | mutex_unlock(&BTRFS_I(inode)->delalloc_mutex); | ||
4623 | 4645 | ||
4624 | if (to_reserve) | 4646 | if (to_reserve) |
4625 | trace_btrfs_space_reservation(root->fs_info,"delalloc", | 4647 | trace_btrfs_space_reservation(root->fs_info,"delalloc", |
@@ -4969,9 +4991,13 @@ static int unpin_extent_range(struct btrfs_root *root, u64 start, u64 end) | |||
4969 | { | 4991 | { |
4970 | struct btrfs_fs_info *fs_info = root->fs_info; | 4992 | struct btrfs_fs_info *fs_info = root->fs_info; |
4971 | struct btrfs_block_group_cache *cache = NULL; | 4993 | struct btrfs_block_group_cache *cache = NULL; |
4994 | struct btrfs_space_info *space_info; | ||
4995 | struct btrfs_block_rsv *global_rsv = &fs_info->global_block_rsv; | ||
4972 | u64 len; | 4996 | u64 len; |
4997 | bool readonly; | ||
4973 | 4998 | ||
4974 | while (start <= end) { | 4999 | while (start <= end) { |
5000 | readonly = false; | ||
4975 | if (!cache || | 5001 | if (!cache || |
4976 | start >= cache->key.objectid + cache->key.offset) { | 5002 | start >= cache->key.objectid + cache->key.offset) { |
4977 | if (cache) | 5003 | if (cache) |
@@ -4989,15 +5015,30 @@ static int unpin_extent_range(struct btrfs_root *root, u64 start, u64 end) | |||
4989 | } | 5015 | } |
4990 | 5016 | ||
4991 | start += len; | 5017 | start += len; |
5018 | space_info = cache->space_info; | ||
4992 | 5019 | ||
4993 | spin_lock(&cache->space_info->lock); | 5020 | spin_lock(&space_info->lock); |
4994 | spin_lock(&cache->lock); | 5021 | spin_lock(&cache->lock); |
4995 | cache->pinned -= len; | 5022 | cache->pinned -= len; |
4996 | cache->space_info->bytes_pinned -= len; | 5023 | space_info->bytes_pinned -= len; |
4997 | if (cache->ro) | 5024 | if (cache->ro) { |
4998 | cache->space_info->bytes_readonly += len; | 5025 | space_info->bytes_readonly += len; |
5026 | readonly = true; | ||
5027 | } | ||
4999 | spin_unlock(&cache->lock); | 5028 | spin_unlock(&cache->lock); |
5000 | spin_unlock(&cache->space_info->lock); | 5029 | if (!readonly && global_rsv->space_info == space_info) { |
5030 | spin_lock(&global_rsv->lock); | ||
5031 | if (!global_rsv->full) { | ||
5032 | len = min(len, global_rsv->size - | ||
5033 | global_rsv->reserved); | ||
5034 | global_rsv->reserved += len; | ||
5035 | space_info->bytes_may_use += len; | ||
5036 | if (global_rsv->reserved >= global_rsv->size) | ||
5037 | global_rsv->full = 1; | ||
5038 | } | ||
5039 | spin_unlock(&global_rsv->lock); | ||
5040 | } | ||
5041 | spin_unlock(&space_info->lock); | ||
5001 | } | 5042 | } |
5002 | 5043 | ||
5003 | if (cache) | 5044 | if (cache) |
@@ -5466,7 +5507,7 @@ wait_block_group_cache_done(struct btrfs_block_group_cache *cache) | |||
5466 | return 0; | 5507 | return 0; |
5467 | } | 5508 | } |
5468 | 5509 | ||
5469 | static int __get_block_group_index(u64 flags) | 5510 | int __get_raid_index(u64 flags) |
5470 | { | 5511 | { |
5471 | int index; | 5512 | int index; |
5472 | 5513 | ||
@@ -5486,7 +5527,7 @@ static int __get_block_group_index(u64 flags) | |||
5486 | 5527 | ||
5487 | static int get_block_group_index(struct btrfs_block_group_cache *cache) | 5528 | static int get_block_group_index(struct btrfs_block_group_cache *cache) |
5488 | { | 5529 | { |
5489 | return __get_block_group_index(cache->flags); | 5530 | return __get_raid_index(cache->flags); |
5490 | } | 5531 | } |
5491 | 5532 | ||
5492 | enum btrfs_loop_type { | 5533 | enum btrfs_loop_type { |
@@ -6269,7 +6310,8 @@ use_block_rsv(struct btrfs_trans_handle *trans, | |||
6269 | block_rsv = get_block_rsv(trans, root); | 6310 | block_rsv = get_block_rsv(trans, root); |
6270 | 6311 | ||
6271 | if (block_rsv->size == 0) { | 6312 | if (block_rsv->size == 0) { |
6272 | ret = reserve_metadata_bytes(root, block_rsv, blocksize, 0); | 6313 | ret = reserve_metadata_bytes(root, block_rsv, blocksize, |
6314 | BTRFS_RESERVE_NO_FLUSH); | ||
6273 | /* | 6315 | /* |
6274 | * If we couldn't reserve metadata bytes try and use some from | 6316 | * If we couldn't reserve metadata bytes try and use some from |
6275 | * the global reserve. | 6317 | * the global reserve. |
@@ -6292,11 +6334,11 @@ use_block_rsv(struct btrfs_trans_handle *trans, | |||
6292 | static DEFINE_RATELIMIT_STATE(_rs, | 6334 | static DEFINE_RATELIMIT_STATE(_rs, |
6293 | DEFAULT_RATELIMIT_INTERVAL, | 6335 | DEFAULT_RATELIMIT_INTERVAL, |
6294 | /*DEFAULT_RATELIMIT_BURST*/ 2); | 6336 | /*DEFAULT_RATELIMIT_BURST*/ 2); |
6295 | if (__ratelimit(&_rs)) { | 6337 | if (__ratelimit(&_rs)) |
6296 | printk(KERN_DEBUG "btrfs: block rsv returned %d\n", ret); | 6338 | WARN(1, KERN_DEBUG "btrfs: block rsv returned %d\n", |
6297 | WARN_ON(1); | 6339 | ret); |
6298 | } | 6340 | ret = reserve_metadata_bytes(root, block_rsv, blocksize, |
6299 | ret = reserve_metadata_bytes(root, block_rsv, blocksize, 0); | 6341 | BTRFS_RESERVE_NO_FLUSH); |
6300 | if (!ret) { | 6342 | if (!ret) { |
6301 | return block_rsv; | 6343 | return block_rsv; |
6302 | } else if (ret && block_rsv != global_rsv) { | 6344 | } else if (ret && block_rsv != global_rsv) { |
@@ -7427,7 +7469,7 @@ int btrfs_can_relocate(struct btrfs_root *root, u64 bytenr) | |||
7427 | */ | 7469 | */ |
7428 | target = get_restripe_target(root->fs_info, block_group->flags); | 7470 | target = get_restripe_target(root->fs_info, block_group->flags); |
7429 | if (target) { | 7471 | if (target) { |
7430 | index = __get_block_group_index(extended_to_chunk(target)); | 7472 | index = __get_raid_index(extended_to_chunk(target)); |
7431 | } else { | 7473 | } else { |
7432 | /* | 7474 | /* |
7433 | * this is just a balance, so if we were marked as full | 7475 | * this is just a balance, so if we were marked as full |
@@ -7461,7 +7503,8 @@ int btrfs_can_relocate(struct btrfs_root *root, u64 bytenr) | |||
7461 | * check to make sure we can actually find a chunk with enough | 7503 | * check to make sure we can actually find a chunk with enough |
7462 | * space to fit our block group in. | 7504 | * space to fit our block group in. |
7463 | */ | 7505 | */ |
7464 | if (device->total_bytes > device->bytes_used + min_free) { | 7506 | if (device->total_bytes > device->bytes_used + min_free && |
7507 | !device->is_tgtdev_for_dev_replace) { | ||
7465 | ret = find_free_dev_extent(device, min_free, | 7508 | ret = find_free_dev_extent(device, min_free, |
7466 | &dev_offset, NULL); | 7509 | &dev_offset, NULL); |
7467 | if (!ret) | 7510 | if (!ret) |