]> www.infradead.org Git - users/sagi/nvme-cli.git/commitdiff
nvme: add rotational-media-info-log command
authorTokunori Ikegami <ikegami.t@gmail.com>
Sun, 26 Jan 2025 14:36:58 +0000 (23:36 +0900)
committerDaniel Wagner <wagi@monom.org>
Mon, 27 Jan 2025 09:09:07 +0000 (10:09 +0100)
Since added the NVMe 2.1 log page.

Signed-off-by: Tokunori Ikegami <ikegami.t@gmail.com>
nvme-builtin.h
nvme-print-binary.c
nvme-print-json.c
nvme-print-stdout.c
nvme-print.c
nvme-print.h
nvme-wrap.c
nvme-wrap.h
nvme.c

index 5b1af6939d8e8c498c5bb8f8da2d5ef8728bf703..0134e602c6fab1db31de2d1dedd4539c480ecfc9 100644 (file)
@@ -59,6 +59,7 @@ COMMAND_LIST(
        ENTRY("media-unit-stat-log", "Retrieve the configuration and wear of media units, show it", get_media_unit_stat_log)
        ENTRY("supported-cap-config-log", "Retrieve the list of Supported Capacity Configuration Descriptors", get_supp_cap_config_log)
        ENTRY("mgmt-addr-list-log", "Retrieve Management Address List Log, show it", get_mgmt_addr_list_log)
+       ENTRY("rotational-media-info-log", "Retrieve Rotational Media Information Log, show it", get_rotational_media_info_log)
        ENTRY("set-feature", "Set a feature and show the resulting value", set_feature)
        ENTRY("set-property", "Set a property and show the resulting value", set_property)
        ENTRY("get-property", "Get a property and show the resulting value", get_property)
index caefd951242172051b59552c9d61301955a0e825..5d29beab6be31c369791ed5d224fd5de1c159a5b 100644 (file)
@@ -312,6 +312,11 @@ static void binary_mgmt_addr_list_log(struct nvme_mgmt_addr_list_log *ma_list)
        d_raw((unsigned char *)ma_list, sizeof(*ma_list));
 }
 
