From 00efe8364b0a94e7057333f9bdf579dbc982429c Mon Sep 17 00:00:00 2001 From: Daniel Wagner Date: Thu, 28 Mar 2024 17:20:13 +0100 Subject: [PATCH] tree: fix lba_count size calculation The kernel reports the size in 512 byte units, which is might not match with lba_size. Signed-off-by: Daniel Wagner --- src/nvme/private.h | 3 +++ src/nvme/tree.c | 8 +++++++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/src/nvme/private.h b/src/nvme/private.h index 11744c25..9fe3ea5c 100644 --- a/src/nvme/private.h +++ b/src/nvme/private.h @@ -289,4 +289,7 @@ struct __mi_mctp_socket_ops { }; void __nvme_mi_mctp_set_ops(const struct __mi_mctp_socket_ops *newops); +#define SECTOR_SIZE 512 +#define SECTOR_SHIFT 9 + #endif /* _LIBNVME_PRIVATE_H */ diff --git a/src/nvme/tree.c b/src/nvme/tree.c index 584e3f6a..04ef9d4c 100644 --- a/src/nvme/tree.c +++ b/src/nvme/tree.c @@ -2442,11 +2442,12 @@ static int nvme_ns_init(const char *path, struct nvme_ns *ns) { _cleanup_free_ char *attr = NULL; struct stat sb; + uint64_t size; int ret; struct sysfs_attr_table base[] = { { &ns->nsid, nvme_strtou32, true, "nsid" }, - { &ns->lba_count, nvme_strtou64, true, "size" }, + { &size, nvme_strtou64, true, "size" }, { &ns->lba_size, nvme_strtou64, true, "queue/logical_block_size" }, { ns->eui64, nvme_strtoeuid, false, "eui" }, { ns->nguid, nvme_strtouuid, false, "nguid" }, @@ -2458,6 +2459,11 @@ static int nvme_ns_init(const char *path, struct nvme_ns *ns) return ret; ns->lba_shift = GETSHIFT(ns->lba_size); + /* + * size is in 512 bytes units and lba_count is in lba_size which are not + * necessarily the same. + */ + ns->lba_count = size >> (ns->lba_shift - SECTOR_SHIFT); if (asprintf(&attr, "%s/csi", path) < 0) return -errno;