]> www.infradead.org Git - users/sagi/nvme-cli.git/commitdiff
nvme: Factor out parse telemetry log da element
authorDaniel Wagner <dwagner@suse.de>
Wed, 15 Feb 2023 14:05:00 +0000 (15:05 +0100)
committerDaniel Wagner <wagi@monom.org>
Fri, 24 Feb 2023 09:32:29 +0000 (10:32 +0100)
Make get_telemtetry_log_helper a bit more readable.

Signed-off-by: Daniel Wagner <dwagner@suse.de>
nvme.c

diff --git a/nvme.c b/nvme.c
index 5025edd9684bfd767326e39b142125e3e7109e74..48c61b674a181627048508f4377c3881da2bbeef 100644 (file)
--- a/nvme.c
+++ b/nvme.c
@@ -595,6 +595,45 @@ ret:
        return err;
 }
 
+static int parse_telemetry_da(struct nvme_dev *dev,
+                             enum nvme_telemetry_da da,
+                             struct nvme_telemetry_log *telem,
+                             size_t *size)
+
+{
+       struct nvme_id_ctrl id_ctrl;
+
+       switch (da) {
+       case NVME_TELEMETRY_DA_1:
+       case NVME_TELEMETRY_DA_2:
+       case NVME_TELEMETRY_DA_3:
+               /* dalb3 >= dalb2 >= dalb1 */
+               *size = (le16_to_cpu(telem->dalb3) + 1) *
+                       NVME_LOG_TELEM_BLOCK_SIZE;
+               break;
+       case NVME_TELEMETRY_DA_4:
+               if (nvme_cli_identify_ctrl(dev, &id_ctrl)) {
+                       perror("identify-ctrl");
+                       return -errno;
+               }
+
+               if (id_ctrl.lpa & 0x40) {
+                       *size = (le32_to_cpu(telem->dalb4) + 1) *
+                               NVME_LOG_TELEM_BLOCK_SIZE;
+               } else {
+                       fprintf(stderr, "Data area 4 unsupported, bit 6 "
+                               "of Log Page Attributes not set\n");
+                       return -EINVAL;
+               }
+               break;
+       default:
+               fprintf(stderr, "Invalid data area parameter - %d\n", da);
+               return -EINVAL;
+       }
+
+       return 0;
+}
+
 static int get_telemetry_log_helper(struct nvme_dev *dev, bool create,
                                    bool ctrl, struct nvme_telemetry_log **buf,
                                    enum nvme_telemetry_da da,
@@ -602,7 +641,6 @@ static int get_telemetry_log_helper(struct nvme_dev *dev, bool create,
 {
        static const __u32 xfer = NVME_LOG_TELEM_BLOCK_SIZE;
        struct nvme_telemetry_log *telem;
-       struct nvme_id_ctrl id_ctrl;
        void *log, *tmp;
        int err;
        *size = 0;
@@ -632,33 +670,9 @@ static int get_telemetry_log_helper(struct nvme_dev *dev, bool create,
                return 0;
        }
 
-       switch (da) {
-       case NVME_TELEMETRY_DA_1:
-       case NVME_TELEMETRY_DA_2:
-       case NVME_TELEMETRY_DA_3:
-               /* dalb3 >= dalb2 >= dalb1 */
-               *size = (le16_to_cpu(telem->dalb3) + 1) * xfer;
-               break;
-       case NVME_TELEMETRY_DA_4:
-               err = nvme_cli_identify_ctrl(dev, &id_ctrl);
-               if (err) {
-                       perror("identify-ctrl");
-                       goto free;
-               }
-
-               if (id_ctrl.lpa & 0x40) {
-                       *size = (le32_to_cpu(telem->dalb4) + 1) * xfer;
-               } else {
-                       fprintf(stderr, "Data area 4 unsupported, bit 6 of Log Page Attributes not set\n");
-                       err = -EINVAL;
-                       goto free;
-               }
-               break;
-       default:
-               fprintf(stderr, "Invalid data area parameter - %d\n", da);
-               err = -EINVAL;
+       err = parse_telemetry_da(dev, da, telem, size);
+       if (err)
                goto free;
-       }
 
        if (xfer == *size) {
                fprintf(stderr, "ERROR: No telemetry data block\n");