diff options
Diffstat (limited to 'fs/btrfs/extent-tree.c')
| -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 54e63b273a6..42f5e619602 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,  	struct btrfs_block_rsv *block_rsv;  	struct btrfs_block_rsv *global_rsv = &root->fs_info->global_block_rsv;  	int ret; +	bool global_updated = false;  	block_rsv = get_block_rsv(trans, root);  	if (unlikely(block_rsv->size == 0))  		goto try_reserve; - +again:  	ret = block_rsv_use_bytes(block_rsv, blocksize);  	if (!ret)  		return block_rsv; @@ -6666,6 +6667,12 @@ use_block_rsv(struct btrfs_trans_handle *trans,  	if (block_rsv->failfast)  		return ERR_PTR(ret); +	if (block_rsv->type == BTRFS_BLOCK_RSV_GLOBAL && !global_updated) { +		global_updated = true; +		update_global_block_rsv(root->fs_info); +		goto again; +	} +  	if (btrfs_test_opt(root, ENOSPC_DEBUG)) {  		static DEFINE_RATELIMIT_STATE(_rs,  				DEFAULT_RATELIMIT_INTERVAL * 10,  |