Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 3 additions & 2 deletions nvme-wrap.c
Original file line number Diff line number Diff line change
Expand Up @@ -221,10 +221,11 @@ int nvme_cli_get_log_device_self_test(struct nvme_dev *dev,
return do_admin_op(get_log_device_self_test, dev, log);
}

int nvme_cli_get_log_create_telemetry_host(struct nvme_dev *dev,
int nvme_cli_get_log_create_telemetry_host_mcda(struct nvme_dev *dev,
enum nvme_telemetry_da mcda,
struct nvme_telemetry_log *log)
{
return do_admin_op(get_log_create_telemetry_host, dev, log);
return do_admin_op(get_log_create_telemetry_host_mcda, dev, mcda, log);
}

int nvme_cli_get_log_telemetry_host(struct nvme_dev *dev, __u64 offset,
Expand Down
3 changes: 2 additions & 1 deletion nvme-wrap.h
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,8 @@ int nvme_cli_get_log_cmd_effects(struct nvme_dev *dev, enum nvme_csi csi,
struct nvme_cmd_effects_log *effects_log);
int nvme_cli_get_log_device_self_test(struct nvme_dev *dev,
struct nvme_self_test_log *log);
int nvme_cli_get_log_create_telemetry_host(struct nvme_dev *dev,
int nvme_cli_get_log_create_telemetry_host_mcda(struct nvme_dev *dev,
enum nvme_telemetry_da mcda,
struct nvme_telemetry_log *log);
int nvme_cli_get_log_telemetry_host(struct nvme_dev *dev, __u64 offset,
__u32 len, void *log);
Expand Down
50 changes: 37 additions & 13 deletions nvme.c
Original file line number Diff line number Diff line change
Expand Up @@ -655,31 +655,41 @@

{
_cleanup_free_ struct nvme_id_ctrl *id_ctrl = NULL;
size_t dalb = 0;
size_t dalb, da1lb = le16_to_cpu(telem->dalb1), da2lb = le16_to_cpu(telem->dalb2),
da3lb = le16_to_cpu(telem->dalb3), da4lb = le32_to_cpu(telem->dalb4);
bool data_area_4_support;

id_ctrl = nvme_alloc(sizeof(*id_ctrl));
if (!id_ctrl)
return -ENOMEM;

if (nvme_cli_identify_ctrl(dev, id_ctrl)) {
perror("identify-ctrl");
return -errno;
}

data_area_4_support = id_ctrl->lpa & 0x40;

switch (da) {
case NVME_TELEMETRY_DA_CTRL_DETERMINE:
if (data_area_4_support)
dalb = da4lb;
else
dalb = da3lb;
break;
case NVME_TELEMETRY_DA_1:
dalb = le16_to_cpu(telem->dalb1);
dalb = da1lb;
break;
case NVME_TELEMETRY_DA_2:
dalb = le16_to_cpu(telem->dalb2);
dalb = da2lb;
break;
case NVME_TELEMETRY_DA_3:
/* dalb3 >= dalb2 >= dalb1 */
dalb = le16_to_cpu(telem->dalb3);
dalb = da3lb;
break;
case NVME_TELEMETRY_DA_4:
if (nvme_cli_identify_ctrl(dev, id_ctrl)) {
perror("identify-ctrl");
return -errno;
}

if (id_ctrl->lpa & 0x40) {
dalb = le32_to_cpu(telem->dalb4);
if (data_area_4_support) {
dalb = da4lb;
} else {
nvme_show_error(
"Data area 4 unsupported, bit 6 of Log Page Attributes not set");
Expand Down Expand Up @@ -757,7 +767,7 @@
if (!log)
return -ENOMEM;

err = nvme_cli_get_log_create_telemetry_host(dev, log);
err = nvme_cli_get_log_create_telemetry_host_mcda(dev, da, log);
if (err) {
if (errno)
return -errno;
Expand Down Expand Up @@ -854,6 +864,8 @@
const char *hgen = "Have the host tell the controller to generate the report";
const char *cgen = "Gather report generated by the controller.";
const char *dgen = "Pick which telemetry data area to report. Default is 3 to fetch areas 1-3. Valid options are 1, 2, 3, 4.";
const char *mcda = "Host-init Maximum Created Data Area. Valid options are 0 ~ 4 "
"If given, This option will override dgen. 0 : controller determines data area";

Check failure on line 868 in nvme.c

View workflow job for this annotation

GitHub Actions / checkpatch review

WARNING: quoted string split across lines

_cleanup_free_ struct nvme_telemetry_log *log = NULL;
_cleanup_nvme_dev_ struct nvme_dev *dev = NULL;
Expand All @@ -869,21 +881,24 @@
bool ctrl_init;
int data_area;
bool rae;
__u8 mcda;
};
struct config cfg = {
.file_name = NULL,
.host_gen = 1,
.ctrl_init = false,
.data_area = 3,
.rae = false,
.mcda = 0xff,
};

NVME_ARGS(opts,
OPT_FILE("output-file", 'O', &cfg.file_name, fname),
OPT_UINT("host-generate", 'g', &cfg.host_gen, hgen),
OPT_FLAG("controller-init", 'c', &cfg.ctrl_init, cgen),
OPT_UINT("data-area", 'd', &cfg.data_area, dgen),
OPT_FLAG("rae", 'r', &cfg.rae, rae));
OPT_FLAG("rae", 'r', &cfg.rae, rae),
OPT_BYTE("mcda", 'm', &cfg.mcda, mcda));

err = parse_and_open(&dev, argc, argv, desc, opts);
if (err)
Expand All @@ -895,6 +910,15 @@
}

cfg.host_gen = !!cfg.host_gen;

if (cfg.mcda != 0xff) {
if (cfg.ctrl_init || !cfg.host_gen) {
nvme_show_error("mcda allowed for Host-init Creation!");
return -EINVAL;
}
cfg.data_area = cfg.mcda;
}

output = open(cfg.file_name, O_WRONLY | O_CREAT | O_TRUNC, 0666);
if (output < 0) {
nvme_show_error("Failed to open output file %s: %s!",
Expand Down
2 changes: 1 addition & 1 deletion subprojects/libnvme.wrap
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[wrap-git]
url = https://github.com/linux-nvme/libnvme.git
revision = b50a076515b25feaaf5646df20bded99b2b90a3b
revision = 693e18352051c3a2cf0f8a9d9f0885d518dfc572

[provide]
libnvme = libnvme_dep
Expand Down
Loading