Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 274653
b: refs/heads/master
c: 36ba022
h: refs/heads/master
i:
  274651: 2565a72
v: v3
  • Loading branch information
Josef Bacik committed Oct 19, 2011
1 parent 0fdff81 commit e40e2e5
Show file tree
Hide file tree
Showing 7 changed files with 38 additions and 25 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 3880a1b46d87a6b030c31889875befc745d95dff
refs/heads/master: 36ba022ac0b748dd543f43430b03198e899426c9
4 changes: 3 additions & 1 deletion trunk/fs/btrfs/ctree.h
Original file line number Diff line number Diff line change
Expand Up @@ -2252,8 +2252,10 @@ int btrfs_block_rsv_add(struct btrfs_root *root,
struct btrfs_block_rsv *block_rsv,
u64 num_bytes);
int btrfs_block_rsv_check(struct btrfs_root *root,
struct btrfs_block_rsv *block_rsv, int min_factor);
int btrfs_block_rsv_refill(struct btrfs_root *root,
struct btrfs_block_rsv *block_rsv,
u64 min_reserved, int min_factor, int flush);
u64 min_reserved);
int btrfs_block_rsv_migrate(struct btrfs_block_rsv *src_rsv,
struct btrfs_block_rsv *dst_rsv,
u64 num_bytes);
Expand Down
41 changes: 27 additions & 14 deletions trunk/fs/btrfs/extent-tree.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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;
Expand Down Expand Up @@ -3507,7 +3506,7 @@ static int reserve_metadata_bytes(struct btrfs_root *root,
(orig_bytes * (retries + 1));
}

if (ret && !check) {
if (ret) {
u64 profile = btrfs_get_alloc_profile(root, 0);
u64 avail;

Expand Down Expand Up @@ -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;
Expand All @@ -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;
Expand All @@ -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
Expand All @@ -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;
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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.
Expand All @@ -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) {
Expand Down
2 changes: 1 addition & 1 deletion trunk/fs/btrfs/free-space-cache.c
Original file line number Diff line number Diff line change
Expand Up @@ -203,7 +203,7 @@ int btrfs_truncate_free_space_cache(struct btrfs_root *root,

rsv = trans->block_rsv;
trans->block_rsv = root->orphan_block_rsv;
ret = btrfs_block_rsv_check(root, root->orphan_block_rsv, 0, 5, 0);
ret = btrfs_block_rsv_check(root, root->orphan_block_rsv, 5);
if (ret)
return ret;

Expand Down
4 changes: 2 additions & 2 deletions trunk/fs/btrfs/inode.c
Original file line number Diff line number Diff line change
Expand Up @@ -3604,7 +3604,7 @@ void btrfs_evict_inode(struct inode *inode)
* doing the truncate.
*/
while (1) {
ret = btrfs_block_rsv_check(root, rsv, min_size, 0, 1);
ret = btrfs_block_rsv_refill(root, rsv, min_size);

/*
* Try and steal from the global reserve since we will
Expand Down Expand Up @@ -6613,7 +6613,7 @@ static int btrfs_truncate(struct inode *inode)
btrfs_add_ordered_operation(trans, root, inode);

while (1) {
ret = btrfs_block_rsv_check(root, rsv, min_size, 0, 1);
ret = btrfs_block_rsv_refill(root, rsv, min_size);
if (ret) {
/*
* This can only happen with the original transaction we
Expand Down
6 changes: 2 additions & 4 deletions trunk/fs/btrfs/relocation.c
Original file line number Diff line number Diff line change
Expand Up @@ -2041,8 +2041,7 @@ static noinline_for_stack int merge_reloc_root(struct reloc_control *rc,
BUG_ON(IS_ERR(trans));
trans->block_rsv = rc->block_rsv;

ret = btrfs_block_rsv_check(root, rc->block_rsv, min_reserved,
0, 0);
ret = btrfs_block_rsv_refill(root, rc->block_rsv, min_reserved);
if (ret) {
BUG_ON(ret != -EAGAIN);
ret = btrfs_commit_transaction(trans, root);
Expand Down Expand Up @@ -3774,8 +3773,7 @@ static noinline_for_stack int relocate_block_group(struct reloc_control *rc)
}
}

ret = btrfs_block_rsv_check(rc->extent_root, rc->block_rsv, 0,
5, 0);
ret = btrfs_block_rsv_check(rc->extent_root, rc->block_rsv, 5);
if (ret < 0) {
if (ret != -EAGAIN) {
err = ret;
Expand Down
4 changes: 2 additions & 2 deletions trunk/fs/btrfs/transaction.c
Original file line number Diff line number Diff line change
Expand Up @@ -418,8 +418,8 @@ static int should_end_transaction(struct btrfs_trans_handle *trans,
struct btrfs_root *root)
{
int ret;
ret = btrfs_block_rsv_check(root, &root->fs_info->global_block_rsv, 0,
5, 0);

ret = btrfs_block_rsv_check(root, &root->fs_info->global_block_rsv, 5);
return ret ? 1 : 0;
}

Expand Down

0 comments on commit e40e2e5

Please sign in to comment.