From 049859a6df0b2f0d2a7dcb3a7b13f18bfbc675a9 Mon Sep 17 00:00:00 2001 From: Hans Holmberg Date: Fri, 11 Sep 2020 10:47:23 +0200 Subject: [PATCH] blkzone: add report capacity command Add a command that answers the the question: "How much data can I store on this device/in this range of zones?" Implement this by summing up zone capacities over the given range. Signed-off-by: Hans Holmberg --- sys-utils/blkzone.8 | 7 +++++++ sys-utils/blkzone.c | 28 ++++++++++++++++++++-------- 2 files changed, 27 insertions(+), 8 deletions(-) diff --git a/sys-utils/blkzone.8 b/sys-utils/blkzone.8 index 043bc96e23..958677e1bf 100644 --- a/sys-utils/blkzone.8 +++ b/sys-utils/blkzone.8 @@ -52,6 +52,13 @@ ro:Read only x?:Reserved conditions (should not be reported) .TE +.SS capacity +The command \fBblkzone capacity\fP is used to report device capacity information. +.PP +By default, the command will report the sum, in number of sectors, of all +zone capacities on the device. Options may be used to modify this behavior, +changing the starting zone or the size of the report, as explained below. + .SS reset The command \fBblkzone reset\fP is used to reset one or more zones. Unlike .BR sg_reset_wp (8), diff --git a/sys-utils/blkzone.c b/sys-utils/blkzone.c index 67eaf1a024..c416e0711f 100644 --- a/sys-utils/blkzone.c +++ b/sys-utils/blkzone.c @@ -91,6 +91,10 @@ static const struct blkzone_command commands[] = { .name = "report", .handler = blkzone_report, .help = N_("Report zone information about the given device") + },{ + .name = "capacity", + .handler = blkzone_report, + .help = N_("Report sum of zone capacities for the given device") },{ .name = "reset", .handler = blkzone_action, @@ -224,6 +228,8 @@ static const char *condition_str[] = { static int blkzone_report(struct blkzone_control *ctl) { + bool only_capacity_sum = !strcmp(ctl->command->name, "capacity"); + uint64_t capacity_sum = 0; struct blk_zone_report *zi; unsigned long zonesize; uint32_t i, nr_zones; @@ -290,21 +296,27 @@ static int blkzone_report(struct blkzone_control *ctl) else cap = entry->len; - printf(_(" start: 0x%09"PRIx64", len 0x%06"PRIx64 - ", cap 0x%06"PRIx64", wptr 0x%06"PRIx64 - " reset:%u non-seq:%u, zcond:%2u(%s) [type: %u(%s)]\n"), - start, len, cap, (type == 0x1) ? 0 : wp - start, - entry->reset, entry->non_seq, - cond, condition_str[cond & (ARRAY_SIZE(condition_str) - 1)], - type, type_text[type]); + if (only_capacity_sum) { + capacity_sum += cap; + } else { + printf(_(" start: 0x%09"PRIx64", len 0x%06"PRIx64 + ", cap 0x%06"PRIx64", wptr 0x%06"PRIx64 + " reset:%u non-seq:%u, zcond:%2u(%s) [type: %u(%s)]\n"), + start, len, cap, (type == 0x1) ? 0 : wp - start, + entry->reset, entry->non_seq, + cond, condition_str[cond & (ARRAY_SIZE(condition_str) - 1)], + type, type_text[type]); + } nr_zones--; ctl->offset = start + len; - } } + if (only_capacity_sum) + printf(_("0x%09"PRIx64"\n"), capacity_sum); + free(zi); close(fd); -- 2.47.3