All of lore.kernel.org
 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 v3 06/13] block: introduce disk_for_all_zone_wplugs()
Date: Tue, 11 Aug 2026 19:58:45 +0900	[thread overview]
Message-ID: <20260811105852.1245357-7-dlemoal@kernel.org> (raw)
In-Reply-To: <20260811105852.1245357-1-dlemoal@kernel.org>

Introduce the helper function disk_for_all_zone_wplugs() to allow
executing an actor function on all hashed zone write plugs. This helper
is used to simplify the implementation of blk_zone_reset_all_bio_endio()
and queue_zone_wplugs_show().

Signed-off-by: Damien Le Moal <dlemoal@kernel.org>
Reviewed-by: Bart Van Assche <bvanassche@acm.org>
---
 block/blk-zoned.c | 68 +++++++++++++++++++++++++----------------------
 1 file changed, 36 insertions(+), 32 deletions(-)

diff --git a/block/blk-zoned.c b/block/blk-zoned.c
index 557ca986bccf..925f9bfcbd6b 100644
--- a/block/blk-zoned.c
+++ b/block/blk-zoned.c
@@ -662,6 +662,26 @@ static inline struct blk_zone_wplug *disk_get_zone_wplug(struct gendisk *disk,
 	return disk_get_hashed_zone_wplug(disk, sector);
 }
 
+static void disk_for_all_zone_wplugs(struct gendisk *disk,
+				     void (*actor)(struct blk_zone_wplug *,
+						   void *),
+				     void *data)
+{
+	struct blk_zone_wplug *zwplug;
+	unsigned int i;
+
+	if (!disk->zone_wplugs_hash)
+		return;
+
+	rcu_read_lock();
+	for (i = 0; i < disk_zone_wplugs_hash_size(disk); i++) {
+		hlist_for_each_entry_rcu(zwplug, &disk->zone_wplugs_hash[i],
+					 node)
+			actor(zwplug, data);
+	}
+	rcu_read_unlock();
+}
+
 static void disk_free_zone_wplug_rcu(struct rcu_head *rcu_head)
 {
 	struct blk_zone_wplug *zwplug =
@@ -1200,32 +1220,26 @@ static void blk_zone_reset_bio_endio(struct bio *bio)
 	}
 }
 
