From: Damien Le Moal <dlemoal@kernel.org>
To: linux-block@vger.kernel.org, Jens Axboe <axboe@kernel.dk>,
dm-devel@lists.linux.dev, Mike Snitzer <snitzer@redhat.com>
Subject: [PATCH v2 14/14] block: Cleanup blk_revalidate_zone_cb()
Date: Wed, 1 May 2024 09:09:35 +0900 [thread overview]
Message-ID: <20240501000935.100534-15-dlemoal@kernel.org> (raw)
In-Reply-To: <20240501000935.100534-1-dlemoal@kernel.org>
Define the code for checking conventional and sequential write required
zones suing the functions blk_revalidate_conv_zone() and
blk_revalidate_seq_zone() respectively. This simplifies the zone type
switch-case in blk_revalidate_zone_cb().
No functional changes.
Signed-off-by: Damien Le Moal <dlemoal@kernel.org>
---
block/blk-zoned.c | 129 +++++++++++++++++++++++++++-------------------
1 file changed, 77 insertions(+), 52 deletions(-)
diff --git a/block/blk-zoned.c b/block/blk-zoned.c
index 9026e83e0746..a2030089081c 100644
--- a/block/blk-zoned.c
+++ b/block/blk-zoned.c
@@ -1658,6 +1658,74 @@ static int disk_update_zone_resources(struct gendisk *disk,
return queue_limits_commit_update(q, &lim);
}
+static int blk_revalidate_conv_zone(struct blk_zone *zone, unsigned int idx,
+ struct blk_revalidate_zone_args *args)
+{
+ struct gendisk *disk = args->disk;
+ struct request_queue *q = disk->queue;
+
+ if (zone->capacity != zone->len) {
+ pr_warn("%s: Invalid conventional zone capacity\n",
+ disk->disk_name);
+ return -ENODEV;
+ }
+
+ if (!disk_need_zone_resources(disk))
+ return 0;
+
+ if (!args->conv_zones_bitmap) {
+ args->conv_zones_bitmap =
+ blk_alloc_zone_bitmap(q->node, args->nr_zones);
+ if (!args->conv_zones_bitmap)
+ return -ENOMEM;
+ }
+
+ set_bit(idx, args->conv_zones_bitmap);
+
+ return 0;
+}
+
+static int blk_revalidate_seq_zone(struct blk_zone *zone, unsigned int idx,
+ struct blk_revalidate_zone_args *args)
+{
+ struct gendisk *disk = args->disk;
+ struct blk_zone_wplug *zwplug;
+ unsigned int wp_offset;
+ unsigned long flags;
+
+ /*
+ * Remember the capacity of the first sequential zone and check
+ * if it is constant for all zones.
+ */
+ if (!args->zone_capacity)
+ args->zone_capacity = zone->capacity;
+ if (zone->capacity != args->zone_capacity) {
+ pr_warn("%s: Invalid variable zone capacity\n",
+ disk->disk_name);
+ return -ENODEV;
+ }
+
+ /*
+ * We need to track the write pointer of all zones that are not
+ * empty nor full. So make sure we have a zone write plug for
+ * such zone if the device has a zone write plug hash table.
+ */
+ if (!disk->zone_wplugs_hash)
+ return 0;
+
+ wp_offset = blk_zone_wp_offset(zone);
+ if (!wp_offset || wp_offset >= zone->capacity)
+ return 0;
+
+ zwplug = disk_get_and_lock_zone_wplug(disk, zone->wp, GFP_NOIO, &flags);
+ if (!zwplug)
+ return -ENOMEM;
+ spin_unlock_irqrestore(&zwplug->lock, flags);
+ disk_put_zone_wplug(zwplug);
+
+ return 0;
+}
+
/*
* Helper function to check the validity of zones of a zoned block device.
*/
@@ -1666,12 +1734,9 @@ static int blk_revalidate_zone_cb(struct blk_zone *zone, unsigned int idx,
{
struct blk_revalidate_zone_args *args = data;
struct gendisk *disk = args->disk;
- struct request_queue *q = disk->queue;
sector_t capacity = get_capacity(disk);
- sector_t zone_sectors = q->limits.chunk_sectors;
- struct blk_zone_wplug *zwplug;
- unsigned long flags;
- unsigned int wp_offset;
+ sector_t zone_sectors = disk->queue->limits.chunk_sectors;
+ int ret;
/* Check for bad zones and holes in the zone report */
if (zone->start != args->sector) {
@@ -1711,62 +1776,22 @@ static int blk_revalidate_zone_cb(struct blk_zone *zone, unsigned int idx,
/* Check zone type */
switch (zone->type) {
case BLK_ZONE_TYPE_CONVENTIONAL:
- if (zone->capacity != zone->len) {
- pr_warn("%s: Invalid conventional zone capacity\n",
- disk->disk_name);
- return -ENODEV;
- }
-
- if (!disk_need_zone_resources(disk))
- break;
- if (!args->conv_zones_bitmap) {
- args->conv_zones_bitmap =
- blk_alloc_zone_bitmap(q->node, args->nr_zones);
- if (!args->conv_zones_bitmap)
- return -ENOMEM;
- }
- set_bit(idx, args->conv_zones_bitmap);
+ ret = blk_revalidate_conv_zone(zone, idx, args);
break;
case BLK_ZONE_TYPE_SEQWRITE_REQ:
- /*
- * Remember the capacity of the first sequential zone and check
- * if it is constant for all zones.
- */
- if (!args->zone_capacity)
- args->zone_capacity = zone->capacity;
- if (zone->capacity != args->zone_capacity) {
- pr_warn("%s: Invalid variable zone capacity\n",
- disk->disk_name);
- return -ENODEV;
- }
-
- /*
- * We need to track the write pointer of all zones that are not
- * empty nor full. So make sure we have a zone write plug for
- * such zone if the device has a zone write plug hash table.
- */
- if (!disk->zone_wplugs_hash)
- break;
- wp_offset = blk_zone_wp_offset(zone);
- if (wp_offset && wp_offset < zone->capacity) {
- zwplug = disk_get_and_lock_zone_wplug(disk, zone->wp,
- GFP_NOIO, &flags);
- if (!zwplug)
- return -ENOMEM;
- spin_unlock_irqrestore(&zwplug->lock, flags);
- disk_put_zone_wplug(zwplug);
- }
-
+ ret = blk_revalidate_seq_zone(zone, idx, args);
break;
case BLK_ZONE_TYPE_SEQWRITE_PREF:
default:
pr_warn("%s: Invalid zone type 0x%x at sectors %llu\n",
disk->disk_name, (int)zone->type, zone->start);
- return -ENODEV;
+ ret = -ENODEV;
}
- args->sector += zone->len;
- return 0;
+ if (!ret)
+ args->sector += zone->len;
+
+ return ret;
}
/**
--
2.44.0
prev parent reply other threads:[~2024-05-01 0:09 UTC|newest]
Thread overview: 17+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-05-01 0:09 [PATCH v2 00/14] Zone write plugging fixes and cleanup Damien Le Moal
2024-05-01 0:09 ` [PATCH v2 01/14] dm: Check that a zoned table leads to a valid mapped device Damien Le Moal
2024-05-01 3:07 ` Benjamin Marzinski
2024-05-01 9:14 ` Damien Le Moal
2024-05-01 0:09 ` [PATCH v2 02/14] block: Exclude conventional zones when faking max open limit Damien Le Moal
2024-05-01 0:09 ` [PATCH v2 03/14] block: Fix zone write plug initialization from blk_revalidate_zone_cb() Damien Le Moal
2024-05-01 0:09 ` [PATCH v2 04/14] block: Fix reference counting for zone write plugs in error state Damien Le Moal
2024-05-01 0:09 ` [PATCH v2 05/14] block: Hold a reference on zone write plugs to schedule submission Damien Le Moal
2024-05-01 0:09 ` [PATCH v2 06/14] block: Unhash a zone write plug only if needed Damien Le Moal
2024-05-01 0:09 ` [PATCH v2 07/14] block: Do not remove zone write plugs still in use Damien Le Moal
2024-05-01 0:09 ` [PATCH v2 08/14] block: Fix flush request sector restore Damien Le Moal
2024-05-01 0:09 ` [PATCH v2 09/14] block: Fix handling of non-empty flush write requests to zones Damien Le Moal
2024-05-01 0:09 ` [PATCH v2 10/14] block: Improve blk_zone_write_plug_bio_merged() Damien Le Moal
2024-05-01 0:09 ` [PATCH v2 11/14] block: Improve zone write request completion handling Damien Le Moal
2024-05-01 0:09 ` [PATCH v2 12/14] block: Simplify blk_zone_write_plug_bio_endio() Damien Le Moal
2024-05-01 0:09 ` [PATCH v2 13/14] block: Simplify zone write plug BIO abort Damien Le Moal
2024-05-01 0:09 ` Damien Le Moal [this message]
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=20240501000935.100534-15-dlemoal@kernel.org \
--to=dlemoal@kernel.org \
--cc=axboe@kernel.dk \
--cc=dm-devel@lists.linux.dev \
--cc=linux-block@vger.kernel.org \
--cc=snitzer@redhat.com \
/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.