On Thu, May 30, 2024 at 02:40:32PM +0900, Damien Le Moal wrote: > A zoned device with a smaller last zone together with a zone capacity > smaller than the zone size does make any sense as that does not > correspond to any possible setup for a real device: > 1) For ZNS and zoned UFS devices, all zones are always the same size. > 2) For SMR HDDs, all zones always have the same capacity. > In other words, if we have a smaller last runt zone, then this zone > capacity should always be equal to the zone size. > > Add a check in null_init_zoned_dev() to prevent a configuration to have > both a smaller zone size and a zone capacity smaller than the zone size. > > Signed-off-by: Damien Le Moal <dlemoal@xxxxxxxxxx> > --- > drivers/block/null_blk/zoned.c | 11 +++++++++++ > 1 file changed, 11 insertions(+) > > diff --git a/drivers/block/null_blk/zoned.c b/drivers/block/null_blk/zoned.c > index 79c8e5e99f7f..f118d304f310 100644 > --- a/drivers/block/null_blk/zoned.c > +++ b/drivers/block/null_blk/zoned.c > @@ -74,6 +74,17 @@ int null_init_zoned_dev(struct nullb_device *dev, > return -EINVAL; > } > > + /* > + * If a smaller zone capacity was requested, do not allow a smaller last > + * zone at the same time as such zone configuration does not correspond > + * to any real zoned device. > + */ > + if (dev->zone_capacity != dev->zone_size && > + dev->size & (dev->zone_size - 1)) { > + pr_err("A smaller last zone is not allowed with zone capacity smaller than zone size.\n"); > + return -EINVAL; > + } > + > zone_capacity_sects = mb_to_sects(dev->zone_capacity); > dev_capacity_sects = mb_to_sects(dev->size); > dev->zone_size_sects = mb_to_sects(dev->zone_size); > -- > 2.45.1 > Reviewed-by: Niklas Cassel <cassel@xxxxxxxxxx>