+static void binary_rotational_media_info_log(struct nvme_rotational_media_info_log *info)
+{
+       d_raw((unsigned char *)info, sizeof(*info));
+}
+
 static struct print_ops binary_print_ops = {
        /* libnvme types.h print functions */
        .ana_log                        = binary_ana_log,
@@ -379,6 +384,7 @@ static struct print_ops binary_print_ops = {
        .show_init                      = NULL,
        .show_finish                    = NULL,
        .mgmt_addr_list_log             = binary_mgmt_addr_list_log,
+       .rotational_media_info_log      = binary_rotational_media_info_log,
 
        /* libnvme tree print functions */
        .list_item                      = NULL,
index b2501aba8e6cc00aea64785c3ada2493befb7709..069ba336ddc19e2b20594881c26c16dd08fbf5bf 100644 (file)
@@ -4638,6 +4638,21 @@ out:
        json_print(r);
 }
 
+static void json_rotational_media_info_log(struct nvme_rotational_media_info_log *info)
+{
+       struct json_object *r = json_create_object();
+
+       obj_add_uint(r, "endgid", le16_to_cpu(info->endgid));
+       obj_add_uint(r, "numa", le16_to_cpu(info->numa));
+       obj_add_uint(r, "nrs", le16_to_cpu(info->nrs));
+       obj_add_uint(r, "spinc", le32_to_cpu(info->spinc));
+       obj_add_uint(r, "fspinc", le32_to_cpu(info->fspinc));
+       obj_add_uint(r, "ldc", le32_to_cpu(info->ldc));
+       obj_add_uint(r, "fldc", le32_to_cpu(info->fldc));
+
+       json_print(r);
+}
+
 static struct print_ops json_print_ops = {
        /* libnvme types.h print functions */
        .ana_log                        = json_ana_log,
@@ -4706,6 +4721,7 @@ static struct print_ops json_print_ops = {
        .show_init                      = json_show_init,
        .show_finish                    = json_show_finish,
        .mgmt_addr_list_log             = json_mgmt_addr_list_log,
+       .rotational_media_info_log      = json_rotational_media_info_log,
 
        /* libnvme tree print functions */
        .list_item                      = json_list_item,
index b6776b7350c0f420bdf4de8ec7116088e22329c8..8d713eb55a80078a26d575ce02931ef5825cffe0 100644 (file)
@@ -5566,6 +5566,17 @@ out:
                printf("All management address descriptors reserved\n");
 }
 
+static void stdout_rotational_media_info_log(struct nvme_rotational_media_info_log *info)
+{
+       printf("endgid: %u\n", le16_to_cpu(info->endgid));
+       printf("numa: %u\n", le16_to_cpu(info->numa));
+       printf("nrs: %u\n", le16_to_cpu(info->nrs));
+       printf("spinc: %u\n", le32_to_cpu(info->spinc));
+       printf("fspinc: %u\n", le32_to_cpu(info->fspinc));
+       printf("ldc: %u\n", le32_to_cpu(info->ldc));
+       printf("fldc: %u\n", le32_to_cpu(info->fldc));
+}
+
 static struct print_ops stdout_print_ops = {
        /* libnvme types.h print functions */
        .ana_log                        = stdout_ana_log,
@@ -5634,6 +5645,7 @@ static struct print_ops stdout_print_ops = {
        .show_init                      = NULL,
        .show_finish                    = NULL,
        .mgmt_addr_list_log             = stdout_mgmt_addr_list_log,
+       .rotational_media_info_log      = stdout_rotational_media_info_log,
 
        /* libnvme tree print functions */
        .list_item                      = stdout_list_item,
index e95d21e00e136d8aa61a798f97c60e59c4f487eb..98aaa56611d322f4a3ed6021b2eececa4687c54f 100644 (file)
@@ -1497,3 +1497,9 @@ void nvme_show_mgmt_addr_list_log(struct nvme_mgmt_addr_list_log *ma_list, nvme_
 {
        nvme_print(mgmt_addr_list_log, flags, ma_list);
 }
+
+void nvme_show_rotational_media_info_log(struct nvme_rotational_media_info_log *info,
+                                        nvme_print_flags_t flags)
+{
+       nvme_print(rotational_media_info_log, flags, info);
+}
index 6fedd5840c18011f6177ec5d5658f4b13d1a198f..4aeba5fcd33620ac62b4207f7f5c2e06e5e454c0 100644 (file)
@@ -89,6 +89,7 @@ struct print_ops {
        void (*show_init)(void);
        void (*show_finish)(void);
        void (*mgmt_addr_list_log)(struct nvme_mgmt_addr_list_log *ma_log);
+       void (*rotational_media_info_log)(struct nvme_rotational_media_info_log *info);
 
        /* libnvme tree print functions */
        void (*list_item)(nvme_ns_t n);
@@ -332,4 +333,6 @@ void json_print(struct json_object *r);
 struct json_object *obj_create_array_obj(struct json_object *o, const char *k);
 void nvme_show_mgmt_addr_list_log(struct nvme_mgmt_addr_list_log *ma_list,
                                  nvme_print_flags_t flags);
+void nvme_show_rotational_media_info_log(struct nvme_rotational_media_info_log *info,
+                                        nvme_print_flags_t flags);
 #endif /* NVME_PRINT_H */
index 9b4aecd43339cdd0321713d8c4527ac53e65fefa..bcec2d1904782158e3dd587c34f890b7e87dd33d 100644 (file)
@@ -436,3 +436,12 @@ int nvme_cli_get_log_mgmt_addr_list(struct nvme_dev *dev, __u32 len,
 {
        return do_admin_op(get_log_mgmt_addr_list, dev, len, ma_list);
 }
+
+int nvme_cli_get_log_rotational_media_info(struct nvme_dev *dev, __u16 endgid, __u32 len,
+                                          struct nvme_rotational_media_info_log *info)
+{
+       if (dev->type == NVME_DEV_DIRECT)
+               return nvme_get_log_rotational_media_info(dev->direct.fd, endgid, len, info);
+
+       return -ENODEV;
+}
index c9d861b6aee4803209ae6b309ac15c4befae5820..19a5e3598e807b6f20259dc4aa6bc18edefde800 100644 (file)
@@ -149,4 +149,7 @@ int nvme_cli_security_receive(struct nvme_dev *dev,
 int nvme_cli_get_log_mgmt_addr_list(struct nvme_dev *dev, __u32 len,
                                    struct nvme_mgmt_addr_list_log *ma_list);
 
+int nvme_cli_get_log_rotational_media_info(struct nvme_dev *dev, __u16 endgid, __u32 len,
+                                          struct nvme_rotational_media_info_log *info);
+
 #endif /* _NVME_WRAP_H */
diff --git a/nvme.c b/nvme.c
index 2ed4ee92623f2a8c4f5978be38847daf41badc96..0591fc72183ba664a8fe7ce859436e95b7ec9350 100644 (file)
--- a/nvme.c
+++ b/nvme.c
@@ -204,6 +204,7 @@ static const char *doper = "directive operation";
 static const char *dry = "show command instead of sending";
 static const char *dspec_w_dtype = "directive specification associated with directive type";
 static const char *dtype = "directive type";
+static const char *endgid = "Endurance Group Identifier (ENDGID)";
 static const char *force_unit_access = "force device to commit data before command completes";
 static const char *human_readable_directive = "show directive in readable format";
 static const char *human_readable_identify = "show identify in readable format";
@@ -3096,7 +3097,6 @@ static int create_ns(int argc, char **argv, struct command *cmd, struct plugin *
        const char *nmic = "multipath and sharing capabilities (NMIC)";
        const char *anagrpid = "ANA Group Identifier (ANAGRPID)";
        const char *nvmsetid = "NVM Set Identifier (NVMSETID)";
-       const char *endgid = "Endurance Group Identifier (ENDGID)";
        const char *csi = "command set identifier (CSI)";
        const char *lbstm = "logical block storage tag mask (LBSTM)";
        const char *nphndls = "Number of Placement Handles (NPHNDLS)";
@@ -10091,6 +10091,53 @@ static int get_mgmt_addr_list_log(int argc, char **argv, struct command *cmd, st
        return err;
 }
 
+static int get_rotational_media_info_log(int argc, char **argv, struct command *cmd,
+                                        struct plugin *plugin)
+{
+       const char *desc = "Retrieve Rotational Media Information Log, show it";
+       nvme_print_flags_t flags;
+       int err = -1;
+
+       _cleanup_free_ struct nvme_rotational_media_info_log *info = NULL;
+
+       _cleanup_nvme_dev_ struct nvme_dev *dev = NULL;
+
+       struct config {
+               __u16 endgid;
+       };
+
+       struct config cfg = {
+               .endgid = 0,
+       };
+
+       NVME_ARGS(opts,
+                 OPT_UINT("endg-id", 'e', &cfg.endgid, endgid));
+
+       err = parse_and_open(&dev, argc, argv, desc, opts);
+       if (err)
+               return err;
+
+       err = validate_output_format(nvme_cfg.output_format, &flags);
+       if (err < 0) {
+               nvme_show_error("Invalid output format");
+               return err;
+       }
+
+       info = nvme_alloc(sizeof(*info));
+       if (!info)
+               return -ENOMEM;
+
+       err = nvme_cli_get_log_rotational_media_info(dev, cfg.endgid, sizeof(*info), info);
+       if (!err)
+               nvme_show_rotational_media_info_log(info, flags);
+       else if (err > 0)
+               nvme_show_status(err);
+       else
+               nvme_show_perror("rotational media info log");
+
+       return err;
+}
+
 void register_extension(struct plugin *plugin)
 {
        plugin->parent = &nvme;