Message ID | 20240530054035.491497-2-dlemoal@kernel.org (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | Zone write plugging and DM zone fixes | expand |
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@kernel.org> > --- > 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@kernel.org>
On 5/29/24 22:40, 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. Reviewed-by: Bart Van Assche <bvanassche@acm.org>
Looks good:
Reviewed-by: Christoph Hellwig <hch@lst.de>
On 5/30/24 07:40, 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 ^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@kernel.org> > --- > 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); Otherwise: Reviewed-by: Hannes Reinecke <hare@suse.de> Cheers, Hannes
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);
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@kernel.org> --- drivers/block/null_blk/zoned.c | 11 +++++++++++ 1 file changed, 11 insertions(+)