diff --git a/src/nvme/tree.c b/src/nvme/tree.c index 00cf96f..633828f 100644 --- a/src/nvme/tree.c +++ b/src/nvme/tree.c @@ -2402,13 +2402,29 @@ static void nvme_ns_parse_descriptors(struct nvme_ns *n, } } +#define ROUND_UP(N, S) ((((N) + (S) - 1) / (S)) * (S)) + +void *_nvme_alloc (size_t len) +{ + size_t _len = ROUND_UP (len, 0x1000); + void *p; + + if (posix_memalign ((void *) &p, getpagesize (), _len)) + return NULL; + + memset (p, 0, _len); + return p; +} + static int nvme_ns_init(struct nvme_ns *n) { struct nvme_id_ns ns = { }; - uint8_t buffer[NVME_IDENTIFY_DATA_SIZE] = { }; - struct nvme_ns_id_desc *descs = (void *)buffer; uint8_t flbas; int ret; + struct nvme_ns_id_desc *descs = _nvme_alloc(NVME_IDENTIFY_DATA_SIZE); + + if (!descs) + return 0; ret = nvme_ns_identify(n, &ns); if (ret) @@ -2424,6 +2440,8 @@ static int nvme_ns_init(struct nvme_ns *n) if (!nvme_ns_identify_descs(n, descs)) nvme_ns_parse_descriptors(n, descs); + free(descs); + return 0; }