]> www.infradead.org Git - users/sagi/nvme-cli.git/commitdiff
nvme-cli: add support for json output format of sanitize-log command
authorMinwoo Im <minwoo.im.dev@gmail.com>
Wed, 10 Jan 2018 11:59:29 +0000 (20:59 +0900)
committerMinwoo Im <minwoo.im.dev@gmail.com>
Wed, 10 Jan 2018 11:59:29 +0000 (20:59 +0900)
Add support for json output format of sanitize-log command.

Signed-off-by: Minwoo Im <minwoo.im.dev@gmail.com>
nvme-print.c
nvme-print.h
nvme.c

index 0008f6fe0f34ebffb31fa968e250a75656a29747..542e3e42119ec0811bcb17ab89a302fa416453f2 100644 (file)
@@ -1109,9 +1109,9 @@ static void show_sanitize_log_sprog(__u32 sprog)
        printf("\t(%f%%)\n", percent);
 }
 
-static void show_sanitize_log_sstat(__u16 status)
+static const char *get_sanitize_log_sstat_status_str(__u16 status)
 {
-       const char * str;
+       const char *str;
 
        switch (status & NVME_SANITIZE_LOG_STATUS_MASK) {
        case NVME_SANITIZE_LOG_NEVER_SANITIZED:
@@ -1130,6 +1130,13 @@ static void show_sanitize_log_sstat(__u16 status)
                str = "Unknown.";
        }
 
+       return str;
+}
+
+static void show_sanitize_log_sstat(__u16 status)
+{
+       const char *str = get_sanitize_log_sstat_status_str(status);
+
        printf("\t[2:0]\t%s\n", str);
        str = "Number of completed passes if most recent operation was overwrite";
        printf("\t[7:3]\t%s:\t%u\n", str, (status & NVME_SANITIZE_LOG_NUM_CMPLTED_PASS_MASK) >> 3);
@@ -1963,6 +1970,40 @@ void json_smart_log(struct nvme_smart_log *smart, unsigned int nsid, const char
        json_free_object(root);
 }
 
+void json_sanitize_log(struct nvme_sanitize_log_page *sanitize_log, const char *devname)
+{
+       struct json_object *root;
+       struct json_object *dev;
+       struct json_object *sstat;
+       const char *status_str;
+       char str[128];
+
+       root = json_create_object();
+       dev = json_create_object();
+       sstat = json_create_object();
+
+       json_object_add_value_int(dev, "sprog", le16_to_cpu(sanitize_log->progress));
+       json_object_add_value_int(sstat, "global_erased",
+                       (le16_to_cpu(sanitize_log->status) & NVME_SANITIZE_LOG_GLOBAL_DATA_ERASED) >> 8);
+       json_object_add_value_int(sstat, "no_cmplted_passes",
+                       (le16_to_cpu(sanitize_log->status) & NVME_SANITIZE_LOG_NUM_CMPLTED_PASS_MASK) >> 3);
+
+       status_str = get_sanitize_log_sstat_status_str(sanitize_log->status);
+       sprintf(str, "(%d) %s", sanitize_log->status & NVME_SANITIZE_LOG_STATUS_MASK, status_str);
+       json_object_add_value_string(sstat, "status", str);
+
+       json_object_add_value_object(dev, "sstat", sstat);
+       json_object_add_value_int(dev, "cdw10_info", le32_to_cpu(sanitize_log->cdw10_info));
+       json_object_add_value_int(dev, "time_over_write", le32_to_cpu(sanitize_log->est_ovrwrt_time));
+       json_object_add_value_int(dev, "time_block_erase", le32_to_cpu(sanitize_log->est_blk_erase_time));
+       json_object_add_value_int(dev, "time_crypto_erase", le32_to_cpu(sanitize_log->est_crypto_erase_time));
+
+       json_object_add_value_object(root, devname, dev);
+       json_print_object(root, NULL);
+       printf("\n");
+       json_free_object(root);
+}
+
 void json_print_nvme_subsystem_list(struct subsys_list_item *slist, int n)
 {
        struct json_object *root;
index b7593fc17ab966d55868982de4d526f952bcb2f3..590371688723ee453d8c0fa99bd6c90d5ec1f754 100644 (file)
@@ -42,6 +42,7 @@ void json_nvme_id_ns(struct nvme_id_ns *ns, unsigned int flags);
 void json_nvme_resv_report(struct nvme_reservation_status *status, int bytes, __u32 cdw11);
 void json_error_log(struct nvme_error_log_page *err_log, int entries, const char *devname);
 void json_smart_log(struct nvme_smart_log *smart, unsigned int nsid, const char *devname);
+void json_sanitize_log(struct nvme_sanitize_log_page *sanitize_log, const char *devname);
 void json_fw_log(struct nvme_firmware_log_page *fw_log, const char *devname);
 void json_print_list_items(struct list_item *items, unsigned amnt);
 void json_nvme_id_ns_descs(void *data);
diff --git a/nvme.c b/nvme.c
index 21b593122eec74c2f6c6ae744ef3bfaf05cf42a2..f985b7a920d44760291790da7189db56eca347f6 100644 (file)
--- a/nvme.c
+++ b/nvme.c
@@ -508,7 +508,7 @@ static int sanitize_log(int argc, char **argv, struct command *command, struct p
                if (fmt == BINARY)
                        d_raw((unsigned char *)&sanitize_log, sizeof(sanitize_log));
                else if (fmt == JSON)
-                       return -EINVAL;
+                       json_sanitize_log(&sanitize_log, devicename);
                else
                        show_sanitize_log(&sanitize_log, flags, devicename);
        }