On Mon, May 16, 2022 at 06:54:08PM +0200, Pankaj Raghav wrote: > Instead of calculating the superblock location every time, cache the > superblock zone location in btrfs_zoned_device_info struct and use it to > locate the zone index. > > The functions such as btrfs_sb_log_location_bdev() and > btrfs_reset_sb_log_zones() which work directly on block_device shall > continue to use the sb_zone_number because btrfs_zoned_device_info > struct might not have been initialized at that point. > > This patch will enable non power-of-2 zoned devices to not perform > division to lookup superblock and its mirror location. > > Reviewed-by: Luis Chamberlain <mcgrof@xxxxxxxxxx> > Signed-off-by: Pankaj Raghav <p.raghav@xxxxxxxxxxx> > --- > fs/btrfs/zoned.c | 13 +++++++++---- > fs/btrfs/zoned.h | 1 + > 2 files changed, 10 insertions(+), 4 deletions(-) > > diff --git a/fs/btrfs/zoned.c b/fs/btrfs/zoned.c > index 06f22c021..e8c7cebb2 100644 > --- a/fs/btrfs/zoned.c > +++ b/fs/btrfs/zoned.c > @@ -511,6 +511,11 @@ int btrfs_get_dev_zone_info(struct btrfs_device *device, bool populate_cache) > max_active_zones - nactive); > } > > + /* Cache the sb zone number */ > + for (i = 0; i < BTRFS_SUPER_MIRROR_MAX; ++i) { > + zone_info->sb_zone_location[i] = > + sb_zone_number(zone_info->zone_size_shift, i); > + } I don't think we need to cache the value right now, it's not in any hot path and call to bdev_zone_no is relatively cheap (only dereferencing a few pointers, all in-memory values).