diff options
| -rw-r--r-- | fs/btrfs/extent-tree.c | 9 |
1 files changed, 8 insertions, 1 deletions
diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c index 54e63b273a64..42f5e6196021 100644 --- a/fs/btrfs/extent-tree.c +++ b/fs/btrfs/extent-tree.c | |||
| @@ -6653,12 +6653,13 @@ use_block_rsv(struct btrfs_trans_handle *trans, | |||
| 6653 | struct btrfs_block_rsv *block_rsv; | 6653 | struct btrfs_block_rsv *block_rsv; |
| 6654 | struct btrfs_block_rsv *global_rsv = &root->fs_info->global_block_rsv; | 6654 | struct btrfs_block_rsv *global_rsv = &root->fs_info->global_block_rsv; |
| 6655 | int ret; | 6655 | int ret; |
| 6656 | bool global_updated = false; | ||
| 6656 | 6657 | ||
| 6657 | block_rsv = get_block_rsv(trans, root); | 6658 | block_rsv = get_block_rsv(trans, root); |
| 6658 | 6659 | ||
| 6659 | if (unlikely(block_rsv->size == 0)) | 6660 | if (unlikely(block_rsv->size == 0)) |
| 6660 | goto try_reserve; | 6661 | goto try_reserve; |
| 6661 | 6662 | again: | |
| 6662 | ret = block_rsv_use_bytes(block_rsv, blocksize); | 6663 | ret = block_rsv_use_bytes(block_rsv, blocksize); |
| 6663 | if (!ret) | 6664 | if (!ret) |
| 6664 | return block_rsv; | 6665 | return block_rsv; |
| @@ -6666,6 +6667,12 @@ use_block_rsv(struct btrfs_trans_handle *trans, | |||
| 6666 | if (block_rsv->failfast) | 6667 | if (block_rsv->failfast) |
| 6667 | return ERR_PTR(ret); | 6668 | return ERR_PTR(ret); |
| 6668 | 6669 | ||
| 6670 | if (block_rsv->type == BTRFS_BLOCK_RSV_GLOBAL && !global_updated) { | ||
| 6671 | global_updated = true; | ||
| 6672 | update_global_block_rsv(root->fs_info); | ||
| 6673 | goto again; | ||
| 6674 | } | ||
| 6675 | |||
| 6669 | if (btrfs_test_opt(root, ENOSPC_DEBUG)) { | 6676 | if (btrfs_test_opt(root, ENOSPC_DEBUG)) { |
| 6670 | static DEFINE_RATELIMIT_STATE(_rs, | 6677 | static DEFINE_RATELIMIT_STATE(_rs, |
| 6671 | DEFAULT_RATELIMIT_INTERVAL * 10, | 6678 | DEFAULT_RATELIMIT_INTERVAL * 10, |
