aboutsummaryrefslogtreecommitdiffstats
path: root/fs
diff options
context:
space:
mode:
authorMiao Xie <miaox@cn.fujitsu.com>2013-05-13 09:55:10 -0400
committerJosef Bacik <jbacik@fusionio.com>2013-05-17 21:40:24 -0400
commitb586b32374909863311b7c916c7c0c709141e35a (patch)
treee6df49f7536b100e330a630b10cbc212f2845f83 /fs
parent7b61cd92242542944fc27024900c495a6a7b3396 (diff)
Btrfs: optimize the error handle of use_block_rsv()
cc: Tsutomu Itoh <t-itoh@jp.fujitsu.com> Signed-off-by: Miao Xie <miaox@cn.fujitsu.com> Signed-off-by: Josef Bacik <jbacik@fusionio.com>
Diffstat (limited to 'fs')
-rw-r--r--fs/btrfs/extent-tree.c65
1 files changed, 28 insertions, 37 deletions
diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c
index 162a66bfbffd..5e2c0bf84075 100644
--- a/fs/btrfs/extent-tree.c
+++ b/fs/btrfs/extent-tree.c
@@ -6656,48 +6656,39 @@ use_block_rsv(struct btrfs_trans_handle *trans,
6656 6656
6657 block_rsv = get_block_rsv(trans, root); 6657 block_rsv = get_block_rsv(trans, root);
6658 6658
6659 if (block_rsv->size == 0) { 6659 if (unlikely(block_rsv->size == 0))
6660 ret = reserve_metadata_bytes(root, block_rsv, blocksize, 6660 goto try_reserve;
6661 BTRFS_RESERVE_NO_FLUSH);
6662 /*
6663 * If we couldn't reserve metadata bytes try and use some from
6664 * the global reserve.
6665 */
6666 if (ret && block_rsv != global_rsv) {
6667 ret = block_rsv_use_bytes(global_rsv, blocksize);
6668 if (!ret)
6669 return global_rsv;
6670 return ERR_PTR(ret);
6671 } else if (ret) {
6672 return ERR_PTR(ret);
6673 }
6674 return block_rsv;
6675 }
6676 6661
6677 ret = block_rsv_use_bytes(block_rsv, blocksize); 6662 ret = block_rsv_use_bytes(block_rsv, blocksize);
6678 if (!ret) 6663 if (!ret)
6679 return block_rsv; 6664 return block_rsv;
6680 if (ret && !block_rsv->failfast) {
6681 if (btrfs_test_opt(root, ENOSPC_DEBUG)) {
6682 static DEFINE_RATELIMIT_STATE(_rs,
6683 DEFAULT_RATELIMIT_INTERVAL * 10,
6684 /*DEFAULT_RATELIMIT_BURST*/ 1);
6685 if (__ratelimit(&_rs))
6686 WARN(1, KERN_DEBUG
6687 "btrfs: block rsv returned %d\n", ret);
6688 }
6689 ret = reserve_metadata_bytes(root, block_rsv, blocksize,
6690 BTRFS_RESERVE_NO_FLUSH);
6691 if (!ret) {
6692 return block_rsv;
6693 } else if (ret && block_rsv != global_rsv) {
6694 ret = block_rsv_use_bytes(global_rsv, blocksize);
6695 if (!ret)
6696 return global_rsv;
6697 }
6698 }
6699 6665
6700 return ERR_PTR(-ENOSPC); 6666 if (block_rsv->failfast)
6667 return ERR_PTR(ret);
6668
6669 if (btrfs_test_opt(root, ENOSPC_DEBUG)) {
6670 static DEFINE_RATELIMIT_STATE(_rs,
6671 DEFAULT_RATELIMIT_INTERVAL * 10,
6672 /*DEFAULT_RATELIMIT_BURST*/ 1);
6673 if (__ratelimit(&_rs))
6674 WARN(1, KERN_DEBUG
6675 "btrfs: block rsv returned %d\n", ret);
6676 }
6677try_reserve:
6678 ret = reserve_metadata_bytes(root, block_rsv, blocksize,
6679 BTRFS_RESERVE_NO_FLUSH);
6680 if (!ret)
6681 return block_rsv;
6682 /*
6683 * If we couldn't reserve metadata bytes try and use some from
6684 * the global reserve.
6685 */
6686 if (block_rsv->type != BTRFS_BLOCK_RSV_GLOBAL) {
6687 ret = block_rsv_use_bytes(global_rsv, blocksize);
6688 if (!ret)
6689 return global_rsv;
6690 }
6691 return ERR_PTR(ret);
6701} 6692}
6702 6693
6703static void unuse_block_rsv(struct btrfs_fs_info *fs_info, 6694static void unuse_block_rsv(struct btrfs_fs_info *fs_info,