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 <hans.holmberg@xxxxxxx> --- As commands like blockdev --getsize and lsblk returns the size of the entire address space, it is useful to provide users with a command that calculates the actual storage capacity in that address space for zoned block devices. 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 043bc96e23ac..958677e1bffa 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 67eaf1a02430..c416e0711fc3 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.20.1