On Thu, May 30, 2024 at 02:40:34PM +0900, Damien Le Moal wrote: > A zoned device may have a last sequential write required zone that is > smaller than other zones. However, all tests to check if a zone write > plug write offset exceeds the zone capacity use the same capacity > value stored in the gendisk zone_capacity field. This is incorrect for a > zoned device with a last runt (smaller) zone. > > Add the new field last_zone_capacity to struct gendisk to store the > capacity of the last zone of the device. blk_revalidate_seq_zone() and > blk_revalidate_conv_zone() are both modified to get this value when > disk_zone_is_last() returns true. Similarly to zone_capacity, the value > is first stored using the last_zone_capacity field of struct > blk_revalidate_zone_args. Once zone revalidation of all zones is done, > this is used to set the gendisk last_zone_capacity field. > > The checks to determine if a zone is full or if a sector offset in a > zone exceeds the zone capacity in disk_should_remove_zone_wplug(), > disk_zone_wplug_abort_unaligned(), blk_zone_write_plug_init_request(), > and blk_zone_wplug_prepare_bio() are modified to use the new helper > functions disk_zone_is_full() and disk_zone_wplug_is_full(). > disk_zone_is_full() uses the zone index to determine if the zone being > tested is the last one of the disk and uses the either the disk > zone_capacity or last_zone_capacity accordingly. > > Fixes: dd291d77cc90 ("block: Introduce zone write plugging") > Signed-off-by: Damien Le Moal <dlemoal@xxxxxxxxxx> > --- Reviewed-by: Niklas Cassel <cassel@xxxxxxxxxx>