Skip to content

Commit

Permalink
btrfs: zoned: make zone finishing multi stripe capable
Browse files Browse the repository at this point in the history
Currently finishing 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: Johannes Thumshirn <johannes.thumshirn@wdc.com>
Signed-off-by: David Sterba <dsterba@suse.com>
  • Loading branch information
Johannes Thumshirn authored and David Sterba committed Mar 14, 2022
1 parent f9a912a commit 4dcbb8a
Showing 1 changed file with 24 additions and 22 deletions.
46 changes: 24 additions & 22 deletions fs/btrfs/zoned.c
Original file line number Diff line number Diff line change
Expand Up @@ -1845,19 +1845,12 @@ int btrfs_zone_finish(struct btrfs_block_group *block_group)
struct btrfs_device *device;
u64 physical;
int ret = 0;
int i;

if (!btrfs_is_zoned(fs_info))
return 0;

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 0;

spin_lock(&block_group->lock);
if (!block_group->zone_is_active) {
Expand Down Expand Up @@ -1909,25 +1902,34 @@ int btrfs_zone_finish(struct btrfs_block_group *block_group)
btrfs_clear_data_reloc_bg(block_group);
spin_unlock(&block_group->lock);

ret = blkdev_zone_mgmt(device->bdev, REQ_OP_ZONE_FINISH,
physical >> SECTOR_SHIFT,
device->zone_info->zone_size >> SECTOR_SHIFT,
GFP_NOFS);
btrfs_dec_block_group_ro(block_group);
for (i = 0; i < map->num_stripes; i++) {
device = map->stripes[i].dev;
physical = map->stripes[i].physical;

if (!ret) {
btrfs_dev_clear_active_zone(device, physical);
if (device->zone_info->max_active_zones == 0)
continue;

spin_lock(&fs_info->zone_active_bgs_lock);
ASSERT(!list_empty(&block_group->active_bg_list));
list_del_init(&block_group->active_bg_list);
spin_unlock(&fs_info->zone_active_bgs_lock);
ret = blkdev_zone_mgmt(device->bdev, REQ_OP_ZONE_FINISH,
physical >> SECTOR_SHIFT,
device->zone_info->zone_size >> SECTOR_SHIFT,
GFP_NOFS);

if (ret)
return ret;

/* For active_bg_list */
btrfs_put_block_group(block_group);
btrfs_dev_clear_active_zone(device, physical);
}
btrfs_dec_block_group_ro(block_group);

return ret;
spin_lock(&fs_info->zone_active_bgs_lock);
ASSERT(!list_empty(&block_group->active_bg_list));
list_del_init(&block_group->active_bg_list);
spin_unlock(&fs_info->zone_active_bgs_lock);

/* For active_bg_list */
btrfs_put_block_group(block_group);

return 0;
}

bool btrfs_can_activate_zone(struct btrfs_fs_devices *fs_devices, u64 flags)
Expand Down

0 comments on commit 4dcbb8a

Please sign in to comment.