The NVM command set specification 1.0c supports 64 LBA formats. The 0-based nlbaf field specifies the number of LBA formats. The flbas field is used to calculate the current LBA format, in which bit 0-3 indicates lsb and bit 5-6 indicates msb of the format index. Signed-off-by: Ankit Kumar <ankit.kumar@xxxxxxxxxxx> --- engines/nvme.c | 14 +++++++++++++- engines/nvme.h | 3 +-- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/engines/nvme.c b/engines/nvme.c index fd2161f3..96a5f064 100644 --- a/engines/nvme.c +++ b/engines/nvme.c @@ -99,6 +99,7 @@ int fio_nvme_get_info(struct fio_file *f, __u32 *nsid, __u32 *lba_sz, struct nvme_id_ns ns; int namespace_id; int fd, err; + __u32 format_idx; if (f->filetype != FIO_TYPE_CHAR) { log_err("ioengine io_uring_cmd only works with nvme ns " @@ -131,7 +132,18 @@ int fio_nvme_get_info(struct fio_file *f, __u32 *nsid, __u32 *lba_sz, } *nsid = namespace_id; - *lba_sz = 1 << ns.lbaf[(ns.flbas & 0x0f)].ds; + + /* + * 16 or 64 as maximum number of supported LBA formats. + * From flbas bit 0-3 indicates lsb and bit 5-6 indicates msb + * of the format index used to format the namespace. + */ + if (ns.nlbaf < 16) + format_idx = ns.flbas & 0xf; + else + format_idx = (ns.flbas & 0xf) + (((ns.flbas >> 5) & 0x3) << 4); + + *lba_sz = 1 << ns.lbaf[format_idx].ds; *nlba = ns.nsze; close(fd); diff --git a/engines/nvme.h b/engines/nvme.h index 408594d5..9d6288c8 100644 --- a/engines/nvme.h +++ b/engines/nvme.h @@ -134,8 +134,7 @@ struct nvme_id_ns { __le16 endgid; __u8 nguid[16]; __u8 eui64[8]; - struct nvme_lbaf lbaf[16]; - __u8 rsvd192[192]; + struct nvme_lbaf lbaf[64]; __u8 vs[3712]; }; -- 2.25.1