btrfs: zoned: fix btrfs_can_activate_zone() to support DUP profile

commit 9e1cdf0c35 upstream.

btrfs_can_activate_zone() returns true if at least one device has one zone
available for activation. This is OK for the single profile, but not OK for
DUP profile. We need two zones to create a DUP block group. Fix it by
properly handling the case with the profile flags.

Fixes: 265f7237dd ("btrfs: zoned: allow DUP on meta-data block groups")
CC: stable@vger.kernel.org # 6.1+
Reviewed-by: Johannes Thumshirn <johannes.thumshirn@wdc.com>
Signed-off-by: Naohiro Aota <naohiro.aota@wdc.com>
Reviewed-by: David Sterba <dsterba@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
Naohiro Aota 2023-03-13 16:29:49 +09:00 committed by Greg Kroah-Hartman
parent 43ca70753d
commit 0280512c23
1 changed files with 12 additions and 2 deletions

View File

@ -2100,11 +2100,21 @@ bool btrfs_can_activate_zone(struct btrfs_fs_devices *fs_devices, u64 flags)
if (!device->bdev)
continue;
if (!zinfo->max_active_zones ||
atomic_read(&zinfo->active_zones_left)) {
if (!zinfo->max_active_zones) {
ret = true;
break;
}
switch (flags & BTRFS_BLOCK_GROUP_PROFILE_MASK) {
case 0: /* single */
ret = (atomic_read(&zinfo->active_zones_left) >= 1);
break;
case BTRFS_BLOCK_GROUP_DUP:
ret = (atomic_read(&zinfo->active_zones_left) >= 2);
break;
}
if (ret)
break;
}
mutex_unlock(&fs_info->chunk_mutex);