return 0;
 }
 
-static u64 update_block_group_flags(struct btrfs_fs_info *fs_info, u64 flags)
-{
-       u64 num_devices;
-       u64 stripped;
-
-       /*
-        * if restripe for this chunk_type is on pick target profile and
-        * return, otherwise do the usual balance
-        */
-       stripped = get_restripe_target(fs_info, flags);
-       if (stripped)
-               return extended_to_chunk(stripped);
-
-       num_devices = fs_info->fs_devices->rw_devices;
-
-       stripped = BTRFS_BLOCK_GROUP_RAID0 | BTRFS_BLOCK_GROUP_RAID56_MASK |
-               BTRFS_BLOCK_GROUP_RAID1_MASK | BTRFS_BLOCK_GROUP_RAID10;
-
-       if (num_devices == 1) {
-               stripped |= BTRFS_BLOCK_GROUP_DUP;
-               stripped = flags & ~stripped;
-
-               /* turn raid0 into single device chunks */
-               if (flags & BTRFS_BLOCK_GROUP_RAID0)
-                       return stripped;
-
-               /* turn mirroring into duplication */
-               if (flags & (BTRFS_BLOCK_GROUP_RAID1_MASK |
-                            BTRFS_BLOCK_GROUP_RAID10))
-                       return stripped | BTRFS_BLOCK_GROUP_DUP;
-       } else {
-               /* they already had raid on here, just return */
-               if (flags & stripped)
-                       return flags;
-
-               stripped |= BTRFS_BLOCK_GROUP_DUP;
-               stripped = flags & ~stripped;
-
-               /* switch duplicated blocks with raid1 */
-               if (flags & BTRFS_BLOCK_GROUP_DUP)
-                       return stripped | BTRFS_BLOCK_GROUP_RAID1;
-
-               /* this is drive concat, leave it alone */
-       }
-
-       return flags;
-}
-
 /*
  * Mark one block group RO, can be called several times for the same block
  * group.
                 * If we are changing raid levels, try to allocate a
                 * corresponding block group with the new raid level.
                 */
-               alloc_flags = update_block_group_flags(fs_info, cache->flags);
+               alloc_flags = btrfs_get_alloc_profile(fs_info, cache->flags);
                if (alloc_flags != cache->flags) {
                        ret = btrfs_chunk_alloc(trans, alloc_flags,
                                                CHUNK_ALLOC_FORCE);
        ret = inc_block_group_ro(cache, 0);
 out:
        if (cache->flags & BTRFS_BLOCK_GROUP_SYSTEM) {
-               alloc_flags = update_block_group_flags(fs_info, cache->flags);
+               alloc_flags = btrfs_get_alloc_profile(fs_info, cache->flags);
                mutex_lock(&fs_info->chunk_mutex);
                check_system_chunk(trans, alloc_flags);
                mutex_unlock(&fs_info->chunk_mutex);