• Damien Le Moal's avatar
    block: Fix zone write plugging handling of devices with a runt zone · 29459c3e
    Damien Le Moal authored
    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: dd291d77 ("block: Introduce zone write plugging")
    Signed-off-by: default avatarDamien Le Moal <dlemoal@kernel.org>
    Reviewed-by: default avatarBart Van Assche <bvanassche@acm.org>
    Reviewed-by: default avatarNiklas Cassel <cassel@kernel.org>
    Link: https://lore.kernel.org/r/20240530054035.491497-4-dlemoal@kernel.orgSigned-off-by: default avatarJens Axboe <axboe@kernel.dk>
    29459c3e
blk-zoned.c 55.3 KB