@ -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 ) {