Skip to content

Commit

Permalink
Btrfs: validate target profiles only if we are going to use them
Browse files Browse the repository at this point in the history
Do not run sanity checks on all target profiles unless they all will be
used.  This came up because alloc_profile_is_valid() is now more strict
than it used to be.

Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
  • Loading branch information
Ilya Dryomov committed Mar 27, 2012
1 parent 4a5e98f commit 6728b19
Showing 1 changed file with 11 additions and 16 deletions.
27 changes: 11 additions & 16 deletions fs/btrfs/volumes.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -2693,32 +2685,36 @@ 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);
ret = -EINVAL;
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;
Expand All @@ -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;
Expand Down

0 comments on commit 6728b19

Please sign in to comment.