]> www.infradead.org Git - users/sagi/nvme-cli.git/commitdiff
nvme: Fix set feature command to get feature identifier 0Dh length as zero
authorTokunori Ikegami <ikegami.t@gmail.com>
Thu, 13 Oct 2022 16:13:22 +0000 (01:13 +0900)
committerDaniel Wagner <dwagner@suse.de>
Mon, 24 Oct 2022 14:41:58 +0000 (16:41 +0200)
The nvme_get_feature_length() function does not handle the direction
information correctly. Thus libnvme introduced a new version of this
function. Use it when available.

Signed-off-by: Tokunori Ikegami <ikegami.t@gmail.com>
[dwagner: Add wrapper code when nvme_get_feature_length2
          is not available]
Signed-off-by: Daniel Wagner <dwagner@suse.de>
libnvme-wrap.c
nvme-wrap.c
nvme-wrap.h
nvme.c

index c3c6dd22beb41d34396cf99bf97185c77690f1fb..bbd860093c912df733065335493d30606711b221 100644 (file)
@@ -6,6 +6,7 @@
  */
 
 #include <dlfcn.h>
+#include <errno.h>
 
 #include <libnvme.h>
 
@@ -40,3 +41,10 @@ VOID_FN(nvme_init_copy_range_f1,
              __u64 *slbas, __u64 *eilbrts, __u32 *elbatms,
              __u32 *elbats, __u16 nr),
        ARGS(copy, nlbs, slbas, eilbrts, elbatms, elbats, nr))
+
+FN(nvme_get_feature_length2,
+       int,
+       PROTO(int fid, __u32 cdw11, enum nvme_data_tfr dir,
+             __u32 *len),
+       ARGS(fid, cdw11, dir, len),
+       -EEXIST)
index 63274fe4cfe2cf14f91e6a84aebbc74661668844..c31ec1110617d9bcf2d6faf0fb3512fb21e743ad 100644 (file)
@@ -350,3 +350,13 @@ int nvme_cli_ns_mgmt_create(struct nvme_dev *dev, struct nvme_id_ns *ns,
        return -ENODEV;
 }
 
+int nvme_cli_get_feature_length2(int fid, __u32 cdw11, enum nvme_data_tfr dir,
+                                __u32 *len)
+{
+       int err;
+
+       err = nvme_get_feature_length2(fid, cdw11, dir, len);
+       if (err != -EEXIST)
+               return err;
+       return nvme_get_feature_length(fid, cdw11, len);
+}
index db76ba65521f4eaae9c82b368ec1c74eb615c3da..fe8939166e86bd1975a82e4dc72e3f261de534f4 100644 (file)
@@ -118,4 +118,8 @@ int nvme_cli_fw_download(struct nvme_dev *dev,
 
 int nvme_cli_fw_commit(struct nvme_dev *dev,
                         struct nvme_fw_commit_args *args);
+
+int nvme_cli_get_feature_length2(int fid, __u32 cdw11, enum nvme_data_tfr dir,
+                               __u32 *len);
+
 #endif /* _NVME_WRAP_H */
diff --git a/nvme.c b/nvme.c
index 4dac135a33940bf842dab8339e80ec82f0390317..ec0543e67a95eb8491b0dc3a1f261419e58d0b6e 100644 (file)
--- a/nvme.c
+++ b/nvme.c
@@ -5128,8 +5128,9 @@ static int set_feature(int argc, char **argv, struct command *cmd, struct plugin
        }
 
        if (!cfg.data_len)
-               nvme_get_feature_length(cfg.feature_id, cfg.value,
-                                       &cfg.data_len);
+               nvme_cli_get_feature_length2(cfg.feature_id, cfg.value,
+                                            NVME_DATA_TFR_HOST_TO_CTRL,
+                                            &cfg.data_len);
 
        if (cfg.data_len) {
                if (posix_memalign(&buf, getpagesize(), cfg.data_len)) {