aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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,