diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2012-10-09 21:49:20 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2012-10-09 21:49:20 -0400 |
commit | 72055425e53540d9d0e59a57ac8c9b8ce77b62d5 (patch) | |
tree | 8033d7d7bfdf8725eed785d02f7121d201052d2e /fs/btrfs/extent-tree.c | |
parent | fc81c038c2d61d4fcd8150f383fec1ce23087597 (diff) | |
parent | f46dbe3dee853f8a860f889cb2b7ff4c624f2a7a (diff) |
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mason/linux-btrfs
Pull btrfs update from Chris Mason:
"This is a large pull, with the bulk of the updates coming from:
- Hole punching
- send/receive fixes
- fsync performance
- Disk format extension allowing more hardlinks inside a single
directory (btrfs-progs patch required to enable the compat bit for
this one)
I'm cooking more unrelated RAID code, but I wanted to make sure this
original batch makes it in. The largest updates here are relatively
old and have been in testing for some time."
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mason/linux-btrfs: (121 commits)
btrfs: init ref_index to zero in add_inode_ref
Btrfs: remove repeated eb->pages check in, disk-io.c/csum_dirty_buffer
Btrfs: fix page leakage
Btrfs: do not warn_on when we cannot alloc a page for an extent buffer
Btrfs: don't bug on enomem in readpage
Btrfs: cleanup pages properly when ENOMEM in compression
Btrfs: make filesystem read-only when submitting barrier fails
Btrfs: detect corrupted filesystem after write I/O errors
Btrfs: make compress and nodatacow mount options mutually exclusive
btrfs: fix message printing
Btrfs: don't bother committing delayed inode updates when fsyncing
btrfs: move inline function code to header file
Btrfs: remove unnecessary IS_ERR in bio_readpage_error()
btrfs: remove unused function btrfs_insert_some_items()
Btrfs: don't commit instead of overcommitting
Btrfs: confirmation of value is added before trace_btrfs_get_extent() is called
Btrfs: be smarter about dropping things from the tree log
Btrfs: don't lookup csums for prealloc extents
Btrfs: cache extent state when writing out dirty metadata pages
Btrfs: do not hold the file extent leaf locked when adding extent item
...
Diffstat (limited to 'fs/btrfs/extent-tree.c')
-rw-r--r-- | fs/btrfs/extent-tree.c | 376 |
1 files changed, 187 insertions, 189 deletions
diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c index ba58024d40d3..3d3e2c17d8d1 100644 --- a/fs/btrfs/extent-tree.c +++ b/fs/btrfs/extent-tree.c | |||
@@ -94,8 +94,8 @@ static int alloc_reserved_tree_block(struct btrfs_trans_handle *trans, | |||
94 | u64 flags, struct btrfs_disk_key *key, | 94 | u64 flags, struct btrfs_disk_key *key, |
95 | int level, struct btrfs_key *ins); | 95 | int level, struct btrfs_key *ins); |
96 | static int do_chunk_alloc(struct btrfs_trans_handle *trans, | 96 | static int do_chunk_alloc(struct btrfs_trans_handle *trans, |
97 | struct btrfs_root *extent_root, u64 alloc_bytes, | 97 | struct btrfs_root *extent_root, u64 flags, |
98 | u64 flags, int force); | 98 | int force); |
99 | static int find_next_key(struct btrfs_path *path, int level, | 99 | static int find_next_key(struct btrfs_path *path, int level, |
100 | struct btrfs_key *key); | 100 | struct btrfs_key *key); |
101 | static void dump_space_info(struct btrfs_space_info *info, u64 bytes, | 101 | static void dump_space_info(struct btrfs_space_info *info, u64 bytes, |
@@ -312,7 +312,8 @@ static u64 add_new_free_space(struct btrfs_block_group_cache *block_group, | |||
312 | while (start < end) { | 312 | while (start < end) { |
313 | ret = find_first_extent_bit(info->pinned_extents, start, | 313 | ret = find_first_extent_bit(info->pinned_extents, start, |
314 | &extent_start, &extent_end, | 314 | &extent_start, &extent_end, |
315 | EXTENT_DIRTY | EXTENT_UPTODATE); | 315 | EXTENT_DIRTY | EXTENT_UPTODATE, |
316 | NULL); | ||
316 | if (ret) | 317 | if (ret) |
317 | break; | 318 | break; |
318 | 319 | ||
@@ -2361,10 +2362,6 @@ static noinline int run_clustered_refs(struct btrfs_trans_handle *trans, | |||
2361 | } | 2362 | } |
2362 | 2363 | ||
2363 | next: | 2364 | next: |
2364 | do_chunk_alloc(trans, fs_info->extent_root, | ||
2365 | 2 * 1024 * 1024, | ||
2366 | btrfs_get_alloc_profile(root, 0), | ||
2367 | CHUNK_ALLOC_NO_FORCE); | ||
2368 | cond_resched(); | 2365 | cond_resched(); |
2369 | spin_lock(&delayed_refs->lock); | 2366 | spin_lock(&delayed_refs->lock); |
2370 | } | 2367 | } |
@@ -2478,10 +2475,6 @@ int btrfs_run_delayed_refs(struct btrfs_trans_handle *trans, | |||
2478 | if (root == root->fs_info->extent_root) | 2475 | if (root == root->fs_info->extent_root) |
2479 | root = root->fs_info->tree_root; | 2476 | root = root->fs_info->tree_root; |
2480 | 2477 | ||
2481 | do_chunk_alloc(trans, root->fs_info->extent_root, | ||
2482 | 2 * 1024 * 1024, btrfs_get_alloc_profile(root, 0), | ||
2483 | CHUNK_ALLOC_NO_FORCE); | ||
2484 | |||
2485 | btrfs_delayed_refs_qgroup_accounting(trans, root->fs_info); | 2478 | btrfs_delayed_refs_qgroup_accounting(trans, root->fs_info); |
2486 | 2479 | ||
2487 | delayed_refs = &trans->transaction->delayed_refs; | 2480 | delayed_refs = &trans->transaction->delayed_refs; |
@@ -2551,6 +2544,12 @@ again: | |||
2551 | } | 2544 | } |
2552 | 2545 | ||
2553 | if (run_all) { | 2546 | if (run_all) { |
2547 | if (!list_empty(&trans->new_bgs)) { | ||
2548 | spin_unlock(&delayed_refs->lock); | ||
2549 | btrfs_create_pending_block_groups(trans, root); | ||
2550 | spin_lock(&delayed_refs->lock); | ||
2551 | } | ||
2552 | |||
2554 | node = rb_first(&delayed_refs->root); | 2553 | node = rb_first(&delayed_refs->root); |
2555 | if (!node) | 2554 | if (!node) |
2556 | goto out; | 2555 | goto out; |
@@ -3406,7 +3405,6 @@ alloc: | |||
3406 | return PTR_ERR(trans); | 3405 | return PTR_ERR(trans); |
3407 | 3406 | ||
3408 | ret = do_chunk_alloc(trans, root->fs_info->extent_root, | 3407 | ret = do_chunk_alloc(trans, root->fs_info->extent_root, |
3409 | bytes + 2 * 1024 * 1024, | ||
3410 | alloc_target, | 3408 | alloc_target, |
3411 | CHUNK_ALLOC_NO_FORCE); | 3409 | CHUNK_ALLOC_NO_FORCE); |
3412 | btrfs_end_transaction(trans, root); | 3410 | btrfs_end_transaction(trans, root); |
@@ -3488,8 +3486,7 @@ static void force_metadata_allocation(struct btrfs_fs_info *info) | |||
3488 | } | 3486 | } |
3489 | 3487 | ||
3490 | static int should_alloc_chunk(struct btrfs_root *root, | 3488 | static int should_alloc_chunk(struct btrfs_root *root, |
3491 | struct btrfs_space_info *sinfo, u64 alloc_bytes, | 3489 | struct btrfs_space_info *sinfo, int force) |
3492 | int force) | ||
3493 | { | 3490 | { |
3494 | struct btrfs_block_rsv *global_rsv = &root->fs_info->global_block_rsv; | 3491 | struct btrfs_block_rsv *global_rsv = &root->fs_info->global_block_rsv; |
3495 | u64 num_bytes = sinfo->total_bytes - sinfo->bytes_readonly; | 3492 | u64 num_bytes = sinfo->total_bytes - sinfo->bytes_readonly; |
@@ -3504,7 +3501,8 @@ static int should_alloc_chunk(struct btrfs_root *root, | |||
3504 | * and purposes it's used space. Don't worry about locking the | 3501 | * and purposes it's used space. Don't worry about locking the |
3505 | * global_rsv, it doesn't change except when the transaction commits. | 3502 | * global_rsv, it doesn't change except when the transaction commits. |
3506 | */ | 3503 | */ |
3507 | num_allocated += global_rsv->size; | 3504 | if (sinfo->flags & BTRFS_BLOCK_GROUP_METADATA) |
3505 | num_allocated += global_rsv->size; | ||
3508 | 3506 | ||
3509 | /* | 3507 | /* |
3510 | * in limited mode, we want to have some free space up to | 3508 | * in limited mode, we want to have some free space up to |
@@ -3518,15 +3516,8 @@ static int should_alloc_chunk(struct btrfs_root *root, | |||
3518 | if (num_bytes - num_allocated < thresh) | 3516 | if (num_bytes - num_allocated < thresh) |
3519 | return 1; | 3517 | return 1; |
3520 | } | 3518 | } |
3521 | thresh = btrfs_super_total_bytes(root->fs_info->super_copy); | ||
3522 | 3519 | ||
3523 | /* 256MB or 2% of the FS */ | 3520 | if (num_allocated + 2 * 1024 * 1024 < div_factor(num_bytes, 8)) |
3524 | thresh = max_t(u64, 256 * 1024 * 1024, div_factor_fine(thresh, 2)); | ||
3525 | /* system chunks need a much small threshold */ | ||
3526 | if (sinfo->flags & BTRFS_BLOCK_GROUP_SYSTEM) | ||
3527 | thresh = 32 * 1024 * 1024; | ||
3528 | |||
3529 | if (num_bytes > thresh && sinfo->bytes_used < div_factor(num_bytes, 8)) | ||
3530 | return 0; | 3521 | return 0; |
3531 | return 1; | 3522 | return 1; |
3532 | } | 3523 | } |
@@ -3576,8 +3567,7 @@ static void check_system_chunk(struct btrfs_trans_handle *trans, | |||
3576 | } | 3567 | } |
3577 | 3568 | ||
3578 | static int do_chunk_alloc(struct btrfs_trans_handle *trans, | 3569 | static int do_chunk_alloc(struct btrfs_trans_handle *trans, |
3579 | struct btrfs_root *extent_root, u64 alloc_bytes, | 3570 | struct btrfs_root *extent_root, u64 flags, int force) |
3580 | u64 flags, int force) | ||
3581 | { | 3571 | { |
3582 | struct btrfs_space_info *space_info; | 3572 | struct btrfs_space_info *space_info; |
3583 | struct btrfs_fs_info *fs_info = extent_root->fs_info; | 3573 | struct btrfs_fs_info *fs_info = extent_root->fs_info; |
@@ -3601,7 +3591,7 @@ again: | |||
3601 | return 0; | 3591 | return 0; |
3602 | } | 3592 | } |
3603 | 3593 | ||
3604 | if (!should_alloc_chunk(extent_root, space_info, alloc_bytes, force)) { | 3594 | if (!should_alloc_chunk(extent_root, space_info, force)) { |
3605 | spin_unlock(&space_info->lock); | 3595 | spin_unlock(&space_info->lock); |
3606 | return 0; | 3596 | return 0; |
3607 | } else if (space_info->chunk_alloc) { | 3597 | } else if (space_info->chunk_alloc) { |
@@ -3669,6 +3659,46 @@ out: | |||
3669 | return ret; | 3659 | return ret; |
3670 | } | 3660 | } |
3671 | 3661 | ||
3662 | static int can_overcommit(struct btrfs_root *root, | ||
3663 | struct btrfs_space_info *space_info, u64 bytes, | ||
3664 | int flush) | ||
3665 | { | ||
3666 | u64 profile = btrfs_get_alloc_profile(root, 0); | ||
3667 | u64 avail; | ||
3668 | u64 used; | ||
3669 | |||
3670 | used = space_info->bytes_used + space_info->bytes_reserved + | ||
3671 | space_info->bytes_pinned + space_info->bytes_readonly + | ||
3672 | space_info->bytes_may_use; | ||
3673 | |||
3674 | spin_lock(&root->fs_info->free_chunk_lock); | ||
3675 | avail = root->fs_info->free_chunk_space; | ||
3676 | spin_unlock(&root->fs_info->free_chunk_lock); | ||
3677 | |||
3678 | /* | ||
3679 | * If we have dup, raid1 or raid10 then only half of the free | ||
3680 | * space is actually useable. | ||
3681 | */ | ||
3682 | if (profile & (BTRFS_BLOCK_GROUP_DUP | | ||
3683 | BTRFS_BLOCK_GROUP_RAID1 | | ||
3684 | BTRFS_BLOCK_GROUP_RAID10)) | ||
3685 | avail >>= 1; | ||
3686 | |||
3687 | /* | ||
3688 | * If we aren't flushing don't let us overcommit too much, say | ||
3689 | * 1/8th of the space. If we can flush, let it overcommit up to | ||
3690 | * 1/2 of the space. | ||
3691 | */ | ||
3692 | if (flush) | ||
3693 | avail >>= 3; | ||
3694 | else | ||
3695 | avail >>= 1; | ||
3696 | |||
3697 | if (used + bytes < space_info->total_bytes + avail) | ||
3698 | return 1; | ||
3699 | return 0; | ||
3700 | } | ||
3701 | |||
3672 | /* | 3702 | /* |
3673 | * shrink metadata reservation for delalloc | 3703 | * shrink metadata reservation for delalloc |
3674 | */ | 3704 | */ |
@@ -3693,7 +3723,7 @@ static void shrink_delalloc(struct btrfs_root *root, u64 to_reclaim, u64 orig, | |||
3693 | if (delalloc_bytes == 0) { | 3723 | if (delalloc_bytes == 0) { |
3694 | if (trans) | 3724 | if (trans) |
3695 | return; | 3725 | return; |
3696 | btrfs_wait_ordered_extents(root, 0, 0); | 3726 | btrfs_wait_ordered_extents(root, 0); |
3697 | return; | 3727 | return; |
3698 | } | 3728 | } |
3699 | 3729 | ||
@@ -3703,11 +3733,15 @@ static void shrink_delalloc(struct btrfs_root *root, u64 to_reclaim, u64 orig, | |||
3703 | writeback_inodes_sb_nr_if_idle(root->fs_info->sb, nr_pages, | 3733 | writeback_inodes_sb_nr_if_idle(root->fs_info->sb, nr_pages, |
3704 | WB_REASON_FS_FREE_SPACE); | 3734 | WB_REASON_FS_FREE_SPACE); |
3705 | 3735 | ||
3736 | /* | ||
3737 | * We need to wait for the async pages to actually start before | ||
3738 | * we do anything. | ||
3739 | */ | ||
3740 | wait_event(root->fs_info->async_submit_wait, | ||
3741 | !atomic_read(&root->fs_info->async_delalloc_pages)); | ||
3742 | |||
3706 | spin_lock(&space_info->lock); | 3743 | spin_lock(&space_info->lock); |
3707 | if (space_info->bytes_used + space_info->bytes_reserved + | 3744 | if (can_overcommit(root, space_info, orig, !trans)) { |
3708 | space_info->bytes_pinned + space_info->bytes_readonly + | ||
3709 | space_info->bytes_may_use + orig <= | ||
3710 | space_info->total_bytes) { | ||
3711 | spin_unlock(&space_info->lock); | 3745 | spin_unlock(&space_info->lock); |
3712 | break; | 3746 | break; |
3713 | } | 3747 | } |
@@ -3715,7 +3749,7 @@ static void shrink_delalloc(struct btrfs_root *root, u64 to_reclaim, u64 orig, | |||
3715 | 3749 | ||
3716 | loops++; | 3750 | loops++; |
3717 | if (wait_ordered && !trans) { | 3751 | if (wait_ordered && !trans) { |
3718 | btrfs_wait_ordered_extents(root, 0, 0); | 3752 | btrfs_wait_ordered_extents(root, 0); |
3719 | } else { | 3753 | } else { |
3720 | time_left = schedule_timeout_killable(1); | 3754 | time_left = schedule_timeout_killable(1); |
3721 | if (time_left) | 3755 | if (time_left) |
@@ -3784,11 +3818,12 @@ commit: | |||
3784 | } | 3818 | } |
3785 | 3819 | ||
3786 | enum flush_state { | 3820 | enum flush_state { |
3787 | FLUSH_DELALLOC = 1, | 3821 | FLUSH_DELAYED_ITEMS_NR = 1, |
3788 | FLUSH_DELALLOC_WAIT = 2, | 3822 | FLUSH_DELAYED_ITEMS = 2, |
3789 | FLUSH_DELAYED_ITEMS_NR = 3, | 3823 | FLUSH_DELALLOC = 3, |
3790 | FLUSH_DELAYED_ITEMS = 4, | 3824 | FLUSH_DELALLOC_WAIT = 4, |
3791 | COMMIT_TRANS = 5, | 3825 | ALLOC_CHUNK = 5, |
3826 | COMMIT_TRANS = 6, | ||
3792 | }; | 3827 | }; |
3793 | 3828 | ||
3794 | static int flush_space(struct btrfs_root *root, | 3829 | static int flush_space(struct btrfs_root *root, |
@@ -3800,11 +3835,6 @@ static int flush_space(struct btrfs_root *root, | |||
3800 | int ret = 0; | 3835 | int ret = 0; |
3801 | 3836 | ||
3802 | switch (state) { | 3837 | switch (state) { |
3803 | case FLUSH_DELALLOC: | ||
3804 | case FLUSH_DELALLOC_WAIT: | ||
3805 | shrink_delalloc(root, num_bytes, orig_bytes, | ||
3806 | state == FLUSH_DELALLOC_WAIT); | ||
3807 | break; | ||
3808 | case FLUSH_DELAYED_ITEMS_NR: | 3838 | case FLUSH_DELAYED_ITEMS_NR: |
3809 | case FLUSH_DELAYED_ITEMS: | 3839 | case FLUSH_DELAYED_ITEMS: |
3810 | if (state == FLUSH_DELAYED_ITEMS_NR) { | 3840 | if (state == FLUSH_DELAYED_ITEMS_NR) { |
@@ -3825,6 +3855,24 @@ static int flush_space(struct btrfs_root *root, | |||
3825 | ret = btrfs_run_delayed_items_nr(trans, root, nr); | 3855 | ret = btrfs_run_delayed_items_nr(trans, root, nr); |
3826 | btrfs_end_transaction(trans, root); | 3856 | btrfs_end_transaction(trans, root); |
3827 | break; | 3857 | break; |
3858 | case FLUSH_DELALLOC: | ||
3859 | case FLUSH_DELALLOC_WAIT: | ||
3860 | shrink_delalloc(root, num_bytes, orig_bytes, | ||
3861 | state == FLUSH_DELALLOC_WAIT); | ||
3862 | break; | ||
3863 | case ALLOC_CHUNK: | ||
3864 | trans = btrfs_join_transaction(root); | ||
3865 | if (IS_ERR(trans)) { | ||
3866 | ret = PTR_ERR(trans); | ||
3867 | break; | ||
3868 | } | ||
3869 | ret = do_chunk_alloc(trans, root->fs_info->extent_root, | ||
3870 | btrfs_get_alloc_profile(root, 0), | ||
3871 | CHUNK_ALLOC_NO_FORCE); | ||
3872 | btrfs_end_transaction(trans, root); | ||
3873 | if (ret == -ENOSPC) | ||
3874 | ret = 0; | ||
3875 | break; | ||
3828 | case COMMIT_TRANS: | 3876 | case COMMIT_TRANS: |
3829 | ret = may_commit_transaction(root, space_info, orig_bytes, 0); | 3877 | ret = may_commit_transaction(root, space_info, orig_bytes, 0); |
3830 | break; | 3878 | break; |
@@ -3856,10 +3904,9 @@ static int reserve_metadata_bytes(struct btrfs_root *root, | |||
3856 | struct btrfs_space_info *space_info = block_rsv->space_info; | 3904 | struct btrfs_space_info *space_info = block_rsv->space_info; |
3857 | u64 used; | 3905 | u64 used; |
3858 | u64 num_bytes = orig_bytes; | 3906 | u64 num_bytes = orig_bytes; |
3859 | int flush_state = FLUSH_DELALLOC; | 3907 | int flush_state = FLUSH_DELAYED_ITEMS_NR; |
3860 | int ret = 0; | 3908 | int ret = 0; |
3861 | bool flushing = false; | 3909 | bool flushing = false; |
3862 | bool committed = false; | ||
3863 | 3910 | ||
3864 | again: | 3911 | again: |
3865 | ret = 0; | 3912 | ret = 0; |
@@ -3922,57 +3969,12 @@ again: | |||
3922 | (orig_bytes * 2); | 3969 | (orig_bytes * 2); |
3923 | } | 3970 | } |
3924 | 3971 | ||
3925 | if (ret) { | 3972 | if (ret && can_overcommit(root, space_info, orig_bytes, flush)) { |
3926 | u64 profile = btrfs_get_alloc_profile(root, 0); | 3973 | space_info->bytes_may_use += orig_bytes; |
3927 | u64 avail; | 3974 | trace_btrfs_space_reservation(root->fs_info, "space_info", |
3928 | 3975 | space_info->flags, orig_bytes, | |
3929 | /* | 3976 | 1); |
3930 | * If we have a lot of space that's pinned, don't bother doing | 3977 | ret = 0; |
3931 | * the overcommit dance yet and just commit the transaction. | ||
3932 | */ | ||
3933 | avail = (space_info->total_bytes - space_info->bytes_used) * 8; | ||
3934 | do_div(avail, 10); | ||
3935 | if (space_info->bytes_pinned >= avail && flush && !committed) { | ||
3936 | space_info->flush = 1; | ||
3937 | flushing = true; | ||
3938 | spin_unlock(&space_info->lock); | ||
3939 | ret = may_commit_transaction(root, space_info, | ||
3940 | orig_bytes, 1); | ||
3941 | if (ret) | ||
3942 | goto out; | ||
3943 | committed = true; | ||
3944 | goto again; | ||
3945 | } | ||
3946 | |||
3947 | spin_lock(&root->fs_info->free_chunk_lock); | ||
3948 | avail = root->fs_info->free_chunk_space; | ||
3949 | |||
3950 | /* | ||
3951 | * If we have dup, raid1 or raid10 then only half of the free | ||
3952 | * space is actually useable. | ||
3953 | */ | ||
3954 | if (profile & (BTRFS_BLOCK_GROUP_DUP | | ||
3955 | BTRFS_BLOCK_GROUP_RAID1 | | ||
3956 | BTRFS_BLOCK_GROUP_RAID10)) | ||
3957 | avail >>= 1; | ||
3958 | |||
3959 | /* | ||
3960 | * If we aren't flushing don't let us overcommit too much, say | ||
3961 | * 1/8th of the space. If we can flush, let it overcommit up to | ||
3962 | * 1/2 of the space. | ||
3963 | */ | ||
3964 | if (flush) | ||
3965 | avail >>= 3; | ||
3966 | else | ||
3967 | avail >>= 1; | ||
3968 | spin_unlock(&root->fs_info->free_chunk_lock); | ||
3969 | |||
3970 | if (used + num_bytes < space_info->total_bytes + avail) { | ||
3971 | space_info->bytes_may_use += orig_bytes; | ||
3972 | trace_btrfs_space_reservation(root->fs_info, | ||
3973 | "space_info", space_info->flags, orig_bytes, 1); | ||
3974 | ret = 0; | ||
3975 | } | ||
3976 | } | 3978 | } |
3977 | 3979 | ||
3978 | /* | 3980 | /* |
@@ -4114,13 +4116,15 @@ static int block_rsv_migrate_bytes(struct btrfs_block_rsv *src, | |||
4114 | return 0; | 4116 | return 0; |
4115 | } | 4117 | } |
4116 | 4118 | ||
4117 | void btrfs_init_block_rsv(struct btrfs_block_rsv *rsv) | 4119 | void btrfs_init_block_rsv(struct btrfs_block_rsv *rsv, unsigned short type) |
4118 | { | 4120 | { |
4119 | memset(rsv, 0, sizeof(*rsv)); | 4121 | memset(rsv, 0, sizeof(*rsv)); |
4120 | spin_lock_init(&rsv->lock); | 4122 | spin_lock_init(&rsv->lock); |
4123 | rsv->type = type; | ||
4121 | } | 4124 | } |
4122 | 4125 | ||
4123 | struct btrfs_block_rsv *btrfs_alloc_block_rsv(struct btrfs_root *root) | 4126 | struct btrfs_block_rsv *btrfs_alloc_block_rsv(struct btrfs_root *root, |
4127 | unsigned short type) | ||
4124 | { | 4128 | { |
4125 | struct btrfs_block_rsv *block_rsv; | 4129 | struct btrfs_block_rsv *block_rsv; |
4126 | struct btrfs_fs_info *fs_info = root->fs_info; | 4130 | struct btrfs_fs_info *fs_info = root->fs_info; |
@@ -4129,7 +4133,7 @@ struct btrfs_block_rsv *btrfs_alloc_block_rsv(struct btrfs_root *root) | |||
4129 | if (!block_rsv) | 4133 | if (!block_rsv) |
4130 | return NULL; | 4134 | return NULL; |
4131 | 4135 | ||
4132 | btrfs_init_block_rsv(block_rsv); | 4136 | btrfs_init_block_rsv(block_rsv, type); |
4133 | block_rsv->space_info = __find_space_info(fs_info, | 4137 | block_rsv->space_info = __find_space_info(fs_info, |
4134 | BTRFS_BLOCK_GROUP_METADATA); | 4138 | BTRFS_BLOCK_GROUP_METADATA); |
4135 | return block_rsv; | 4139 | return block_rsv; |
@@ -4138,6 +4142,8 @@ struct btrfs_block_rsv *btrfs_alloc_block_rsv(struct btrfs_root *root) | |||
4138 | void btrfs_free_block_rsv(struct btrfs_root *root, | 4142 | void btrfs_free_block_rsv(struct btrfs_root *root, |
4139 | struct btrfs_block_rsv *rsv) | 4143 | struct btrfs_block_rsv *rsv) |
4140 | { | 4144 | { |
4145 | if (!rsv) | ||
4146 | return; | ||
4141 | btrfs_block_rsv_release(root, rsv, (u64)-1); | 4147 | btrfs_block_rsv_release(root, rsv, (u64)-1); |
4142 | kfree(rsv); | 4148 | kfree(rsv); |
4143 | } | 4149 | } |
@@ -4416,10 +4422,10 @@ int btrfs_snap_reserve_metadata(struct btrfs_trans_handle *trans, | |||
4416 | struct btrfs_block_rsv *src_rsv = get_block_rsv(trans, root); | 4422 | struct btrfs_block_rsv *src_rsv = get_block_rsv(trans, root); |
4417 | struct btrfs_block_rsv *dst_rsv = &pending->block_rsv; | 4423 | struct btrfs_block_rsv *dst_rsv = &pending->block_rsv; |
4418 | /* | 4424 | /* |
4419 | * two for root back/forward refs, two for directory entries | 4425 | * two for root back/forward refs, two for directory entries, |
4420 | * and one for root of the snapshot. | 4426 | * one for root of the snapshot and one for parent inode. |
4421 | */ | 4427 | */ |
4422 | u64 num_bytes = btrfs_calc_trans_metadata_size(root, 5); | 4428 | u64 num_bytes = btrfs_calc_trans_metadata_size(root, 6); |
4423 | dst_rsv->space_info = src_rsv->space_info; | 4429 | dst_rsv->space_info = src_rsv->space_info; |
4424 | return block_rsv_migrate_bytes(src_rsv, dst_rsv, num_bytes); | 4430 | return block_rsv_migrate_bytes(src_rsv, dst_rsv, num_bytes); |
4425 | } | 4431 | } |
@@ -5018,7 +5024,7 @@ int btrfs_finish_extent_commit(struct btrfs_trans_handle *trans, | |||
5018 | 5024 | ||
5019 | while (1) { | 5025 | while (1) { |
5020 | ret = find_first_extent_bit(unpin, 0, &start, &end, | 5026 | ret = find_first_extent_bit(unpin, 0, &start, &end, |
5021 | EXTENT_DIRTY); | 5027 | EXTENT_DIRTY, NULL); |
5022 | if (ret) | 5028 | if (ret) |
5023 | break; | 5029 | break; |
5024 | 5030 | ||
@@ -5096,8 +5102,10 @@ static int __btrfs_free_extent(struct btrfs_trans_handle *trans, | |||
5096 | ret = remove_extent_backref(trans, extent_root, path, | 5102 | ret = remove_extent_backref(trans, extent_root, path, |
5097 | NULL, refs_to_drop, | 5103 | NULL, refs_to_drop, |
5098 | is_data); | 5104 | is_data); |
5099 | if (ret) | 5105 | if (ret) { |
5100 | goto abort; | 5106 | btrfs_abort_transaction(trans, extent_root, ret); |
5107 | goto out; | ||
5108 | } | ||
5101 | btrfs_release_path(path); | 5109 | btrfs_release_path(path); |
5102 | path->leave_spinning = 1; | 5110 | path->leave_spinning = 1; |
5103 | 5111 | ||
@@ -5115,8 +5123,10 @@ static int __btrfs_free_extent(struct btrfs_trans_handle *trans, | |||
5115 | btrfs_print_leaf(extent_root, | 5123 | btrfs_print_leaf(extent_root, |
5116 | path->nodes[0]); | 5124 | path->nodes[0]); |
5117 | } | 5125 | } |
5118 | if (ret < 0) | 5126 | if (ret < 0) { |
5119 | goto abort; | 5127 | btrfs_abort_transaction(trans, extent_root, ret); |
5128 | goto out; | ||
5129 | } | ||
5120 | extent_slot = path->slots[0]; | 5130 | extent_slot = path->slots[0]; |
5121 | } | 5131 | } |
5122 | } else if (ret == -ENOENT) { | 5132 | } else if (ret == -ENOENT) { |
@@ -5130,7 +5140,8 @@ static int __btrfs_free_extent(struct btrfs_trans_handle *trans, | |||
5130 | (unsigned long long)owner_objectid, | 5140 | (unsigned long long)owner_objectid, |
5131 | (unsigned long long)owner_offset); | 5141 | (unsigned long long)owner_offset); |
5132 | } else { | 5142 | } else { |
5133 | goto abort; | 5143 | btrfs_abort_transaction(trans, extent_root, ret); |
5144 | goto out; | ||
5134 | } | 5145 | } |
5135 | 5146 | ||
5136 | leaf = path->nodes[0]; | 5147 | leaf = path->nodes[0]; |
@@ -5140,8 +5151,10 @@ static int __btrfs_free_extent(struct btrfs_trans_handle *trans, | |||
5140 | BUG_ON(found_extent || extent_slot != path->slots[0]); | 5151 | BUG_ON(found_extent || extent_slot != path->slots[0]); |
5141 | ret = convert_extent_item_v0(trans, extent_root, path, | 5152 | ret = convert_extent_item_v0(trans, extent_root, path, |
5142 | owner_objectid, 0); | 5153 | owner_objectid, 0); |
5143 | if (ret < 0) | 5154 | if (ret < 0) { |
5144 | goto abort; | 5155 | btrfs_abort_transaction(trans, extent_root, ret); |
5156 | goto out; | ||
5157 | } | ||
5145 | 5158 | ||
5146 | btrfs_release_path(path); | 5159 | btrfs_release_path(path); |
5147 | path->leave_spinning = 1; | 5160 | path->leave_spinning = 1; |
@@ -5158,8 +5171,11 @@ static int __btrfs_free_extent(struct btrfs_trans_handle *trans, | |||
5158 | (unsigned long long)bytenr); | 5171 | (unsigned long long)bytenr); |
5159 | btrfs_print_leaf(extent_root, path->nodes[0]); | 5172 | btrfs_print_leaf(extent_root, path->nodes[0]); |
5160 | } | 5173 | } |
5161 | if (ret < 0) | 5174 | if (ret < 0) { |
5162 | goto abort; | 5175 | btrfs_abort_transaction(trans, extent_root, ret); |
5176 | goto out; | ||
5177 | } | ||
5178 | |||
5163 | extent_slot = path->slots[0]; | 5179 | extent_slot = path->slots[0]; |
5164 | leaf = path->nodes[0]; | 5180 | leaf = path->nodes[0]; |
5165 | item_size = btrfs_item_size_nr(leaf, extent_slot); | 5181 | item_size = btrfs_item_size_nr(leaf, extent_slot); |
@@ -5196,8 +5212,10 @@ static int __btrfs_free_extent(struct btrfs_trans_handle *trans, | |||
5196 | ret = remove_extent_backref(trans, extent_root, path, | 5212 | ret = remove_extent_backref(trans, extent_root, path, |
5197 | iref, refs_to_drop, | 5213 | iref, refs_to_drop, |
5198 | is_data); | 5214 | is_data); |
5199 | if (ret) | 5215 | if (ret) { |
5200 | goto abort; | 5216 | btrfs_abort_transaction(trans, extent_root, ret); |
5217 | goto out; | ||
5218 | } | ||
5201 | } | 5219 | } |
5202 | } else { | 5220 | } else { |
5203 | if (found_extent) { | 5221 | if (found_extent) { |
@@ -5214,27 +5232,29 @@ static int __btrfs_free_extent(struct btrfs_trans_handle *trans, | |||
5214 | 5232 | ||
5215 | ret = btrfs_del_items(trans, extent_root, path, path->slots[0], | 5233 | ret = btrfs_del_items(trans, extent_root, path, path->slots[0], |
5216 | num_to_del); | 5234 | num_to_del); |
5217 | if (ret) | 5235 | if (ret) { |
5218 | goto abort; | 5236 | btrfs_abort_transaction(trans, extent_root, ret); |
5237 | goto out; | ||
5238 | } | ||
5219 | btrfs_release_path(path); | 5239 | btrfs_release_path(path); |
5220 | 5240 | ||
5221 | if (is_data) { | 5241 | if (is_data) { |
5222 | ret = btrfs_del_csums(trans, root, bytenr, num_bytes); | 5242 | ret = btrfs_del_csums(trans, root, bytenr, num_bytes); |
5223 | if (ret) | 5243 | if (ret) { |
5224 | goto abort; | 5244 | btrfs_abort_transaction(trans, extent_root, ret); |
5245 | goto out; | ||
5246 | } | ||
5225 | } | 5247 | } |
5226 | 5248 | ||
5227 | ret = update_block_group(trans, root, bytenr, num_bytes, 0); | 5249 | ret = update_block_group(trans, root, bytenr, num_bytes, 0); |
5228 | if (ret) | 5250 | if (ret) { |
5229 | goto abort; | 5251 | btrfs_abort_transaction(trans, extent_root, ret); |
5252 | goto out; | ||
5253 | } | ||
5230 | } | 5254 | } |
5231 | out: | 5255 | out: |
5232 | btrfs_free_path(path); | 5256 | btrfs_free_path(path); |
5233 | return ret; | 5257 | return ret; |
5234 | |||
5235 | abort: | ||
5236 | btrfs_abort_transaction(trans, extent_root, ret); | ||
5237 | goto out; | ||
5238 | } | 5258 | } |
5239 | 5259 | ||
5240 | /* | 5260 | /* |
@@ -5497,8 +5517,6 @@ static noinline int find_free_extent(struct btrfs_trans_handle *trans, | |||
5497 | struct btrfs_block_group_cache *used_block_group; | 5517 | struct btrfs_block_group_cache *used_block_group; |
5498 | u64 search_start = 0; | 5518 | u64 search_start = 0; |
5499 | int empty_cluster = 2 * 1024 * 1024; | 5519 | int empty_cluster = 2 * 1024 * 1024; |
5500 | int allowed_chunk_alloc = 0; | ||
5501 | int done_chunk_alloc = 0; | ||
5502 | struct btrfs_space_info *space_info; | 5520 | struct btrfs_space_info *space_info; |
5503 | int loop = 0; | 5521 | int loop = 0; |
5504 | int index = 0; | 5522 | int index = 0; |
@@ -5530,9 +5548,6 @@ static noinline int find_free_extent(struct btrfs_trans_handle *trans, | |||
5530 | if (btrfs_mixed_space_info(space_info)) | 5548 | if (btrfs_mixed_space_info(space_info)) |
5531 | use_cluster = false; | 5549 | use_cluster = false; |
5532 | 5550 | ||
5533 | if (orig_root->ref_cows || empty_size) | ||
5534 | allowed_chunk_alloc = 1; | ||
5535 | |||
5536 | if (data & BTRFS_BLOCK_GROUP_METADATA && use_cluster) { | 5551 | if (data & BTRFS_BLOCK_GROUP_METADATA && use_cluster) { |
5537 | last_ptr = &root->fs_info->meta_alloc_cluster; | 5552 | last_ptr = &root->fs_info->meta_alloc_cluster; |
5538 | if (!btrfs_test_opt(root, SSD)) | 5553 | if (!btrfs_test_opt(root, SSD)) |
@@ -5806,10 +5821,6 @@ checks: | |||
5806 | 5821 | ||
5807 | trace_btrfs_reserve_extent(orig_root, block_group, | 5822 | trace_btrfs_reserve_extent(orig_root, block_group, |
5808 | search_start, num_bytes); | 5823 | search_start, num_bytes); |
5809 | if (offset < search_start) | ||
5810 | btrfs_add_free_space(used_block_group, offset, | ||
5811 | search_start - offset); | ||
5812 | BUG_ON(offset > search_start); | ||
5813 | if (used_block_group != block_group) | 5824 | if (used_block_group != block_group) |
5814 | btrfs_put_block_group(used_block_group); | 5825 | btrfs_put_block_group(used_block_group); |
5815 | btrfs_put_block_group(block_group); | 5826 | btrfs_put_block_group(block_group); |
@@ -5842,34 +5853,17 @@ loop: | |||
5842 | index = 0; | 5853 | index = 0; |
5843 | loop++; | 5854 | loop++; |
5844 | if (loop == LOOP_ALLOC_CHUNK) { | 5855 | if (loop == LOOP_ALLOC_CHUNK) { |
5845 | if (allowed_chunk_alloc) { | 5856 | ret = do_chunk_alloc(trans, root, data, |
5846 | ret = do_chunk_alloc(trans, root, num_bytes + | 5857 | CHUNK_ALLOC_FORCE); |
5847 | 2 * 1024 * 1024, data, | 5858 | /* |
5848 | CHUNK_ALLOC_LIMITED); | 5859 | * Do not bail out on ENOSPC since we |
5849 | /* | 5860 | * can do more things. |
5850 | * Do not bail out on ENOSPC since we | 5861 | */ |
5851 | * can do more things. | 5862 | if (ret < 0 && ret != -ENOSPC) { |
5852 | */ | 5863 | btrfs_abort_transaction(trans, |
5853 | if (ret < 0 && ret != -ENOSPC) { | 5864 | root, ret); |
5854 | btrfs_abort_transaction(trans, | 5865 | goto out; |
5855 | root, ret); | ||
5856 | goto out; | ||
5857 | } | ||
5858 | allowed_chunk_alloc = 0; | ||
5859 | if (ret == 1) | ||
5860 | done_chunk_alloc = 1; | ||
5861 | } else if (!done_chunk_alloc && | ||
5862 | space_info->force_alloc == | ||
5863 | CHUNK_ALLOC_NO_FORCE) { | ||
5864 | space_info->force_alloc = CHUNK_ALLOC_LIMITED; | ||
5865 | } | 5866 | } |
5866 | |||
5867 | /* | ||
5868 | * We didn't allocate a chunk, go ahead and drop the | ||
5869 | * empty size and loop again. | ||
5870 | */ | ||
5871 | if (!done_chunk_alloc) | ||
5872 | loop = LOOP_NO_EMPTY_SIZE; | ||
5873 | } | 5867 | } |
5874 | 5868 | ||
5875 | if (loop == LOOP_NO_EMPTY_SIZE) { | 5869 | if (loop == LOOP_NO_EMPTY_SIZE) { |
@@ -5944,20 +5938,6 @@ int btrfs_reserve_extent(struct btrfs_trans_handle *trans, | |||
5944 | 5938 | ||
5945 | data = btrfs_get_alloc_profile(root, data); | 5939 | data = btrfs_get_alloc_profile(root, data); |
5946 | again: | 5940 | again: |
5947 | /* | ||
5948 | * the only place that sets empty_size is btrfs_realloc_node, which | ||
5949 | * is not called recursively on allocations | ||
5950 | */ | ||
5951 | if (empty_size || root->ref_cows) { | ||
5952 | ret = do_chunk_alloc(trans, root->fs_info->extent_root, | ||
5953 | num_bytes + 2 * 1024 * 1024, data, | ||
5954 | CHUNK_ALLOC_NO_FORCE); | ||
5955 | if (ret < 0 && ret != -ENOSPC) { | ||
5956 | btrfs_abort_transaction(trans, root, ret); | ||
5957 | return ret; | ||
5958 | } | ||
5959 | } | ||
5960 | |||
5961 | WARN_ON(num_bytes < root->sectorsize); | 5941 | WARN_ON(num_bytes < root->sectorsize); |
5962 | ret = find_free_extent(trans, root, num_bytes, empty_size, | 5942 | ret = find_free_extent(trans, root, num_bytes, empty_size, |
5963 | hint_byte, ins, data); | 5943 | hint_byte, ins, data); |
@@ -5967,12 +5947,6 @@ again: | |||
5967 | num_bytes = num_bytes >> 1; | 5947 | num_bytes = num_bytes >> 1; |
5968 | num_bytes = num_bytes & ~(root->sectorsize - 1); | 5948 | num_bytes = num_bytes & ~(root->sectorsize - 1); |
5969 | num_bytes = max(num_bytes, min_alloc_size); | 5949 | num_bytes = max(num_bytes, min_alloc_size); |
5970 | ret = do_chunk_alloc(trans, root->fs_info->extent_root, | ||
5971 | num_bytes, data, CHUNK_ALLOC_FORCE); | ||
5972 | if (ret < 0 && ret != -ENOSPC) { | ||
5973 | btrfs_abort_transaction(trans, root, ret); | ||
5974 | return ret; | ||
5975 | } | ||
5976 | if (num_bytes == min_alloc_size) | 5950 | if (num_bytes == min_alloc_size) |
5977 | final_tried = true; | 5951 | final_tried = true; |
5978 | goto again; | 5952 | goto again; |
@@ -6314,7 +6288,7 @@ use_block_rsv(struct btrfs_trans_handle *trans, | |||
6314 | ret = block_rsv_use_bytes(block_rsv, blocksize); | 6288 | ret = block_rsv_use_bytes(block_rsv, blocksize); |
6315 | if (!ret) | 6289 | if (!ret) |
6316 | return block_rsv; | 6290 | return block_rsv; |
6317 | if (ret) { | 6291 | if (ret && !block_rsv->failfast) { |
6318 | static DEFINE_RATELIMIT_STATE(_rs, | 6292 | static DEFINE_RATELIMIT_STATE(_rs, |
6319 | DEFAULT_RATELIMIT_INTERVAL, | 6293 | DEFAULT_RATELIMIT_INTERVAL, |
6320 | /*DEFAULT_RATELIMIT_BURST*/ 2); | 6294 | /*DEFAULT_RATELIMIT_BURST*/ 2); |
@@ -7279,7 +7253,7 @@ int btrfs_set_block_group_ro(struct btrfs_root *root, | |||
7279 | 7253 | ||
7280 | alloc_flags = update_block_group_flags(root, cache->flags); | 7254 | alloc_flags = update_block_group_flags(root, cache->flags); |
7281 | if (alloc_flags != cache->flags) { | 7255 | if (alloc_flags != cache->flags) { |
7282 | ret = do_chunk_alloc(trans, root, 2 * 1024 * 1024, alloc_flags, | 7256 | ret = do_chunk_alloc(trans, root, alloc_flags, |
7283 | CHUNK_ALLOC_FORCE); | 7257 | CHUNK_ALLOC_FORCE); |
7284 | if (ret < 0) | 7258 | if (ret < 0) |
7285 | goto out; | 7259 | goto out; |
@@ -7289,7 +7263,7 @@ int btrfs_set_block_group_ro(struct btrfs_root *root, | |||
7289 | if (!ret) | 7263 | if (!ret) |
7290 | goto out; | 7264 | goto out; |
7291 | alloc_flags = get_alloc_profile(root, cache->space_info->flags); | 7265 | alloc_flags = get_alloc_profile(root, cache->space_info->flags); |
7292 | ret = do_chunk_alloc(trans, root, 2 * 1024 * 1024, alloc_flags, | 7266 | ret = do_chunk_alloc(trans, root, alloc_flags, |
7293 | CHUNK_ALLOC_FORCE); | 7267 | CHUNK_ALLOC_FORCE); |
7294 | if (ret < 0) | 7268 | if (ret < 0) |
7295 | goto out; | 7269 | goto out; |
@@ -7303,7 +7277,7 @@ int btrfs_force_chunk_alloc(struct btrfs_trans_handle *trans, | |||
7303 | struct btrfs_root *root, u64 type) | 7277 | struct btrfs_root *root, u64 type) |
7304 | { | 7278 | { |
7305 | u64 alloc_flags = get_alloc_profile(root, type); | 7279 | u64 alloc_flags = get_alloc_profile(root, type); |
7306 | return do_chunk_alloc(trans, root, 2 * 1024 * 1024, alloc_flags, | 7280 | return do_chunk_alloc(trans, root, alloc_flags, |
7307 | CHUNK_ALLOC_FORCE); | 7281 | CHUNK_ALLOC_FORCE); |
7308 | } | 7282 | } |
7309 | 7283 | ||
@@ -7810,6 +7784,34 @@ error: | |||
7810 | return ret; | 7784 | return ret; |
7811 | } | 7785 | } |
7812 | 7786 | ||
7787 | void btrfs_create_pending_block_groups(struct btrfs_trans_handle *trans, | ||
7788 | struct btrfs_root *root) | ||
7789 | { | ||
7790 | struct btrfs_block_group_cache *block_group, *tmp; | ||
7791 | struct btrfs_root *extent_root = root->fs_info->extent_root; | ||
7792 | struct btrfs_block_group_item item; | ||
7793 | struct btrfs_key key; | ||
7794 | int ret = 0; | ||
7795 | |||
7796 | list_for_each_entry_safe(block_group, tmp, &trans->new_bgs, | ||
7797 | new_bg_list) { | ||
7798 | list_del_init(&block_group->new_bg_list); | ||
7799 | |||
7800 | if (ret) | ||
7801 | continue; | ||
7802 | |||
7803 | spin_lock(&block_group->lock); | ||
7804 | memcpy(&item, &block_group->item, sizeof(item)); | ||
7805 | memcpy(&key, &block_group->key, sizeof(key)); | ||
7806 | spin_unlock(&block_group->lock); | ||
7807 | |||
7808 | ret = btrfs_insert_item(trans, extent_root, &key, &item, | ||
7809 | sizeof(item)); | ||
7810 | if (ret) | ||
7811 | btrfs_abort_transaction(trans, extent_root, ret); | ||
7812 | } | ||
7813 | } | ||
7814 | |||
7813 | int btrfs_make_block_group(struct btrfs_trans_handle *trans, | 7815 | int btrfs_make_block_group(struct btrfs_trans_handle *trans, |
7814 | struct btrfs_root *root, u64 bytes_used, | 7816 | struct btrfs_root *root, u64 bytes_used, |
7815 | u64 type, u64 chunk_objectid, u64 chunk_offset, | 7817 | u64 type, u64 chunk_objectid, u64 chunk_offset, |
@@ -7843,6 +7845,7 @@ int btrfs_make_block_group(struct btrfs_trans_handle *trans, | |||
7843 | spin_lock_init(&cache->lock); | 7845 | spin_lock_init(&cache->lock); |
7844 | INIT_LIST_HEAD(&cache->list); | 7846 | INIT_LIST_HEAD(&cache->list); |
7845 | INIT_LIST_HEAD(&cache->cluster_list); | 7847 | INIT_LIST_HEAD(&cache->cluster_list); |
7848 | INIT_LIST_HEAD(&cache->new_bg_list); | ||
7846 | 7849 | ||
7847 | btrfs_init_free_space_ctl(cache); | 7850 | btrfs_init_free_space_ctl(cache); |
7848 | 7851 | ||
@@ -7874,12 +7877,7 @@ int btrfs_make_block_group(struct btrfs_trans_handle *trans, | |||
7874 | ret = btrfs_add_block_group_cache(root->fs_info, cache); | 7877 | ret = btrfs_add_block_group_cache(root->fs_info, cache); |
7875 | BUG_ON(ret); /* Logic error */ | 7878 | BUG_ON(ret); /* Logic error */ |
7876 | 7879 | ||
7877 | ret = btrfs_insert_item(trans, extent_root, &cache->key, &cache->item, | 7880 | list_add_tail(&cache->new_bg_list, &trans->new_bgs); |
7878 | sizeof(cache->item)); | ||
7879 | if (ret) { | ||
7880 | btrfs_abort_transaction(trans, extent_root, ret); | ||
7881 | return ret; | ||
7882 | } | ||
7883 | 7881 | ||
7884 | set_avail_alloc_bits(extent_root->fs_info, type); | 7882 | set_avail_alloc_bits(extent_root->fs_info, type); |
7885 | 7883 | ||