aboutsummaryrefslogtreecommitdiffstats
path: root/fs/btrfs/extent-tree.c
diff options
context:
space:
mode:
authorJosef Bacik <jbacik@fusionio.com>2012-09-28 16:04:19 -0400
committerChris Mason <chris.mason@fusionio.com>2012-10-09 09:15:42 -0400
commit44734ed1ca0c2e66479cedbf773627a9b5a31364 (patch)
tree2f1c94e4410a9b620b25d3e24016c5d545a727c3 /fs/btrfs/extent-tree.c
parentf0bd95ea72644cbf9210606f6f8edfce13d65d47 (diff)
Btrfs: don't commit instead of overcommitting
I don't think we have the same problem that this was supposed to fix originally since we can allocate chunks in the enospc path now. This code is causing us to constantly commit the transaction as we get close to using all of our available space in our currently allocated chunks, instead of allocating another chunk and carrying on with life, which is not nice for performance. Thanks, Signed-off-by: Josef Bacik <jbacik@fusionio.com>
Diffstat (limited to 'fs/btrfs/extent-tree.c')
-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 /*