aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--fs/btrfs/extent-tree.c34
1 files changed, 6 insertions, 28 deletions
diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c
index ca4aad96f814..3d3e2c17d8d1 100644
--- a/fs/btrfs/extent-tree.c
+++ b/fs/btrfs/extent-tree.c
@@ -3907,7 +3907,6 @@ static int reserve_metadata_bytes(struct btrfs_root *root,
3907 int flush_state = FLUSH_DELAYED_ITEMS_NR; 3907 int flush_state = FLUSH_DELAYED_ITEMS_NR;
3908 int ret = 0; 3908 int ret = 0;
3909 bool flushing = false; 3909 bool flushing = false;
3910 bool committed = false;
3911 3910
3912again: 3911again:
3913 ret = 0; 3912 ret = 0;
@@ -3970,33 +3969,12 @@ again:
3970 (orig_bytes * 2); 3969 (orig_bytes * 2);
3971 } 3970 }
3972 3971
3973 if (ret) { 3972 if (ret && can_overcommit(root, space_info, orig_bytes, flush)) {
3974 u64 avail; 3973 space_info->bytes_may_use += orig_bytes;
3975 3974 trace_btrfs_space_reservation(root->fs_info, "space_info",
3976 /* 3975 space_info->flags, orig_bytes,
3977 * If we have a lot of space that's pinned, don't bother doing 3976 1);
3978 * the overcommit dance yet and just commit the transaction. 3977 ret = 0;
3979 */
3980 avail = (space_info->total_bytes - space_info->bytes_used) * 8;
3981 do_div(avail, 10);
3982 if (space_info->bytes_pinned >= avail && flush && !committed) {
3983 space_info->flush = 1;
3984 flushing = true;
3985 spin_unlock(&space_info->lock);
3986 ret = may_commit_transaction(root, space_info,
3987 orig_bytes, 1);
3988 if (ret)
3989 goto out;
3990 committed = true;
3991 goto again;
3992 }
3993
3994 if (can_overcommit(root, space_info, orig_bytes, flush)) {
3995 space_info->bytes_may_use += orig_bytes;
3996 trace_btrfs_space_reservation(root->fs_info,
3997 "space_info", space_info->flags, orig_bytes, 1);
3998 ret = 0;
3999 }
4000 } 3978 }
4001 3979
4002 /* 3980 /*