]> www.infradead.org Git - users/sagi/nvme-cli.git/commitdiff
nvme: Continue get feature on invalid NS error to get multiple feature ids
authorTokunori Ikegami <ikegami.t@gmail.com>
Fri, 24 Feb 2023 15:54:24 +0000 (00:54 +0900)
committerDaniel Wagner <wagi@monom.org>
Wed, 1 Mar 2023 11:08:53 +0000 (12:08 +0100)
Some features returned invalid NS if NSID all 0xffffffff default specified.
Also print get feature ID for invalid NS error to get multiple feature ids.

Signed-off-by: Tokunori Ikegami <ikegami.t@gmail.com>
nvme.c

diff --git a/nvme.c b/nvme.c
index e9ab1eeada73acfa0ffbcfc511c243e7de83013f..b068a932b45ced22d8f97a25b5588fe0a3859ce5 100644 (file)
--- a/nvme.c
+++ b/nvme.c
@@ -4549,6 +4549,9 @@ static int filter_out_flags(int status)
 static void get_feature_id_print(struct feat_cfg cfg, int err, __u32 result,
                                 void *buf)
 {
+       int status = filter_out_flags(err);
+       enum nvme_status_type type = NVME_STATUS_TYPE_NVME;
+
        if (!err) {
                if (!cfg.raw_binary || !buf) {
                        printf("get-feature:%#0*x (%s), %s value:%#0*x\n",
@@ -4567,9 +4570,8 @@ static void get_feature_id_print(struct feat_cfg cfg, int err, __u32 result,
                        d_raw(buf, cfg.data_len);
                }
        } else if (err > 0) {
-               if (!nvme_status_equals(filter_out_flags(err),
-                                       NVME_STATUS_TYPE_NVME,
-                                       NVME_SC_INVALID_FIELD))
+               if (!nvme_status_equals(status, type, NVME_SC_INVALID_FIELD) &&
+                   !nvme_status_equals(status,  type, NVME_SC_INVALID_NS))
                        nvme_show_status(err);
        } else {
                fprintf(stderr, "get-feature: %s\n", nvme_strerror(errno));
@@ -4616,6 +4618,8 @@ static int get_feature_ids(struct nvme_dev *dev, struct feat_cfg cfg)
        int feat_max = 0x100;
        int feat_num = 0;
        bool changed = false;
+       int status = 0;
+       enum nvme_status_type type = NVME_STATUS_TYPE_NVME;
 
        if (cfg.sel == 8)
                changed = true;
@@ -4626,15 +4630,21 @@ static int get_feature_ids(struct nvme_dev *dev, struct feat_cfg cfg)
        for (i = cfg.feature_id; i < feat_max; i++, feat_num++) {
                cfg.feature_id = i;
                err = get_feature_id_changed(dev, cfg, changed);
-               if (err && !nvme_status_equals(filter_out_flags(err),
-                                              NVME_STATUS_TYPE_NVME,
-                                              NVME_SC_INVALID_FIELD))
+               if (!err)
+                       continue;
+               status = filter_out_flags(err);
+               if (nvme_status_equals(status, type, NVME_SC_INVALID_FIELD))
+                       continue;
+               if (!nvme_status_equals(status, type, NVME_SC_INVALID_NS))
                        break;
+               fprintf(stderr, "get-feature:%#0*x (%s): ",
+                       cfg.feature_id ? 4 : 2, cfg.feature_id,
+                       nvme_feature_to_string(cfg.feature_id));
+               nvme_show_status(err);
        }
 
-       if (feat_num == 1 && nvme_status_equals(filter_out_flags(err),
-                                               NVME_STATUS_TYPE_NVME,
-                                               NVME_SC_INVALID_FIELD))
+       if (feat_num == 1 &&
+           nvme_status_equals(status, type, NVME_SC_INVALID_FIELD))
                nvme_show_status(err);
 
        return err;