NVME_DPKG_VERSION=1~`lsb_release -sc`
OBJS := argconfig.o suffix.o parser.o nvme-print.o nvme-ioctl.o \
- nvme-lightnvm.o fabrics.o json.o plugin.o
+ nvme-lightnvm.o fabrics.o json.o plugin.o intel-nvme.o
nvme: nvme.c nvme.h $(OBJS) NVME-VERSION-FILE
$(CC) $(CPPFLAGS) $(CFLAGS) nvme.c $(LDFLAGS) -o $(NVME) $(OBJS)
--- /dev/null
+#include <stdio.h>
+
+#include "nvme.h"
+#include "nvme-print.h"
+#include "nvme-ioctl.h"
+#include "plugin.h"
+
+#include "argconfig.h"
+#include "suffix.h"
+
+#define CREATE_CMD
+#include "intel-nvme.h"
+
+static struct plugin intel_nvme = {
+ .name = "intel",
+ .desc = "Intel vendor specific extensions",
+ .next = NULL,
+ .commands = commands,
+};
+
+static void init() __attribute__((constructor));
+static void init()
+{
+ register_extension(&intel_nvme);
+}
+
+static int get_additional_smart_log(int argc, char **argv, struct command *cmd, struct plugin *plugin)
+{
+ struct nvme_additional_smart_log smart_log;
+ int err, fd;
+ char *desc = "Get Intel vendor specific additional smart log (optionally, "\
+ "for the specified namespace), and show it.";
+ const char *namespace = "(optional) desired namespace";
+ const char *raw = "dump output in binary format";
+ struct config {
+ __u32 namespace_id;
+ int raw_binary;
+ };
+
+ struct config cfg = {
+ .namespace_id = 0xffffffff,
+ };
+
+ const struct argconfig_commandline_options command_line_options[] = {
+ {"namespace-id", 'n', "NUM", CFG_POSITIVE, &cfg.namespace_id, required_argument, namespace},
+ {"raw-binary", 'b', "", CFG_NONE, &cfg.raw_binary, no_argument, raw},
+ {0}
+ };
+
+ fd = parse_and_open(argc, argv, desc, command_line_options, &cfg, sizeof(cfg));
+
+ err = nvme_intel_smart_log(fd, cfg.namespace_id, &smart_log);
+ if (!err) {
+ if (!cfg.raw_binary)
+ show_intel_smart_log(&smart_log, cfg.namespace_id, devicename);
+ else
+ d_raw((unsigned char *)&smart_log, sizeof(smart_log));
+ }
+ else if (err > 0)
+ fprintf(stderr, "NVMe Status:%s(%x)\n",
+ nvme_status_to_string(err), err);
+ return err;
+}
--- /dev/null
+#undef CMD_INC_FILE
+#define CMD_INC_FILE intel-nvme
+
+#if !defined(INTEL_NVME) || defined(CMD_HEADER_MULTI_READ)
+#define INTEL_NVME
+
+#include "cmd.h"
+
+COMMAND_LIST(
+ ENTRY("smart-log-add", "Retrieve Intel SMART Log, show it", get_additional_smart_log)
+);
+
+#endif
+
+#include "define_cmd.h"
static int fd;
static struct stat nvme_stat;
-static const char *devicename;
+const char *devicename;
static const char nvme_version_string[] = NVME_VERSION;
open_dev((const char *)argv[optind]);
}
-static void parse_and_open(int argc, char **argv, const char *desc,
+int parse_and_open(int argc, char **argv, const char *desc,
const struct argconfig_commandline_options *clo, void *cfg, size_t size)
{
argconfig_parse(argc, argv, desc, clo, cfg, size);
get_dev(argc, argv);
+ return fd;
}
const char *output_format = "Output format: normal|json|binary";
return disconnect(desc, argc, argv);
}
-void register_extention(struct plugin *plugin)
+void register_extension(struct plugin *plugin)
{
plugin->parent = &nvme;
void register_extension(struct plugin *plugin);
+#include "argconfig.h"
+int parse_and_open(int argc, char **argv, const char *desc,
+ const struct argconfig_commandline_options *clo, void *cfg, size_t size);
+
+extern const char *devicename;
+
#endif /* _NVME_H */
continue;
}
return handle_plugin(argc - 1, &argv[1], extension);
+ extension = extension->next;
}
return -1;
}