Linux block layer
 help / color / mirror / Atom feed
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 v4 11/13] block: allow read-only and offline conventional zones
Date: Fri, 14 Aug 2026 15:31:59 +0900	[thread overview]
Message-ID: <20260814063201.1762743-12-dlemoal@kernel.org> (raw)
In-Reply-To: <20260814063201.1762743-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>
---
 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 ea1c00043a03..4333977ad4fc 100644
--- a/block/blk-zoned.c
+++ b/block/blk-zoned.c
@@ -2344,57 +2344,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;
 
@@ -2410,6 +2385,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
@@ -2492,11 +2485,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


  parent reply	other threads:[~2026-08-14  6:32 UTC|newest]

Thread overview: 26+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-08-14  6:31 [PATCH v4 00/13] Improve handling of offline and read-only zones Damien Le Moal
2026-08-14  6:31 ` [PATCH v4 01/13] block: remove disk_free_zone_resources() Damien Le Moal
2026-08-14  6:31 ` [PATCH v4 02/13] block: refactor disk_revalidate_zone_resources() Damien Le Moal
2026-08-14  6:31 ` [PATCH v4 03/13] block: refactor disk_update_zone_resources() Damien Le Moal
2026-08-14  6:31 ` [PATCH v4 04/13] block: remember a zone type regardless of its condition Damien Le Moal
2026-08-14  7:30   ` Christoph Hellwig
2026-08-14  6:31 ` [PATCH v4 05/13] block: refactor bdev_zone_is_seq() Damien Le Moal
2026-08-14  7:31   ` Christoph Hellwig
2026-08-14  6:31 ` [PATCH v4 06/13] block: introduce disk_for_all_zone_wplugs() Damien Le Moal
2026-08-14  8:04   ` Christoph Hellwig
2026-08-14  6:31 ` [PATCH v4 07/13] block: drop all zone write plugs on capacity changes Damien Le Moal
2026-08-14  8:05   ` Christoph Hellwig
2026-08-14  6:31 ` [PATCH v4 08/13] block: propagate readonly and offline conditions to zone write plugs Damien Le Moal
2026-08-14  8:05   ` Christoph Hellwig
2026-08-14  6:31 ` [PATCH v4 09/13] block: always treat offline and read-only zones as dead Damien Le Moal
2026-08-14  8:06   ` Christoph Hellwig
2026-08-14  6:31 ` [PATCH v4 10/13] block: fail zone management operations to read-only and offline zones Damien Le Moal
2026-08-14  8:08   ` Christoph Hellwig
2026-08-14  8:25     ` Damien Le Moal
2026-08-14  6:31 ` Damien Le Moal [this message]
2026-08-14  8:08   ` [PATCH v4 11/13] block: allow read-only and offline conventional zones Christoph Hellwig
2026-08-14  6:32 ` [PATCH v4 12/13] block: simplify disk_zone_set_cond() Damien Le Moal
2026-08-14  8:10   ` Christoph Hellwig
2026-08-14  6:32 ` [PATCH v4 13/13] block: flag zoned disks with GENHD_FL_NO_PART Damien Le Moal
2026-08-14  8:12   ` Christoph Hellwig
2026-08-14  8:26     ` 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=20260814063201.1762743-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