Files
linux/include/uapi/linux
Damien Le Moal 0bf0e2e466 block: track zone conditions
The function blk_revalidate_zone_cond() already caches the condition of
all zones of a zoned block device in the zones_cond array of a gendisk.
However, the zone conditions are updated only when the device is scanned
or revalidated.

Implement tracking of the runtime changes to zone conditions using
the new cond field in struct blk_zone_wplug. The size of this structure
remains 112 Bytes as the new field replaces the 4 Bytes padding at the
end of the structure.

Beause zones that do not have a zone write plug can be in the empty,
implicit open, explicit open or full condition, the zones_cond array of
a disk is used to track the conditions, of zones that do not have a zone
write plug. The condition of such zone is updated in the disk zones_cond
array when a zone reset, reset all or finish operation is executed, and
also when a zone write plug is removed from the disk hash table when the
zone becomes full.

Since a device may automatically close an implicitly open zone when
writing to an empty or closed zone, if the total number of open zones
has reached the device limit, the BLK_ZONE_COND_IMP_OPEN and
BLK_ZONE_COND_CLOSED zone conditions cannot be precisely tracked. To
overcome this, the zone condition BLK_ZONE_COND_ACTIVE is introduced to
represent a zone that has the condition BLK_ZONE_COND_IMP_OPEN,
BLK_ZONE_COND_EXP_OPEN or BLK_ZONE_COND_CLOSED.  This follows the
definition of an active zone as defined in the NVMe Zoned Namespace
specifications. As such, for a zoned device that has a limit on the
maximum number of open zones, we will never have more zones in the
BLK_ZONE_COND_ACTIVE condition than the device limit. This is compatible
with the SCSI ZBC and ATA ZAC specifications for SMR HDDs as these
devices do not have a limit on the number of active zones.

The function disk_zone_wplug_set_wp_offset() is modified to use the new
helper disk_zone_wplug_update_cond() to update a zone write plug
condition whenever a zone write plug write offset is updated on
submission or merging of write BIOs to a zone.

The functions blk_zone_reset_bio_endio(), blk_zone_reset_all_bio_endio()
and blk_zone_finish_bio_endio() are modified to update the condition of
the zones targeted by reset, reset_all and finish operations, either
using though disk_zone_wplug_set_wp_offset() for zones that have a
zone write plug, or using the disk_zone_set_cond() helper to update the
zones_cond array of the disk for zones that do not have a zone write
plug.

When a zone write plug is removed from the disk hash table (when the
zone becomes empty or full), the condition of struct blk_zone_wplug is
used to update the disk zones_cond array. Conversely, when a zone write
plug is added to the disk hash table, the zones_cond array is used to
initialize the zone write plug condition.

Signed-off-by: Damien Le Moal <dlemoal@kernel.org>
Reviewed-by: Martin K. Petersen <martin.petersen@oracle.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
2025-11-05 08:07:21 -07:00
..
2024-04-15 13:42:38 +02:00
2021-11-01 13:36:08 +00:00
2022-08-11 10:31:19 -07:00
2025-11-05 08:07:21 -07:00
2021-11-26 16:48:59 +01:00
2025-02-05 13:22:04 +09:00
2023-01-20 09:33:22 +00:00
2024-06-11 12:57:49 -05:00
2025-02-12 02:29:30 +00:00
2025-09-19 14:26:16 +02:00
2023-03-16 21:20:32 -07:00
2025-09-05 09:11:28 +02:00
2025-05-03 12:02:09 +02:00
2022-08-10 13:49:50 +01:00
2024-05-07 01:35:57 +02:00
2025-07-14 09:15:58 +02:00
2021-06-03 15:31:34 -07:00
2024-04-01 10:49:28 +01:00
2024-08-26 09:37:23 -07:00
2025-09-15 14:32:54 +02:00
2024-06-01 07:28:21 +02:00
2024-09-01 20:26:05 -07:00
2022-09-20 09:13:38 +02:00
2025-04-17 11:09:10 +02:00
2024-08-19 22:36:26 -04:00
2025-07-08 12:39:24 +02:00
2023-12-15 17:01:30 +01:00
2024-09-06 08:31:40 -06:00
2022-09-07 16:46:03 +02:00
2024-08-12 17:50:34 -07:00
2023-11-28 19:05:16 +00:00
2025-01-08 13:18:11 +01:00
2025-04-17 12:30:02 +02:00
2025-06-24 15:50:06 +02:00
2023-12-20 19:26:31 -05:00
2025-02-25 18:14:03 -08:00
2025-07-14 18:41:42 -07:00
2022-11-17 11:04:23 -08:00
2025-09-15 17:34:06 +02:00
2025-06-19 14:28:22 +02:00
2025-05-21 13:41:03 +02:00
2022-09-27 17:29:09 -07:00
2025-04-17 12:30:02 +02:00
2023-12-29 11:58:24 -08:00
2023-03-23 17:25:46 +01:00
2025-09-21 17:44:20 -04:00
2025-09-22 09:29:28 +01:00
2025-05-27 10:27:54 -04:00
2025-09-22 09:29:29 +01:00
2021-06-12 13:16:45 -07:00