Loading fs/btrfs/extent-tree.c +50 −44 Original line number Diff line number Diff line Loading @@ -3109,6 +3109,35 @@ static void set_avail_alloc_bits(struct btrfs_fs_info *fs_info, u64 flags) fs_info->avail_system_alloc_bits |= extra_flags; } /* * returns target flags in extended format or 0 if restripe for this * chunk_type is not in progress */ static u64 get_restripe_target(struct btrfs_fs_info *fs_info, u64 flags) { struct btrfs_balance_control *bctl = fs_info->balance_ctl; u64 target = 0; BUG_ON(!mutex_is_locked(&fs_info->volume_mutex) && !spin_is_locked(&fs_info->balance_lock)); if (!bctl) return 0; if (flags & BTRFS_BLOCK_GROUP_DATA && bctl->data.flags & BTRFS_BALANCE_ARGS_CONVERT) { target = BTRFS_BLOCK_GROUP_DATA | bctl->data.target; } else if (flags & BTRFS_BLOCK_GROUP_SYSTEM && bctl->sys.flags & BTRFS_BALANCE_ARGS_CONVERT) { target = BTRFS_BLOCK_GROUP_SYSTEM | bctl->sys.target; } else if (flags & BTRFS_BLOCK_GROUP_METADATA && bctl->meta.flags & BTRFS_BALANCE_ARGS_CONVERT) { target = BTRFS_BLOCK_GROUP_METADATA | bctl->meta.target; } return target; } /* * @flags: available profiles in extended format (see ctree.h) * Loading @@ -3125,31 +3154,19 @@ u64 btrfs_reduce_alloc_profile(struct btrfs_root *root, u64 flags) */ u64 num_devices = root->fs_info->fs_devices->rw_devices + root->fs_info->fs_devices->missing_devices; u64 target; /* pick restriper's target profile if it's available */ /* * see if restripe for this chunk_type is in progress, if so * try to reduce to the target profile */ spin_lock(&root->fs_info->balance_lock); if (root->fs_info->balance_ctl) { struct btrfs_balance_control *bctl = root->fs_info->balance_ctl; u64 tgt = 0; if ((flags & BTRFS_BLOCK_GROUP_DATA) && (bctl->data.flags & BTRFS_BALANCE_ARGS_CONVERT) && (flags & bctl->data.target)) { tgt = BTRFS_BLOCK_GROUP_DATA | bctl->data.target; } else if ((flags & BTRFS_BLOCK_GROUP_SYSTEM) && (bctl->sys.flags & BTRFS_BALANCE_ARGS_CONVERT) && (flags & bctl->sys.target)) { tgt = BTRFS_BLOCK_GROUP_SYSTEM | bctl->sys.target; } else if ((flags & BTRFS_BLOCK_GROUP_METADATA) && (bctl->meta.flags & BTRFS_BALANCE_ARGS_CONVERT) && (flags & bctl->meta.target)) { tgt = BTRFS_BLOCK_GROUP_METADATA | bctl->meta.target; } if (tgt) { target = get_restripe_target(root->fs_info, flags); if (target) { /* pick target profile only if it's already available */ if ((flags & target) & BTRFS_EXTENDED_PROFILE_MASK) { spin_unlock(&root->fs_info->balance_lock); flags = tgt; goto out; return extended_to_chunk(target); } } spin_unlock(&root->fs_info->balance_lock); Loading Loading @@ -3177,7 +3194,6 @@ u64 btrfs_reduce_alloc_profile(struct btrfs_root *root, u64 flags) flags &= ~BTRFS_BLOCK_GROUP_RAID0; } out: return extended_to_chunk(flags); } Loading Loading @@ -6888,28 +6904,15 @@ int btrfs_drop_subtree(struct btrfs_trans_handle *trans, static u64 update_block_group_flags(struct btrfs_root *root, u64 flags) { u64 num_devices; u64 stripped = BTRFS_BLOCK_GROUP_RAID0 | BTRFS_BLOCK_GROUP_RAID1 | BTRFS_BLOCK_GROUP_RAID10; if (root->fs_info->balance_ctl) { struct btrfs_balance_control *bctl = root->fs_info->balance_ctl; u64 tgt = 0; /* pick restriper's target profile and return */ if (flags & BTRFS_BLOCK_GROUP_DATA && bctl->data.flags & BTRFS_BALANCE_ARGS_CONVERT) { tgt = BTRFS_BLOCK_GROUP_DATA | bctl->data.target; } else if (flags & BTRFS_BLOCK_GROUP_SYSTEM && bctl->sys.flags & BTRFS_BALANCE_ARGS_CONVERT) { tgt = BTRFS_BLOCK_GROUP_SYSTEM | bctl->sys.target; } else if (flags & BTRFS_BLOCK_GROUP_METADATA && bctl->meta.flags & BTRFS_BALANCE_ARGS_CONVERT) { tgt = BTRFS_BLOCK_GROUP_METADATA | bctl->meta.target; } u64 stripped; if (tgt) return extended_to_chunk(tgt); } /* * if restripe for this chunk_type is on pick target profile and * return, otherwise do the usual balance */ stripped = get_restripe_target(root->fs_info, flags); if (stripped) return extended_to_chunk(stripped); /* * we add in the count of missing devices because we want Loading @@ -6919,6 +6922,9 @@ static u64 update_block_group_flags(struct btrfs_root *root, u64 flags) num_devices = root->fs_info->fs_devices->rw_devices + root->fs_info->fs_devices->missing_devices; stripped = BTRFS_BLOCK_GROUP_RAID0 | BTRFS_BLOCK_GROUP_RAID1 | BTRFS_BLOCK_GROUP_RAID10; if (num_devices == 1) { stripped |= BTRFS_BLOCK_GROUP_DUP; stripped = flags & ~stripped; Loading Loading
fs/btrfs/extent-tree.c +50 −44 Original line number Diff line number Diff line Loading @@ -3109,6 +3109,35 @@ static void set_avail_alloc_bits(struct btrfs_fs_info *fs_info, u64 flags) fs_info->avail_system_alloc_bits |= extra_flags; } /* * returns target flags in extended format or 0 if restripe for this * chunk_type is not in progress */ static u64 get_restripe_target(struct btrfs_fs_info *fs_info, u64 flags) { struct btrfs_balance_control *bctl = fs_info->balance_ctl; u64 target = 0; BUG_ON(!mutex_is_locked(&fs_info->volume_mutex) && !spin_is_locked(&fs_info->balance_lock)); if (!bctl) return 0; if (flags & BTRFS_BLOCK_GROUP_DATA && bctl->data.flags & BTRFS_BALANCE_ARGS_CONVERT) { target = BTRFS_BLOCK_GROUP_DATA | bctl->data.target; } else if (flags & BTRFS_BLOCK_GROUP_SYSTEM && bctl->sys.flags & BTRFS_BALANCE_ARGS_CONVERT) { target = BTRFS_BLOCK_GROUP_SYSTEM | bctl->sys.target; } else if (flags & BTRFS_BLOCK_GROUP_METADATA && bctl->meta.flags & BTRFS_BALANCE_ARGS_CONVERT) { target = BTRFS_BLOCK_GROUP_METADATA | bctl->meta.target; } return target; } /* * @flags: available profiles in extended format (see ctree.h) * Loading @@ -3125,31 +3154,19 @@ u64 btrfs_reduce_alloc_profile(struct btrfs_root *root, u64 flags) */ u64 num_devices = root->fs_info->fs_devices->rw_devices + root->fs_info->fs_devices->missing_devices; u64 target; /* pick restriper's target profile if it's available */ /* * see if restripe for this chunk_type is in progress, if so * try to reduce to the target profile */ spin_lock(&root->fs_info->balance_lock); if (root->fs_info->balance_ctl) { struct btrfs_balance_control *bctl = root->fs_info->balance_ctl; u64 tgt = 0; if ((flags & BTRFS_BLOCK_GROUP_DATA) && (bctl->data.flags & BTRFS_BALANCE_ARGS_CONVERT) && (flags & bctl->data.target)) { tgt = BTRFS_BLOCK_GROUP_DATA | bctl->data.target; } else if ((flags & BTRFS_BLOCK_GROUP_SYSTEM) && (bctl->sys.flags & BTRFS_BALANCE_ARGS_CONVERT) && (flags & bctl->sys.target)) { tgt = BTRFS_BLOCK_GROUP_SYSTEM | bctl->sys.target; } else if ((flags & BTRFS_BLOCK_GROUP_METADATA) && (bctl->meta.flags & BTRFS_BALANCE_ARGS_CONVERT) && (flags & bctl->meta.target)) { tgt = BTRFS_BLOCK_GROUP_METADATA | bctl->meta.target; } if (tgt) { target = get_restripe_target(root->fs_info, flags); if (target) { /* pick target profile only if it's already available */ if ((flags & target) & BTRFS_EXTENDED_PROFILE_MASK) { spin_unlock(&root->fs_info->balance_lock); flags = tgt; goto out; return extended_to_chunk(target); } } spin_unlock(&root->fs_info->balance_lock); Loading Loading @@ -3177,7 +3194,6 @@ u64 btrfs_reduce_alloc_profile(struct btrfs_root *root, u64 flags) flags &= ~BTRFS_BLOCK_GROUP_RAID0; } out: return extended_to_chunk(flags); } Loading Loading @@ -6888,28 +6904,15 @@ int btrfs_drop_subtree(struct btrfs_trans_handle *trans, static u64 update_block_group_flags(struct btrfs_root *root, u64 flags) { u64 num_devices; u64 stripped = BTRFS_BLOCK_GROUP_RAID0 | BTRFS_BLOCK_GROUP_RAID1 | BTRFS_BLOCK_GROUP_RAID10; if (root->fs_info->balance_ctl) { struct btrfs_balance_control *bctl = root->fs_info->balance_ctl; u64 tgt = 0; /* pick restriper's target profile and return */ if (flags & BTRFS_BLOCK_GROUP_DATA && bctl->data.flags & BTRFS_BALANCE_ARGS_CONVERT) { tgt = BTRFS_BLOCK_GROUP_DATA | bctl->data.target; } else if (flags & BTRFS_BLOCK_GROUP_SYSTEM && bctl->sys.flags & BTRFS_BALANCE_ARGS_CONVERT) { tgt = BTRFS_BLOCK_GROUP_SYSTEM | bctl->sys.target; } else if (flags & BTRFS_BLOCK_GROUP_METADATA && bctl->meta.flags & BTRFS_BALANCE_ARGS_CONVERT) { tgt = BTRFS_BLOCK_GROUP_METADATA | bctl->meta.target; } u64 stripped; if (tgt) return extended_to_chunk(tgt); } /* * if restripe for this chunk_type is on pick target profile and * return, otherwise do the usual balance */ stripped = get_restripe_target(root->fs_info, flags); if (stripped) return extended_to_chunk(stripped); /* * we add in the count of missing devices because we want Loading @@ -6919,6 +6922,9 @@ static u64 update_block_group_flags(struct btrfs_root *root, u64 flags) num_devices = root->fs_info->fs_devices->rw_devices + root->fs_info->fs_devices->missing_devices; stripped = BTRFS_BLOCK_GROUP_RAID0 | BTRFS_BLOCK_GROUP_RAID1 | BTRFS_BLOCK_GROUP_RAID10; if (num_devices == 1) { stripped |= BTRFS_BLOCK_GROUP_DUP; stripped = flags & ~stripped; Loading