]> www.infradead.org Git - users/sagi/nvme-cli.git/commitdiff
nvme: change get_feature to get multiple feature ids
authorTokunori Ikegami <ikegami.t@gmail.com>
Tue, 26 Oct 2021 16:55:41 +0000 (01:55 +0900)
committerTokunori Ikegami <ikegami.t@gmail.com>
Wed, 27 Oct 2021 13:15:38 +0000 (22:15 +0900)
Signed-off-by: Tokunori Ikegami <ikegami.t@gmail.com>
nvme.c

diff --git a/nvme.c b/nvme.c
index dae44ad7577a76917feed480f830f7bbe7835db3..3f061184f2ab5b797654d37d295499b03841ad42 100644 (file)
--- a/nvme.c
+++ b/nvme.c
@@ -2758,7 +2758,8 @@ static int get_feature_id(int fd, struct feat_cfg cfg)
                } else if (buf)
                        d_raw(buf, cfg.data_len);
        } else if (err > 0) {
-               nvme_show_status(err);
+               if (err != NVME_SC_INVALID_FIELD)
+                       nvme_show_status(err);
        } else {
                perror("get-feature");
        }
@@ -2789,6 +2790,9 @@ static int get_feature(int argc, char **argv, struct command *cmd, struct plugin
        const char *uuid_index = "specify uuid index";
        int err;
        int fd;
+       int i;
+       int feat_max = 0x100;
+       int feat_num = 0;
 
        struct feat_cfg cfg = {
                .feature_id   = 0,
@@ -2833,11 +2837,8 @@ static int get_feature(int argc, char **argv, struct command *cmd, struct plugin
                goto close_fd;
        }
 
-       if (!cfg.feature_id) {
-               fprintf(stderr, "feature-id required param\n");
-               err = -EINVAL;
-               goto close_fd;
-       }
+       if (cfg.feature_id)
+               feat_max = cfg.feature_id + 1;
 
        if (cfg.uuid_index > 128) {
                fprintf(stderr, "invalid uuid index param: %u\n", cfg.uuid_index);
@@ -2846,7 +2847,15 @@ static int get_feature(int argc, char **argv, struct command *cmd, struct plugin
                goto close_fd;
        }
 
-       err = get_feature_id(fd, cfg);
+       for (i = cfg.feature_id; i < feat_max; i++, feat_num++) {
+               cfg.feature_id = i;
+               err = get_feature_id(fd, cfg);
+               if (err && err != NVME_SC_INVALID_FIELD)
+                       break;
+       }
+
+       if (err == NVME_SC_INVALID_FIELD && feat_num == 1)
+               nvme_show_status(err);
 
 close_fd:
        close(fd);