+static void disk_zone_wplug_reset_wp(struct blk_zone_wplug *zwplug, void *data)
+{
+	unsigned long flags;
+
+	spin_lock_irqsave(&zwplug->lock, flags);
+	disk_zone_wplug_set_wp_offset(zwplug->disk, zwplug, 0);
+	spin_unlock_irqrestore(&zwplug->lock, flags);
+}
+
 static void blk_zone_reset_all_bio_endio(struct bio *bio)
 {
 	struct gendisk *disk = bio->bi_bdev->bd_disk;
-	sector_t capacity = get_capacity(disk);
-	struct blk_zone_wplug *zwplug;
-	unsigned long flags;
 	sector_t sector;
-	unsigned int i;
 
-	if (atomic_read(&disk->nr_zone_wplugs)) {
-		/* Update the condition of all zone write plugs. */
-		rcu_read_lock();
-		for (i = 0; i < disk_zone_wplugs_hash_size(disk); i++) {
-			hlist_for_each_entry_rcu(zwplug,
-						 &disk->zone_wplugs_hash[i],
-						 node) {
-				spin_lock_irqsave(&zwplug->lock, flags);
-				disk_zone_wplug_set_wp_offset(disk, zwplug, 0);
-				spin_unlock_irqrestore(&zwplug->lock, flags);
-			}
-		}
-		rcu_read_unlock();
-	}
+	/* Update the condition of all zone write plugs. */
+	if (atomic_read(&disk->nr_zone_wplugs))
+		disk_for_all_zone_wplugs(disk, disk_zone_wplug_reset_wp, NULL);
 
 	/* Update the cached zone conditions. */
-	for (sector = 0; sector < capacity;
+	for (sector = 0; sector < get_capacity(disk);
 	     sector += bdev_zone_sectors(bio->bi_bdev))
 		disk_zone_set_cond(disk, sector, BLK_ZONE_COND_EMPTY);
 	clear_bit(GD_ZONE_APPEND_USED, &disk->state);
@@ -2509,8 +2523,9 @@ EXPORT_SYMBOL_GPL(blk_zone_issue_zeroout);
 
 #ifdef CONFIG_BLK_DEBUG_FS
 static void queue_zone_wplug_show(struct blk_zone_wplug *zwplug,
-				  struct seq_file *m)
+				  void *data)
 {
+	struct seq_file *m = data;
 	unsigned int zwp_wp_offset, zwp_flags;
 	unsigned int zwp_zone_no, zwp_ref;
 	unsigned int zwp_bio_list_size;
@@ -2535,19 +2550,8 @@ static void queue_zone_wplug_show(struct blk_zone_wplug *zwplug,
 int queue_zone_wplugs_show(void *data, struct seq_file *m)
 {
 	struct request_queue *q = data;
-	struct gendisk *disk = q->disk;
-	struct blk_zone_wplug *zwplug;
-	unsigned int i;
-
-	if (!disk->zone_wplugs_hash)
-		return 0;
 
-	rcu_read_lock();
-	for (i = 0; i < disk_zone_wplugs_hash_size(disk); i++)
-		hlist_for_each_entry_rcu(zwplug, &disk->zone_wplugs_hash[i],
-					 node)
-			queue_zone_wplug_show(zwplug, m);
-	rcu_read_unlock();
+	disk_for_all_zone_wplugs(q->disk, queue_zone_wplug_show, m);
 
 	return 0;
 }
-- 
2.55.0


  parent reply	other threads:[~2026-08-11 10:59 UTC|newest]

Thread overview: 30+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-08-11 10:58 [PATCH v3 00/13] Improve handling of offline and read-only zones Damien Le Moal
2026-08-11 10:58 ` [PATCH v3 01/13] block: remove disk_free_zone_resources() Damien Le Moal
2026-08-11 11:41   ` Johannes Thumshirn
2026-08-11 10:58 ` [PATCH v3 02/13] block: refactor disk_revalidate_zone_resources() Damien Le Moal
2026-08-11 11:46   ` Johannes Thumshirn
2026-08-11 10:58 ` [PATCH v3 03/13] block: refactor disk_update_zone_resources() Damien Le Moal
2026-08-11 11:28   ` Hannes Reinecke
2026-08-11 11:48   ` Johannes Thumshirn
2026-08-11 10:58 ` [PATCH v3 04/13] block: remember a zone type regardless of its condition Damien Le Moal
2026-08-11 11:29   ` Hannes Reinecke
2026-08-11 10:58 ` [PATCH v3 05/13] block: refactor bdev_zone_is_seq() Damien Le Moal
2026-08-11 11:30   ` Hannes Reinecke
2026-08-11 10:58 ` Damien Le Moal [this message]
2026-08-11 11:31   ` [PATCH v3 06/13] block: introduce disk_for_all_zone_wplugs() Hannes Reinecke
2026-08-11 10:58 ` [PATCH v3 07/13] block: drop all zone write plugs on capacity changes Damien Le Moal
2026-08-11 11:33   ` Hannes Reinecke
2026-08-11 10:58 ` [PATCH v3 08/13] block: propagate readonly and offline conditions to zone write plugs Damien Le Moal
2026-08-11 11:35   ` Hannes Reinecke
2026-08-11 10:58 ` [PATCH v3 09/13] block: always treat offline and read-only zones as dead Damien Le Moal
2026-08-11 11:36   ` Hannes Reinecke
2026-08-11 10:58 ` [PATCH v3 10/13] block: fail zone management operations to read-only and offline zones Damien Le Moal
2026-08-11 11:41   ` Hannes Reinecke
2026-08-11 12:13     ` Damien Le Moal
2026-08-11 12:16       ` Hannes Reinecke
2026-08-11 10:58 ` [PATCH v3 11/13] block: allow read-only and offline conventional zones Damien Le Moal
2026-08-11 11:43   ` Hannes Reinecke
2026-08-11 10:58 ` [PATCH v3 12/13] block: simplify disk_zone_set_cond() Damien Le Moal
2026-08-11 11:45   ` Hannes Reinecke
2026-08-11 10:58 ` [PATCH v3 13/13] block: flag zoned disks with GENHD_FL_NO_PART Damien Le Moal
2026-08-11 11:45   ` Hannes Reinecke

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=20260811105852.1245357-7-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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.