|
@@ -3422,7 +3422,6 @@ static int shrink_delalloc(struct btrfs_trans_handle *trans,
|
|
|
* @block_rsv - the block_rsv we're allocating for
|
|
|
* @orig_bytes - the number of bytes we want
|
|
|
* @flush - wether or not we can flush to make our reservation
|
|
|
- * @check - wether this is just to check if we have enough space or not
|
|
|
*
|
|
|
* This will reserve orgi_bytes number of bytes from the space info associated
|
|
|
* with the block_rsv. If there is not enough space it will make an attempt to
|
|
@@ -3433,7 +3432,7 @@ static int shrink_delalloc(struct btrfs_trans_handle *trans,
|
|
|
*/
|
|
|
static int reserve_metadata_bytes(struct btrfs_root *root,
|
|
|
struct btrfs_block_rsv *block_rsv,
|
|
|
- u64 orig_bytes, int flush, int check)
|
|
|
+ u64 orig_bytes, int flush)
|
|
|
{
|
|
|
struct btrfs_space_info *space_info = block_rsv->space_info;
|
|
|
struct btrfs_trans_handle *trans;
|
|
@@ -3507,7 +3506,7 @@ again:
|
|
|
(orig_bytes * (retries + 1));
|
|
|
}
|
|
|
|
|
|
- if (ret && !check) {
|
|
|
+ if (ret) {
|
|
|
u64 profile = btrfs_get_alloc_profile(root, 0);
|
|
|
u64 avail;
|
|
|
|
|
@@ -3742,7 +3741,7 @@ int btrfs_block_rsv_add(struct btrfs_root *root,
|
|
|
if (num_bytes == 0)
|
|
|
return 0;
|
|
|
|
|
|
- ret = reserve_metadata_bytes(root, block_rsv, num_bytes, 1, 0);
|
|
|
+ ret = reserve_metadata_bytes(root, block_rsv, num_bytes, 1);
|
|
|
if (!ret) {
|
|
|
block_rsv_add_bytes(block_rsv, num_bytes, 1);
|
|
|
return 0;
|
|
@@ -3752,8 +3751,7 @@ int btrfs_block_rsv_add(struct btrfs_root *root,
|
|
|
}
|
|
|
|
|
|
int btrfs_block_rsv_check(struct btrfs_root *root,
|
|
|
- struct btrfs_block_rsv *block_rsv,
|
|
|
- u64 min_reserved, int min_factor, int flush)
|
|
|
+ struct btrfs_block_rsv *block_rsv, int min_factor)
|
|
|
{
|
|
|
u64 num_bytes = 0;
|
|
|
int ret = -ENOSPC;
|
|
@@ -3762,11 +3760,26 @@ int btrfs_block_rsv_check(struct btrfs_root *root,
|
|
|
return 0;
|
|
|
|
|
|
spin_lock(&block_rsv->lock);
|
|
|
- if (min_factor > 0)
|
|
|
- num_bytes = div_factor(block_rsv->size, min_factor);
|
|
|
- if (min_reserved > num_bytes)
|
|
|
- num_bytes = min_reserved;
|
|
|
+ num_bytes = div_factor(block_rsv->size, min_factor);
|
|
|
+ if (block_rsv->reserved >= num_bytes)
|
|
|
+ ret = 0;
|
|
|
+ spin_unlock(&block_rsv->lock);
|
|
|
|
|
|
+ return ret;
|
|
|
+}
|
|
|
+
|
|
|
+int btrfs_block_rsv_refill(struct btrfs_root *root,
|
|
|
+ struct btrfs_block_rsv *block_rsv,
|
|
|
+ u64 min_reserved)
|
|
|
+{
|
|
|
+ u64 num_bytes = 0;
|
|
|
+ int ret = -ENOSPC;
|
|
|
+
|
|
|
+ if (!block_rsv)
|
|
|
+ return 0;
|
|
|
+
|
|
|
+ spin_lock(&block_rsv->lock);
|
|
|
+ num_bytes = min_reserved;
|
|
|
if (block_rsv->reserved >= num_bytes)
|
|
|
ret = 0;
|
|
|
else
|
|
@@ -3776,7 +3789,7 @@ int btrfs_block_rsv_check(struct btrfs_root *root,
|
|
|
if (!ret)
|
|
|
return 0;
|
|
|
|
|
|
- ret = reserve_metadata_bytes(root, block_rsv, num_bytes, flush, !flush);
|
|
|
+ ret = reserve_metadata_bytes(root, block_rsv, num_bytes, 1);
|
|
|
if (!ret) {
|
|
|
block_rsv_add_bytes(block_rsv, num_bytes, 0);
|
|
|
return 0;
|
|
@@ -4073,7 +4086,7 @@ int btrfs_delalloc_reserve_metadata(struct inode *inode, u64 num_bytes)
|
|
|
to_reserve += calc_csum_metadata_size(inode, num_bytes, 1);
|
|
|
spin_unlock(&BTRFS_I(inode)->lock);
|
|
|
|
|
|
- ret = reserve_metadata_bytes(root, block_rsv, to_reserve, flush, 0);
|
|
|
+ ret = reserve_metadata_bytes(root, block_rsv, to_reserve, flush);
|
|
|
if (ret) {
|
|
|
u64 to_free = 0;
|
|
|
unsigned dropped;
|
|
@@ -5728,7 +5741,7 @@ use_block_rsv(struct btrfs_trans_handle *trans,
|
|
|
block_rsv = get_block_rsv(trans, root);
|
|
|
|
|
|
if (block_rsv->size == 0) {
|
|
|
- ret = reserve_metadata_bytes(root, block_rsv, blocksize, 0, 0);
|
|
|
+ ret = reserve_metadata_bytes(root, block_rsv, blocksize, 0);
|
|
|
/*
|
|
|
* If we couldn't reserve metadata bytes try and use some from
|
|
|
* the global reserve.
|
|
@@ -5749,7 +5762,7 @@ use_block_rsv(struct btrfs_trans_handle *trans,
|
|
|
return block_rsv;
|
|
|
if (ret) {
|
|
|
WARN_ON(1);
|
|
|
- ret = reserve_metadata_bytes(root, block_rsv, blocksize, 0, 0);
|
|
|
+ ret = reserve_metadata_bytes(root, block_rsv, blocksize, 0);
|
|
|
if (!ret) {
|
|
|
return block_rsv;
|
|
|
} else if (ret && block_rsv != global_rsv) {
|