@ -2676,14 +2676,6 @@ int btrfs_balance(struct btrfs_balance_control *bctl,
}
}
/*
* Profile changing sanity checks . Skip them if a simple
* balance is requested .
*/
if ( ! ( ( bctl - > data . flags | bctl - > sys . flags | bctl - > meta . flags ) &
BTRFS_BALANCE_ARGS_CONVERT ) )
goto do_balance ;
allowed = BTRFS_AVAIL_ALLOC_BIT_SINGLE ;
if ( fs_info - > fs_devices - > num_devices = = 1 )
allowed | = BTRFS_BLOCK_GROUP_DUP ;
@ -2693,24 +2685,27 @@ int btrfs_balance(struct btrfs_balance_control *bctl,
allowed | = ( BTRFS_BLOCK_GROUP_RAID0 | BTRFS_BLOCK_GROUP_RAID1 |
BTRFS_BLOCK_GROUP_RAID10 ) ;
if ( ! alloc_profile_is_valid ( bctl - > data . target , 1 ) | |
bctl - > data . target & ~ allowed ) {
if ( ( bctl - > data . flags & BTRFS_BALANCE_ARGS_CONVERT ) & &
( ! alloc_profile_is_valid ( bctl - > data . target , 1 ) | |
( bctl - > data . target & ~ allowed ) ) ) {
printk ( KERN_ERR " btrfs: unable to start balance with target "
" data profile %llu \n " ,
( unsigned long long ) bctl - > data . target ) ;
ret = - EINVAL ;
goto out ;
}
if ( ! alloc_profile_is_valid ( bctl - > meta . target , 1 ) | |
bctl - > meta . target & ~ allowed ) {
if ( ( bctl - > meta . flags & BTRFS_BALANCE_ARGS_CONVERT ) & &
( ! alloc_profile_is_valid ( bctl - > meta . target , 1 ) | |
( bctl - > meta . target & ~ allowed ) ) ) {
printk ( KERN_ERR " btrfs: unable to start balance with target "
" metadata profile %llu \n " ,
( unsigned long long ) bctl - > meta . target ) ;
ret = - EINVAL ;
goto out ;
}
if ( ! alloc_profile_is_valid ( bctl - > sys . target , 1 ) | |
bctl - > sys . target & ~ allowed ) {
if ( ( bctl - > sys . flags & BTRFS_BALANCE_ARGS_CONVERT ) & &
( ! alloc_profile_is_valid ( bctl - > sys . target , 1 ) | |
( bctl - > sys . target & ~ allowed ) ) ) {
printk ( KERN_ERR " btrfs: unable to start balance with target "
" system profile %llu \n " ,
( unsigned long long ) bctl - > sys . target ) ;
@ -2718,7 +2713,8 @@ int btrfs_balance(struct btrfs_balance_control *bctl,
goto out ;
}
if ( bctl - > data . target & BTRFS_BLOCK_GROUP_DUP ) {
if ( ( bctl - > data . flags & BTRFS_BALANCE_ARGS_CONVERT ) & &
( bctl - > data . target & BTRFS_BLOCK_GROUP_DUP ) ) {
printk ( KERN_ERR " btrfs: dup for data is not allowed \n " ) ;
ret = - EINVAL ;
goto out ;
@ -2744,7 +2740,6 @@ int btrfs_balance(struct btrfs_balance_control *bctl,
}
}
do_balance :
ret = insert_balance_item ( fs_info - > tree_root , bctl ) ;
if ( ret & & ret ! = - EEXIST )
goto out ;