Commit f9a912a3 authored by Johannes Thumshirn's avatar Johannes Thumshirn Committed by David Sterba
Browse files

btrfs: zoned: make zone activation multi stripe capable



Currently activation of a zone only works if the block group isn't
spanning more than one zone.

This limitation is purely artificial and can be easily expanded to block
groups being places across multiple zones.

This is a preparation for allowing DUP and later more complex block-group
profiles on zoned btrfs.

Signed-off-by: default avatarJohannes Thumshirn <johannes.thumshirn@wdc.com>
Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
parent f7238e50
Loading
Loading
Loading
Loading
+31 −26
Original line number Diff line number Diff line
@@ -1781,26 +1781,26 @@ bool btrfs_zone_activate(struct btrfs_block_group *block_group)
	struct btrfs_device *device;
	u64 physical;
	bool ret;
	int i;

	if (!btrfs_is_zoned(block_group->fs_info))
		return true;

	map = block_group->physical_map;
	/* Currently support SINGLE profile only */
	ASSERT(map->num_stripes == 1);
	device = map->stripes[0].dev;
	physical = map->stripes[0].physical;

	if (device->zone_info->max_active_zones == 0)
		return true;

	spin_lock(&block_group->lock);

	if (block_group->zone_is_active) {
		ret = true;
		goto out_unlock;
	}

	for (i = 0; i < map->num_stripes; i++) {
		device = map->stripes[i].dev;
		physical = map->stripes[i].physical;

		if (device->zone_info->max_active_zones == 0)
			continue;

		/* No space left */
		if (block_group->alloc_offset == block_group->zone_capacity) {
			ret = false;
@@ -1814,17 +1814,22 @@ bool btrfs_zone_activate(struct btrfs_block_group *block_group)
		}

		/* Successfully activated all the zones */
		if (i == map->num_stripes - 1)
			block_group->zone_is_active = 1;


	}
	spin_unlock(&block_group->lock);

	if (block_group->zone_is_active) {
		/* For the active block group list */
		btrfs_get_block_group(block_group);

		spin_lock(&fs_info->zone_active_bgs_lock);
	ASSERT(list_empty(&block_group->active_bg_list));
	list_add_tail(&block_group->active_bg_list, &fs_info->zone_active_bgs);
		list_add_tail(&block_group->active_bg_list,
			      &fs_info->zone_active_bgs);
		spin_unlock(&fs_info->zone_active_bgs_lock);
	}

	return true;