From: Damien Le Moal <dlemoal@kernel.org>
To: Jens Axboe <axboe@kernel.dk>, linux-block@vger.kernel.org
Cc: Christoph Hellwig <hch@lst.de>
Subject: [PATCH v5 11/13] block: allow read-only and offline conventional zones
Date: Fri, 14 Aug 2026 22:47:48 +0900 [thread overview]
Message-ID: <20260814134750.2100304-12-dlemoal@kernel.org> (raw)
In-Reply-To: <20260814134750.2100304-1-dlemoal@kernel.org>
With SCSI and ATA SMR HDDs, the storage element depopulation feature can
change the condition of conventional zones to read-only (if a write head
is depopulated) or to offline (if a read head is depopulated).
However, the function blk_revalidate_zone_cond() currently does not allow
these conditions for conventional zones, causing a zone revalidation
failure.
Remove blk_revalidate_zone_cond() and move the zone condition checks for
conventional zones to blk_revalidate_conv_zone(), allowing the regular
BLK_ZONE_COND_NOT_WP condition as well as the BLK_ZONE_COND_OFFLINE and
BLK_ZONE_COND_READONLY conditions to match the conditions that can be
seen from a zoned device with depopulated storage elements.
The zone condition checks for sequential write required zones are moved
to blk_revalidate_seq_zone() without any change to the conditions allowed.
Signed-off-by: Damien Le Moal <dlemoal@kernel.org>
Reviewed-by: Bart Van Assche <bvanassche@acm.org>
Reviewed-by: Hannes Reinecke <hare@kernel.org>
Reviewed-by: Christoph Hellwig <hch@lst.de>
---
block/blk-zoned.c | 66 +++++++++++++++++++----------------------------
1 file changed, 27 insertions(+), 39 deletions(-)
diff --git a/block/blk-zoned.c b/block/blk-zoned.c
index a4678a9e180b..22c47c73414d 100644
--- a/block/blk-zoned.c
+++ b/block/blk-zoned.c
@@ -2345,57 +2345,32 @@ static int disk_revalidate_capacity(struct gendisk *disk)
return ret;
}
-static int blk_revalidate_zone_cond(struct blk_zone *zone, unsigned int idx,
+static int blk_revalidate_conv_zone(struct blk_zone *zone, unsigned int idx,
struct blk_revalidate_zone_args *args)
{
- enum blk_zone_cond cond = zone->cond;
- u8 flags = 0;
+ struct gendisk *disk = args->disk;
- /* Check that the zone condition is consistent with the zone type. */
- switch (cond) {
+ /* Check the zone condition. */
+ switch (zone->cond) {
case BLK_ZONE_COND_NOT_WP:
- if (zone->type != BLK_ZONE_TYPE_CONVENTIONAL)
- goto invalid_condition;
- flags = BLK_ZFLAG_CONV;
- break;
- case BLK_ZONE_COND_IMP_OPEN:
- case BLK_ZONE_COND_EXP_OPEN:
- case BLK_ZONE_COND_CLOSED:
- case BLK_ZONE_COND_EMPTY:
- case BLK_ZONE_COND_FULL:
case BLK_ZONE_COND_OFFLINE:
case BLK_ZONE_COND_READONLY:
- if (zone->type != BLK_ZONE_TYPE_SEQWRITE_REQ)
- goto invalid_condition;
break;
default:
- pr_warn("%s: Invalid zone condition 0x%X\n",
- args->disk->disk_name, cond);
+ pr_warn("%s: Invalid conv. zone condition 0x%X at sector %llu\n",
+ disk->disk_name, zone->cond, zone->start);
return -ENODEV;
}
- blk_zstate_set(args->zones_state, args->nr_zones, idx, cond, flags);
-
- return 0;
-
-invalid_condition:
- pr_warn("%s: Invalid zone condition 0x%x for type 0x%x\n",
- args->disk->disk_name, cond, zone->type);
-
- return -ENODEV;
-}
-
-static int blk_revalidate_conv_zone(struct blk_zone *zone, unsigned int idx,
- struct blk_revalidate_zone_args *args)
-{
- struct gendisk *disk = args->disk;
-
if (zone->capacity != zone->len) {
pr_warn("%s: Invalid conventional zone capacity\n",
disk->disk_name);
return -ENODEV;
}
+ blk_zstate_set(args->zones_state, args->nr_zones, idx,
+ zone->cond, BLK_ZFLAG_CONV);
+
if (disk_zone_is_last(disk, zone))
args->last_zone_capacity = zone->capacity;
@@ -2411,6 +2386,24 @@ static int blk_revalidate_seq_zone(struct blk_zone *zone, unsigned int idx,
struct blk_zone_wplug *zwplug;
unsigned int wp_offset;
+ /* Check the zone condition. */
+ switch (zone->cond) {
+ case BLK_ZONE_COND_IMP_OPEN:
+ case BLK_ZONE_COND_EXP_OPEN:
+ case BLK_ZONE_COND_CLOSED:
+ case BLK_ZONE_COND_EMPTY:
+ case BLK_ZONE_COND_FULL:
+ case BLK_ZONE_COND_OFFLINE:
+ case BLK_ZONE_COND_READONLY:
+ break;
+ default:
+ pr_warn("%s: Invalid seq. zone condition 0x%X at sector %llu\n",
+ disk->disk_name, zone->cond, zone->start);
+ return -ENODEV;
+ }
+
+ blk_zstate_set(args->zones_state, args->nr_zones, idx, zone->cond, 0);
+
/*
* Remember the capacity of the first sequential zone and check
* if it is constant for all zones, ignoring the last zone as it can be
@@ -2493,11 +2486,6 @@ static int blk_revalidate_zone_cb(struct blk_zone *zone, unsigned int idx,
return -ENODEV;
}
- /* Check zone condition */
- ret = blk_revalidate_zone_cond(zone, idx, args);
- if (ret)
- return ret;
-
/* Check zone type */
switch (zone->type) {
case BLK_ZONE_TYPE_CONVENTIONAL:
--
2.55.0
next prev parent reply other threads:[~2026-08-14 13:48 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-08-14 13:47 [PATCH v5 00/13] Improve handling of offline and read-only zones Damien Le Moal
2026-08-14 13:47 ` [PATCH v5 01/13] block: remove disk_free_zone_resources() Damien Le Moal
2026-08-14 13:47 ` [PATCH v5 02/13] block: refactor disk_revalidate_zone_resources() Damien Le Moal
2026-08-14 13:47 ` [PATCH v5 03/13] block: refactor disk_update_zone_resources() Damien Le Moal
2026-08-14 13:47 ` [PATCH v5 04/13] block: remember a zone type regardless of its condition Damien Le Moal
2026-08-14 13:47 ` [PATCH v5 05/13] block: refactor bdev_zone_is_seq() Damien Le Moal
2026-08-14 13:47 ` [PATCH v5 06/13] block: introduce disk_for_all_zone_wplugs() Damien Le Moal
2026-08-14 13:47 ` [PATCH v5 07/13] block: drop all zone write plugs on capacity changes Damien Le Moal
2026-08-14 13:47 ` [PATCH v5 08/13] block: propagate readonly and offline conditions to zone write plugs Damien Le Moal
2026-08-14 13:47 ` [PATCH v5 09/13] block: always treat offline and read-only zones as dead Damien Le Moal
2026-08-14 13:47 ` [PATCH v5 10/13] block: fail zone management operations to read-only and offline zones Damien Le Moal
2026-08-14 13:47 ` Damien Le Moal [this message]
2026-08-14 13:47 ` [PATCH v5 12/13] block: simplify disk_zone_set_cond() Damien Le Moal
2026-08-14 13:47 ` [PATCH v5 13/13] block: flag zoned disks with GENHD_FL_NO_PART Damien Le Moal
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260814134750.2100304-12-dlemoal@kernel.org \
--to=dlemoal@kernel.org \
--cc=axboe@kernel.dk \
--cc=hch@lst.de \
--cc=linux-block@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox