diff options
author | Miao Xie <miaox@cn.fujitsu.com> | 2013-05-13 09:55:10 -0400 |
---|---|---|
committer | Josef Bacik <jbacik@fusionio.com> | 2013-05-17 21:40:24 -0400 |
commit | b586b32374909863311b7c916c7c0c709141e35a (patch) | |
tree | e6df49f7536b100e330a630b10cbc212f2845f83 /fs | |
parent | 7b61cd92242542944fc27024900c495a6a7b3396 (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.c | 65 |
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 | } | ||
6677 | try_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 | ||
6703 | static void unuse_block_rsv(struct btrfs_fs_info *fs_info, | 6694 | static void unuse_block_rsv(struct btrfs_fs_info *fs_info, |