diff --git a/nvme-print.c b/nvme-print.c index ae21c91f0..7b8cbf8ac 100644 --- a/nvme-print.c +++ b/nvme-print.c @@ -406,7 +406,18 @@ bool nvme_is_fabrics_reg(int offset) case NVME_REG_CC: case NVME_REG_CSTS: case NVME_REG_NSSR: - case NVME_REG_CRTO: + return true; + default: + break; + } + + return false; +} + +bool nvme_is_fabrics_optional_reg(int offset) +{ + switch (offset) { + case NVME_REG_NSSR: return true; default: break; diff --git a/nvme-print.h b/nvme-print.h index 3f79fd685..405bd7aaf 100644 --- a/nvme-print.h +++ b/nvme-print.h @@ -322,6 +322,7 @@ void nvme_show_error_status(int status, const char *msg, ...); void nvme_show_init(void); void nvme_show_finish(void); bool nvme_is_fabrics_reg(int offset); +bool nvme_is_fabrics_optional_reg(int offset); bool nvme_registers_cmbloc_support(__u32 cmbsz); bool nvme_registers_pmrctl_ready(__u32 pmrctl); const char *nvme_degrees_string(long t); diff --git a/nvme.c b/nvme.c index a1e65fb34..5d4b52c8c 100644 --- a/nvme.c +++ b/nvme.c @@ -5285,6 +5285,11 @@ static int nvme_get_single_property(int fd, struct get_reg_config *cfg, __u64 *v if (!err) return 0; + if (cfg->fabrics && nvme_is_fabrics_optional_reg(cfg->offset)) { + *value = -1; + return 0; + } + if (!cfg->fabrics && nvme_status_equals(err, NVME_STATUS_TYPE_NVME, NVME_SC_INVALID_FIELD)) { *value = -1; @@ -5316,6 +5321,9 @@ static int nvme_get_properties(int fd, void **pbar, struct get_reg_config *cfg) memset(bar, 0xff, size); for (offset = NVME_REG_CAP; offset <= NVME_REG_CMBSZ; offset += is_64bit ? sizeof(uint64_t) : sizeof(uint32_t)) { + if (!nvme_is_fabrics_reg(offset)) + continue; + cfg->offset = offset; err = nvme_get_single_property(fd, cfg, &value); if (err) @@ -5380,12 +5388,12 @@ static int show_registers(int argc, char **argv, struct command *cmd, struct plu _cleanup_nvme_dev_ struct nvme_dev *dev = NULL; nvme_print_flags_t flags; - bool fabrics = false; void *bar; int err; struct get_reg_config cfg = { .human_readable = false, + .fabrics = false, }; NVME_ARGS(opts, @@ -5406,14 +5414,14 @@ static int show_registers(int argc, char **argv, struct command *cmd, struct plu bar = mmap_registers(dev, false); if (!bar) { + cfg.fabrics = true; err = nvme_get_properties(dev_fd(dev), &bar, &cfg); if (err) return err; - fabrics = true; } - nvme_show_ctrl_registers(bar, fabrics, flags); - if (fabrics) + nvme_show_ctrl_registers(bar, cfg.fabrics, flags); + if (cfg.fabrics) free(bar); else munmap(bar, getpagesize());