diff --git a/SOURCES/nvme-cli-add-netapp-ontapdev-command-patch b/SOURCES/nvme-cli-add-netapp-ontapdev-command-patch new file mode 100644 index 0000000..b3b1a13 --- /dev/null +++ b/SOURCES/nvme-cli-add-netapp-ontapdev-command-patch @@ -0,0 +1,429 @@ +commit 70bfe077af40aeace6c9e2b628b20cf8a34c1def +Author: Martin George +Date: Mon Apr 1 09:39:56 2019 -0700 + + nvme-cli: add netapp ontapdevices command + + Add a new ontapdevices command to the NetApp plugin for + NetApp ONTAP devices. + + Signed-off-by: Martin George + Reviewed-by: Steve Schremmer + +diff --git a/plugins/netapp/netapp-nvme.c b/plugins/netapp/netapp-nvme.c +index 416e74e..2951311 100644 +--- a/plugins/netapp/netapp-nvme.c ++++ b/plugins/netapp/netapp-nvme.c +@@ -21,6 +21,7 @@ + #include + #include + #include ++#include + + #include "nvme.h" + #include "nvme-ioctl.h" +@@ -31,12 +32,28 @@ + #define CREATE_CMD + #include "netapp-nvme.h" + ++#define ONTAP_C2_LOG_ID 0xC2 ++#define ONTAP_C2_LOG_SIZE 4096 ++#define ONTAP_LABEL_LEN 260 ++#define ONTAP_NS_PATHLEN 520 ++ + enum { + NNORMAL, + NJSON, + NCOLUMN, + }; + ++enum { ++ ONTAP_C2_LOG_SUPPORTED_LSP = 0x0, ++ ONTAP_C2_LOG_NSINFO_LSP = 0x1, ++}; ++ ++enum { ++ ONTAP_VSERVER_TLV = 0x11, ++ ONTAP_VOLUME_TLV = 0x12, ++ ONTAP_NS_TLV = 0x13, ++}; ++ + static const char *dev_path = "/dev/"; + + struct smdevice_info { +@@ -46,6 +63,15 @@ struct smdevice_info { + char dev[265]; + }; + ++struct ontapdevice_info { ++ int nsid; ++ struct nvme_id_ctrl ctrl; ++ struct nvme_id_ns ns; ++ char nsdesc[4096]; ++ unsigned char log_data[ONTAP_C2_LOG_SIZE]; ++ char dev[265]; ++}; ++ + #define ARRAY_LABEL_LEN 60 + #define VOLUME_LABEL_LEN 60 + +@@ -77,6 +103,100 @@ static void netapp_nguid_to_str(char *str, __u8 *nguid) + str += sprintf(str, "%02x", nguid[i]); + } + ++static void netapp_get_ns_size(char *size, long long *lba, ++ struct nvme_id_ns *ns) ++{ ++ *lba = 1 << ns->lbaf[(ns->flbas & 0x0F)].ds; ++ double nsze = le64_to_cpu(ns->nsze) * (*lba); ++ const char *s_suffix = suffix_si_get(&nsze); ++ ++ sprintf(size, "%.2f%sB", nsze, s_suffix); ++} ++ ++static void netapp_uuid_to_str(char *str, void *data) ++{ ++#ifdef LIBUUID ++ uuid_t uuid; ++ struct nvme_ns_id_desc *desc = data; ++ ++ memcpy(uuid, data + sizeof(*desc), 16); ++ uuid_unparse_lower(uuid, str); ++#endif ++} ++ ++static void ontap_labels_to_str(char *dst, char *src, int count) ++{ ++ int i; ++ ++ memset(dst, 0, ONTAP_LABEL_LEN); ++ for (i = 0; i < count; i++) { ++ if (src[i] >= '!' && src[i] <= '~') ++ dst[i] = src[i]; ++ else ++ break; ++ } ++ dst[i] = '\0'; ++} ++ ++static void netapp_get_ontap_labels(char *vsname, char *nspath, ++ unsigned char *log_data) ++{ ++ int lsp, tlv, label_len; ++ char *vserver_name, *volume_name, *namespace_name; ++ char vol_name[ONTAP_LABEL_LEN], ns_name[ONTAP_LABEL_LEN]; ++ const char *ontap_vol = "/vol/"; ++ int i, j; ++ ++ /* get the lsp */ ++ lsp = (*(__u8 *)&log_data[16]) & 0x0F; ++ if (lsp != ONTAP_C2_LOG_NSINFO_LSP) ++ /* lsp not related to nsinfo */ ++ return; ++ ++ /* get the vserver tlv and name */ ++ tlv = *(__u8 *)&log_data[32]; ++ if (tlv == ONTAP_VSERVER_TLV) { ++ label_len = (*(__u16 *)&log_data[34]) * 4; ++ vserver_name = (char *)&log_data[36]; ++ ontap_labels_to_str(vsname, vserver_name, label_len); ++ } else { ++ /* not the expected vserver tlv */ ++ fprintf(stderr, "Unable to fetch ONTAP vserver name\n"); ++ return; ++ } ++ ++ i = 36 + label_len; ++ j = i + 2; ++ /* get the volume tlv and name */ ++ tlv = *(__u8 *)&log_data[i]; ++ if (tlv == ONTAP_VOLUME_TLV) { ++ label_len = (*(__u16 *)&log_data[j]) * 4; ++ volume_name = (char *)&log_data[j + 2]; ++ ontap_labels_to_str(vol_name, volume_name, label_len); ++ } else { ++ /* not the expected volume tlv */ ++ fprintf(stderr, "Unable to fetch ONTAP volume name\n"); ++ return; ++ } ++ ++ i += 4 + label_len; ++ j += 4 + label_len; ++ /* get the namespace tlv and name */ ++ tlv = *(__u8 *)&log_data[i]; ++ if (tlv == ONTAP_NS_TLV) { ++ label_len = (*(__u16 *)&log_data[j]) * 4; ++ namespace_name = (char *)&log_data[j + 2]; ++ ontap_labels_to_str(ns_name, namespace_name, label_len); ++ } else { ++ /* not the expected namespace tlv */ ++ fprintf(stderr, "Unable to fetch ONTAP namespace name\n"); ++ return; ++ } ++ ++ snprintf(nspath, ONTAP_NS_PATHLEN, "%s%s%s%s", ontap_vol, ++ vol_name, "/", ns_name); ++} ++ + static void netapp_smdevice_json(struct json_array *devices, char *devname, + char *arrayname, char *volname, int nsid, char *nguid, + char *ctrl, char *astate, char *size, long long lba, +@@ -99,6 +219,25 @@ static void netapp_smdevice_json(struct json_array *devices, char *devname, + json_array_add_value_object(devices, device_attrs); + } + ++static void netapp_ontapdevice_json(struct json_array *devices, char *devname, ++ char *vsname, char *nspath, int nsid, char *uuid, ++ char *size, long long lba, long long nsze) ++{ ++ struct json_object *device_attrs; ++ ++ device_attrs = json_create_object(); ++ json_object_add_value_string(device_attrs, "Device", devname); ++ json_object_add_value_string(device_attrs, "Vserver", vsname); ++ json_object_add_value_string(device_attrs, "Namespace_Path", nspath); ++ json_object_add_value_int(device_attrs, "NSID", nsid); ++ json_object_add_value_string(device_attrs, "UUID", uuid); ++ json_object_add_value_string(device_attrs, "Size", size); ++ json_object_add_value_int(device_attrs, "LBA_Data_Size", lba); ++ json_object_add_value_int(device_attrs, "Namespace_Size", nsze); ++ ++ json_array_add_value_object(devices, device_attrs); ++} ++ + static void netapp_smdevices_print(struct smdevice_info *devices, int count, int format) + { + struct json_object *root = NULL; +@@ -161,6 +300,94 @@ static void netapp_smdevices_print(struct smdevice_info *devices, int count, int + } + } + ++static void netapp_ontapdevices_print(struct ontapdevice_info *devices, ++ int count, int format) ++{ ++ struct json_object *root = NULL; ++ struct json_array *json_devices = NULL; ++ char vsname[ONTAP_LABEL_LEN] = " "; ++ char nspath[ONTAP_NS_PATHLEN] = " "; ++ long long lba; ++ char size[128]; ++ char uuid_str[37] = " "; ++ int i; ++ ++ char basestr[] = "%s, Vserver %s, Namespace Path %s, NSID %d, UUID %s, %s\n"; ++ char columnstr[] = "%-16s %-25s %-50s %-4d %-38s %-9s\n"; ++ ++ /* default to 'normal' output format */ ++ char *formatstr = basestr; ++ ++ if (format == NCOLUMN) { ++ /* change output string and print column headers */ ++ formatstr = columnstr; ++ printf("%-16s %-25s %-50s %-4s %-38s %-9s\n", ++ "Device", "Vserver", "Namespace Path", ++ "NSID", "UUID", "Size"); ++ printf("%-16s %-25s %-50s %-4s %-38s %-9s\n", ++ "----------------", "-------------------------", ++ "--------------------------------------------------", ++ "----", "--------------------------------------", ++ "---------"); ++ } else if (format == NJSON) { ++ /* prepare for json output */ ++ root = json_create_object(); ++ json_devices = json_create_array(); ++ } ++ ++ for (i = 0; i < count; i++) { ++ ++ netapp_get_ns_size(size, &lba, &devices[i].ns); ++ netapp_uuid_to_str(uuid_str, devices[i].nsdesc); ++ netapp_get_ontap_labels(vsname, nspath, devices[i].log_data); ++ ++ if (format == NJSON) { ++ netapp_ontapdevice_json(json_devices, devices[i].dev, ++ vsname, nspath, devices[i].nsid, ++ uuid_str, size, lba, ++ le64_to_cpu(devices[i].ns.nsze)); ++ } else ++ printf(formatstr, devices[i].dev, vsname, nspath, ++ devices[i].nsid, uuid_str, size); ++ } ++ ++ if (format == NJSON) { ++ /* complete the json output */ ++ json_object_add_value_array(root, "ONTAPdevices", json_devices); ++ json_print_object(root, NULL); ++ } ++} ++ ++static int nvme_get_ontap_c2_log(int fd, __u32 nsid, void *buf, __u32 buflen) ++{ ++ struct nvme_admin_cmd get_log; ++ int err; ++ ++ memset(buf, 0, buflen); ++ memset(&get_log, 0, sizeof(struct nvme_admin_cmd)); ++ ++ get_log.opcode = nvme_admin_get_log_page; ++ get_log.nsid = nsid; ++ get_log.addr = (__u64)(uintptr_t)buf; ++ get_log.data_len = buflen; ++ ++ __u32 numd = (get_log.data_len >> 2) - 1; ++ __u32 numdu = numd >> 16; ++ __u32 numdl = numd & 0xFFFF; ++ ++ get_log.cdw10 = ONTAP_C2_LOG_ID | (numdl << 16); ++ get_log.cdw10 |= ONTAP_C2_LOG_NSINFO_LSP << 8; ++ get_log.cdw11 = numdu; ++ ++ err = nvme_submit_passthru(fd, NVME_IOCTL_ADMIN_CMD, &get_log); ++ if (err) { ++ fprintf(stderr, "ioctl error %0x\n", err); ++ return 1; ++ } ++ ++ return 0; ++} ++ + static int netapp_smdevices_get_info(int fd, struct smdevice_info *item, + const char *dev) + { +@@ -188,6 +415,50 @@ static int netapp_smdevices_get_info(int fd, struct smdevice_info *item, + return 1; + } + ++static int netapp_ontapdevices_get_info(int fd, struct ontapdevice_info *item, ++ const char *dev) ++{ ++ int err; ++ ++ err = nvme_identify_ctrl(fd, &item->ctrl); ++ if (err) { ++ fprintf(stderr, "Identify Controller failed to %s (%s)\n", ++ dev, strerror(err)); ++ return 0; ++ } ++ ++ if (strncmp("NetApp ONTAP Controller", item->ctrl.mn, 23) != 0) ++ /* not the right controller model */ ++ return 0; ++ ++ item->nsid = nvme_get_nsid(fd); ++ ++ err = nvme_identify_ns(fd, item->nsid, 0, &item->ns); ++ if (err) { ++ fprintf(stderr, "Unable to identify namespace for %s (%s)\n", ++ dev, strerror(err)); ++ return 0; ++ } ++ ++ err = nvme_identify_ns_descs(fd, item->nsid, item->nsdesc); ++ if (err) { ++ fprintf(stderr, "Unable to identify namespace descriptor for %s (%s)\n", ++ dev, strerror(err)); ++ return 0; ++ } ++ ++ err = nvme_get_ontap_c2_log(fd, item->nsid, item->log_data, ONTAP_C2_LOG_SIZE); ++ if (err) { ++ fprintf(stderr, "Unable to get log page data for %s (%s)\n", ++ dev, strerror(err)); ++ return 0; ++ } ++ ++ strncpy(item->dev, dev, sizeof(item->dev)); ++ ++ return 1; ++} ++ + static int netapp_nvme_filter(const struct dirent *d) + { + char path[264]; +@@ -294,3 +565,74 @@ static int netapp_smdevices(int argc, char **argv, struct command *command, + free(smdevices); + return 0; + } ++ ++/* handler for 'nvme netapp ontapdevices' */ ++static int netapp_ontapdevices(int argc, char **argv, struct command *command, ++ struct plugin *plugin) ++{ ++ const char *desc = "Display information about ONTAP devices."; ++ struct config { ++ char *output_format; ++ }; ++ struct config cfg = { ++ .output_format = "normal", ++ }; ++ struct dirent **devices; ++ int num, i, fd, ret, fmt; ++ struct ontapdevice_info *ontapdevices; ++ char path[264]; ++ int num_ontapdevices = 0; ++ ++ const struct argconfig_commandline_options opts[] = { ++ {"output-format", 'o', "FMT", CFG_STRING, &cfg.output_format, ++ required_argument, "Output Format: normal|json|column"}, ++ {NULL} ++ }; ++ ++ ret = argconfig_parse(argc, argv, desc, opts, &cfg, sizeof(cfg)); ++ if (ret < 0) ++ return ret; ++ ++ fmt = netapp_output_format(cfg.output_format); ++ if (fmt != NNORMAL && fmt != NCOLUMN && fmt != NJSON) { ++ fprintf(stderr, "Unrecognized output format: %s\n", cfg.output_format); ++ return -EINVAL; ++ } ++ ++ num = scandir(dev_path, &devices, netapp_nvme_filter, alphasort); ++ if (num <= 0) { ++ fprintf(stderr, "No NVMe devices detected.\n"); ++ return num; ++ } ++ ++ ontapdevices = calloc(num, sizeof(*ontapdevices)); ++ if (!ontapdevices) { ++ fprintf(stderr, "Unable to allocate memory for devices.\n"); ++ return -ENOMEM; ++ } ++ ++ for (i = 0; i < num; i++) { ++ snprintf(path, sizeof(path), "%s%s", dev_path, ++ devices[i]->d_name); ++ fd = open(path, O_RDONLY); ++ if (fd < 0) { ++ fprintf(stderr, "Unable to open %s: %s\n", path, ++ strerror(errno)); ++ continue; ++ } ++ ++ num_ontapdevices += netapp_ontapdevices_get_info(fd, ++ &ontapdevices[num_ontapdevices], path); ++ ++ close(fd); ++ } ++ ++ if (num_ontapdevices) ++ netapp_ontapdevices_print(ontapdevices, num_ontapdevices, fmt); ++ ++ for (i = 0; i < num; i++) ++ free(devices[i]); ++ free(devices); ++ free(ontapdevices); ++ return 0; ++} +diff --git a/plugins/netapp/netapp-nvme.h b/plugins/netapp/netapp-nvme.h +index 3dd019e..d4eebd6 100644 +--- a/plugins/netapp/netapp-nvme.h ++++ b/plugins/netapp/netapp-nvme.h +@@ -9,6 +9,7 @@ + PLUGIN(NAME("netapp", "NetApp vendor specific extensions"), + COMMAND_LIST( + ENTRY("smdevices", "NetApp SMdevices", netapp_smdevices) ++ ENTRY("ontapdevices", "NetApp ONTAPdevices", netapp_ontapdevices) + ) + ); + diff --git a/SOURCES/nvme-cli-add-netapp-ontapdev-man-page-patch b/SOURCES/nvme-cli-add-netapp-ontapdev-man-page-patch new file mode 100644 index 0000000..450287c --- /dev/null +++ b/SOURCES/nvme-cli-add-netapp-ontapdev-man-page-patch @@ -0,0 +1,950 @@ +commit 8f963b85132074f370e5f1e8318890fdbbf605b4 +Author: Martin George +Date: Mon Apr 1 09:39:57 2019 -0700 + + nvme-cli: add netapp ontapdevices man page + + Signed-off-by: Martin George + Reviewed-by: Steve Schremmer + +diff --git a/Documentation/nvme-netapp-ontapdevices.1 b/Documentation/nvme-netapp-ontapdevices.1 +new file mode 100644 +index 0000000..0669457 +--- /dev/null ++++ b/Documentation/nvme-netapp-ontapdevices.1 +@@ -0,0 +1,74 @@ ++'\" t ++.\" Title: nvme-netapp-ontapdevices ++.\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author] ++.\" Generator: DocBook XSL Stylesheets vsnapshot ++.\" Date: 01/08/2019 ++.\" Manual: NVMe Manual ++.\" Source: NVMe ++.\" Language: English ++.\" ++.TH "NVME\-NETAPP\-ONTAPDEV" "1" "01/08/2019" "NVMe" "NVMe Manual" ++.\" ----------------------------------------------------------------- ++.\" * Define some portability stuff ++.\" ----------------------------------------------------------------- ++.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ++.\" http://bugs.debian.org/507673 ++.\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html ++.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ++.ie \n(.g .ds Aq \(aq ++.el .ds Aq ' ++.\" ----------------------------------------------------------------- ++.\" * set default formatting ++.\" ----------------------------------------------------------------- ++.\" disable hyphenation ++.nh ++.\" disable justification (adjust text to left margin only) ++.ad l ++.\" ----------------------------------------------------------------- ++.\" * MAIN CONTENT STARTS HERE * ++.\" ----------------------------------------------------------------- ++.SH "NAME" ++nvme-netapp-ontapdevices \- Display information about ONTAP devices ++.SH "SYNOPSIS" ++.sp ++.nf ++\fInvme netapp ontapdevices\fR [\-o | \-\-output\-format=] ++.fi ++.SH "DESCRIPTION" ++.sp ++Display information about ONTAP devices on the host\&. The ONTAP devices are identified using the Identify Controller data\&. ++.SH "OPTIONS" ++.PP ++\-o , \-\-output\-format= ++.RS 4 ++Set the reporting format to ++\fInormal\fR ++(default), ++\fIcolumn\fR, or ++\fIjson\fR\&. Only one output format can be used at a time\&. ++.RE ++.SH "EXAMPLES" ++.sp ++.RS 4 ++.ie n \{\ ++\h'-04'\(bu\h'+03'\c ++.\} ++.el \{\ ++.sp -1 ++.IP \(bu 2.3 ++.\} ++Display information, in a column\-based format, for ONTAP devices\&. ++.sp ++.if n \{\ ++.RS 4 ++.\} ++.nf ++# nvme netapp ontapdevices \-o column ++.fi ++.if n \{\ ++.RE ++.\} ++.RE ++.SH "NVME" ++.sp ++Part of the nvme\-user suite +diff --git a/Documentation/nvme-netapp-ontapdevices.html b/Documentation/nvme-netapp-ontapdevices.html +new file mode 100644 +index 0000000..06ad9fb +--- /dev/null ++++ b/Documentation/nvme-netapp-ontapdevices.html +@@ -0,0 +1,814 @@ ++ ++ ++ ++ ++ ++ ++nvme-netapp-ontapdevices(1) ++ ++ ++ ++ ++ ++
++
++

SYNOPSIS

++
++
++
nvme netapp ontapdevices [-o <fmt> | --output-format=<fmt>]
++
++
++
++
++
++

DESCRIPTION

++
++

Display information about ONTAP devices on the host. ++The ONTAP devices are identified using the Identify Controller data.

++
++
++
++

OPTIONS

++
++
++
++-o <fmt> ++
++
++--output-format=<fmt> ++
++
++

++ Set the reporting format to normal (default), column, or ++ json. Only one output format can be used at a time. ++

++
++
++
++
++
++

EXAMPLES

++
++
    ++
  • ++

    ++Display information, in a column-based format, for ONTAP devices. ++

    ++
    ++
    ++
    # nvme netapp ontapdevices -o column
    ++
    ++
  • ++
++
++
++
++

NVME

++
++

Part of the nvme-user suite

++
++
++
++

++ ++ ++ +diff --git a/Documentation/nvme-netapp-ontapdevices.txt b/Documentation/nvme-netapp-ontapdevices.txt +new file mode 100644 +index 0000000..09369f1 +--- /dev/null ++++ b/Documentation/nvme-netapp-ontapdevices.txt +@@ -0,0 +1,35 @@ ++nvme-netapp-ontapdevices(1) ++======================== ++ ++NAME ++---- ++nvme-netapp-ontapdevices - Display information about ONTAP devices ++ ++SYNOPSIS ++-------- ++[verse] ++'nvme netapp ontapdevices' [-o | --output-format=] ++ ++DESCRIPTION ++----------- ++Display information about ONTAP devices on the host. The ONTAP devices are ++are identified using the Identify Controller data. ++ ++OPTIONS ++------- ++-o :: ++--output-format=:: ++ Set the reporting format to 'normal' (default), 'column', or ++ 'json'. Only one output format can be used at a time. ++ ++EXAMPLES ++-------- ++* Display information, in a column-based format, for ONTAP devices. +++ ++------------ ++# nvme netapp ontapdevices -o column ++------------ ++ ++NVME ++---- ++Part of the nvme-user suite diff --git a/SOURCES/nvme-cli-fix-cflags-param-patch b/SOURCES/nvme-cli-fix-cflags-param-patch new file mode 100644 index 0000000..7eb11f2 --- /dev/null +++ b/SOURCES/nvme-cli-fix-cflags-param-patch @@ -0,0 +1,34 @@ +commit 254bcd6b23436fd929e18c935322410b541ca121 +Author: Breno Leitao +Date: Mon Jan 21 07:03:24 2019 -0500 + + Fix CFLAGS parameter + + Currently nvme-cli 1.7 is not compiling on Debian because the Debian helper + (compilation toolkit) does pass a CFLAGS variable, thus, avoiding the + initial definition (CFLAGS ?= -O2 -g -Wall -Werror -I.) + + The problem is that -I should not be removed, otherwise the code does not + compile, with the following bug: + + cc -Wdate-time -D_FORTIFY_SOURCE=2 -D_GNU_SOURCE -D__CHECK_ENDIAN__ -g -O2 -fdebug-prefix-map=/home/breno/nvme/nvme-cli-1.7=. -fstack-protector-strong -Wformat -Werror=format-security -std=gnu99 -DLIBUUID -DNVME_VERSION='"1.7"' -o plugins/intel/intel-nvme.o -c plugins/intel/intel-nvme.c + plugins/intel/intel-nvme.c:10:18: fatal error: nvme.h: No such file or directory + compilation terminated. + + This patch just moves the -I parameter to part of the CFLAGS that is not + replaced by dh's CFLAGS. + + Signed-off-by: Breno Leitao + +diff --git a/Makefile b/Makefile +index 525616a..3a4e223 100644 +--- a/Makefile ++++ b/Makefile +@@ -1,5 +1,5 @@ +-CFLAGS ?= -O2 -g -Wall -Werror -I. +-CFLAGS += -std=gnu99 ++CFLAGS ?= -O2 -g -Wall -Werror ++CFLAGS += -std=gnu99 -I. + CPPFLAGS += -D_GNU_SOURCE -D__CHECK_ENDIAN__ + LIBUUID = $(shell $(LD) -o /dev/null -luuid >/dev/null 2>&1; echo $$?) + NVME = nvme diff --git a/SOURCES/nvme-cli-fix-typo-rem-dup-are-patch b/SOURCES/nvme-cli-fix-typo-rem-dup-are-patch new file mode 100644 index 0000000..c147705 --- /dev/null +++ b/SOURCES/nvme-cli-fix-typo-rem-dup-are-patch @@ -0,0 +1,21 @@ +commit 0c2fef91167a8a18b00a295cc6111fd874c8aa22 +Author: Simon Schricker +Date: Thu Apr 11 11:23:16 2019 +0200 + + nvme-cli: fix typo, removing the duplicate 'are' + + Signed-off-by: Simon Schricker + +diff --git a/Documentation/nvme-netapp-ontapdevices.txt b/Documentation/nvme-netapp-ontapdevices.txt +index 8eaa73f..c292758 100644 +--- a/Documentation/nvme-netapp-ontapdevices.txt ++++ b/Documentation/nvme-netapp-ontapdevices.txt +@@ -13,7 +13,7 @@ SYNOPSIS + DESCRIPTION + ----------- + Display information about ONTAP devices on the host. The ONTAP devices are +-are identified using the Identify Controller data. ++identified using the Identify Controller data. + + OPTIONS + ------- diff --git a/SOURCES/nvme-cli-refactor-plugins-file-dir-patch b/SOURCES/nvme-cli-refactor-plugins-file-dir-patch new file mode 100644 index 0000000..605ae4a --- /dev/null +++ b/SOURCES/nvme-cli-refactor-plugins-file-dir-patch @@ -0,0 +1,287 @@ +commit f3921810fe1e28491c62bca1d6d9ca02d99eda3f +Author: Eyal Ben David +Date: Wed Oct 24 18:08:16 2018 +0300 + + Refactor plugins in a file hierarchy + +diff --git a/Makefile b/Makefile +index 433bc41..70541cb 100644 +--- a/Makefile ++++ b/Makefile +@@ -1,4 +1,4 @@ +-CFLAGS ?= -O2 -g -Wall -Werror ++CFLAGS ?= -O2 -g -Wall -Werror -I. + CFLAGS += -std=gnu99 + CPPFLAGS += -D_GNU_SOURCE -D__CHECK_ENDIAN__ + LIBUUID = $(shell $(LD) -o /dev/null -luuid >/dev/null 2>&1; echo $$?) +@@ -32,18 +32,31 @@ override CFLAGS += -DNVME_VERSION='"$(NVME_VERSION)"' + 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 intel-nvme.o \ +- lnvm-nvme.o memblaze-nvme.o wdc-nvme.o wdc-utils.o nvme-models.o \ +- huawei-nvme.o netapp-nvme.o toshiba-nvme.o micron-nvme.o seagate-nvme.o +- +-nvme: nvme.c nvme.h $(OBJS) NVME-VERSION-FILE +- $(CC) $(CPPFLAGS) $(CFLAGS) nvme.c -o $(NVME) $(OBJS) $(LDFLAGS) ++ nvme-lightnvm.o fabrics.o json.o nvme-models.o plugin.o ++ ++PLUGIN_OBJS := \ ++ plugins/intel/intel-nvme.o \ ++ plugins/lnvm/lnvm-nvme.o \ ++ plugins/memblaze/memblaze-nvme.o \ ++ plugins/wdc/wdc-nvme.o \ ++ plugins/wdc/wdc-utils.o \ ++ plugins/huawei/huawei-nvme.o \ ++ plugins/netapp/netapp-nvme.o \ ++ plugins/toshiba/toshiba-nvme.o \ ++ plugins/micron/micron-nvme.o \ ++ plugins/seagate/seagate-nvme.o ++ ++nvme: nvme.c nvme.h $(OBJS) $(PLUGIN_OBJS) NVME-VERSION-FILE ++ $(CC) $(CPPFLAGS) $(CFLAGS) nvme.c -o $(NVME) $(OBJS) $(PLUGIN_OBJS) $(LDFLAGS) ++ ++verify-no-dep: nvme.c nvme.h $(OBJS) NVME-VERSION-FILE ++ $(CC) $(CPPFLAGS) $(CFLAGS) nvme.c -o $@ $(OBJS) $(LDFLAGS) + + nvme.o: nvme.c nvme.h nvme-print.h nvme-ioctl.h argconfig.h suffix.h nvme-lightnvm.h fabrics.h + $(CC) $(CPPFLAGS) $(CFLAGS) -c $< + + %.o: %.c %.h nvme.h linux/nvme_ioctl.h nvme-ioctl.h nvme-print.h argconfig.h +- $(CC) $(CPPFLAGS) $(CFLAGS) -c $< ++ $(CC) $(CPPFLAGS) $(CFLAGS) -o $@ -c $< + + doc: $(NVME) + $(MAKE) -C Documentation +@@ -54,9 +67,10 @@ test: + all: doc + + clean: +- $(RM) $(NVME) *.o *~ a.out NVME-VERSION-FILE *.tar* nvme.spec version control nvme-*.deb ++ $(RM) $(NVME) $(OBJS) $(PLUGIN_OBJS) *~ a.out NVME-VERSION-FILE *.tar* nvme.spec version control nvme-*.deb + $(MAKE) -C Documentation clean + $(RM) tests/*.pyc ++ $(RM) verify-no-dep + + clobber: clean + $(MAKE) -C Documentation clobber +diff --git a/huawei-nvme.c b/plugins/huawei/huawei-nvme.c +similarity index 100% +rename from huawei-nvme.c +rename to plugins/huawei/huawei-nvme.c +diff --git a/huawei-nvme.h b/plugins/huawei/huawei-nvme.h +similarity index 88% +rename from huawei-nvme.h +rename to plugins/huawei/huawei-nvme.h +index 91e8dfb..7aac90c 100644 +--- a/huawei-nvme.h ++++ b/plugins/huawei/huawei-nvme.h +@@ -1,5 +1,5 @@ + #undef CMD_INC_FILE +-#define CMD_INC_FILE huawei-nvme ++#define CMD_INC_FILE plugins/huawei/huawei-nvme + + #if !defined(HUAWEI_NVME) || defined(CMD_HEADER_MULTI_READ) + #define HUAWEI_NVME +diff --git a/intel-nvme.c b/plugins/intel/intel-nvme.c +similarity index 100% +rename from intel-nvme.c +rename to plugins/intel/intel-nvme.c +diff --git a/intel-nvme.h b/plugins/intel/intel-nvme.h +similarity index 94% +rename from intel-nvme.h +rename to plugins/intel/intel-nvme.h +index 5e6af0b..6d70efa 100644 +--- a/intel-nvme.h ++++ b/plugins/intel/intel-nvme.h +@@ -1,5 +1,5 @@ + #undef CMD_INC_FILE +-#define CMD_INC_FILE intel-nvme ++#define CMD_INC_FILE plugins/intel/intel-nvme + + #if !defined(INTEL_NVME) || defined(CMD_HEADER_MULTI_READ) + #define INTEL_NVME +diff --git a/lnvm-nvme.c b/plugins/lnvm/lnvm-nvme.c +similarity index 100% +rename from lnvm-nvme.c +rename to plugins/lnvm/lnvm-nvme.c +diff --git a/lnvm-nvme.h b/plugins/lnvm/lnvm-nvme.h +similarity index 95% +rename from lnvm-nvme.h +rename to plugins/lnvm/lnvm-nvme.h +index 293ec8f..3d5cbc5 100644 +--- a/lnvm-nvme.h ++++ b/plugins/lnvm/lnvm-nvme.h +@@ -1,6 +1,6 @@ + + #undef CMD_INC_FILE +-#define CMD_INC_FILE lnvm-nvme ++#define CMD_INC_FILE plugins/lnvm/lnvm-nvme + + #if !defined(LNVM_NVME) || defined(CMD_HEADER_MULTI_READ) + #define LNVM_NVME +diff --git a/memblaze-nvme.c b/plugins/memblaze/memblaze-nvme.c +similarity index 100% +rename from memblaze-nvme.c +rename to plugins/memblaze/memblaze-nvme.c +diff --git a/memblaze-nvme.h b/plugins/memblaze/memblaze-nvme.h +similarity index 91% +rename from memblaze-nvme.h +rename to plugins/memblaze/memblaze-nvme.h +index 82a0449..528285e 100644 +--- a/memblaze-nvme.h ++++ b/plugins/memblaze/memblaze-nvme.h +@@ -1,5 +1,5 @@ + #undef CMD_INC_FILE +-#define CMD_INC_FILE memblaze-nvme ++#define CMD_INC_FILE plugins/memblaze/memblaze-nvme + + #if !defined(MEMBLAZE_NVME) || defined(CMD_HEADER_MULTI_READ) + #define MEMBLAZE_NVME +diff --git a/micron-nvme.c b/plugins/micron/micron-nvme.c +similarity index 100% +rename from micron-nvme.c +rename to plugins/micron/micron-nvme.c +diff --git a/micron-nvme.h b/plugins/micron/micron-nvme.h +similarity index 86% +rename from micron-nvme.h +rename to plugins/micron/micron-nvme.h +index 4054933..43e720c 100644 +--- a/micron-nvme.h ++++ b/plugins/micron/micron-nvme.h +@@ -1,5 +1,5 @@ + #undef CMD_INC_FILE +-#define CMD_INC_FILE micron-nvme ++#define CMD_INC_FILE plugins/micron/micron-nvme + + #if !defined(MICRON_NVME) || defined(CMD_HEADER_MULTI_READ) + #define MICRON_NVME +diff --git a/netapp-nvme.c b/plugins/netapp/netapp-nvme.c +similarity index 100% +rename from netapp-nvme.c +rename to plugins/netapp/netapp-nvme.c +diff --git a/netapp-nvme.h b/plugins/netapp/netapp-nvme.h +similarity index 85% +rename from netapp-nvme.h +rename to plugins/netapp/netapp-nvme.h +index 6e3324c..3dd019e 100644 +--- a/netapp-nvme.h ++++ b/plugins/netapp/netapp-nvme.h +@@ -1,5 +1,5 @@ + #undef CMD_INC_FILE +-#define CMD_INC_FILE netapp-nvme ++#define CMD_INC_FILE plugins/netapp/netapp-nvme + + #if !defined(NETAPP_NVME) || defined(CMD_HEADER_MULTI_READ) + #define NETAPP_NVME +diff --git a/seagate-diag.h b/plugins/seagate/seagate-diag.h +old mode 100755 +new mode 100644 +similarity index 100% +rename from seagate-diag.h +rename to plugins/seagate/seagate-diag.h +diff --git a/seagate-nvme.c b/plugins/seagate/seagate-nvme.c +old mode 100755 +new mode 100644 +similarity index 100% +rename from seagate-nvme.c +rename to plugins/seagate/seagate-nvme.c +diff --git a/seagate-nvme.h b/plugins/seagate/seagate-nvme.h +old mode 100755 +new mode 100644 +similarity index 63% +rename from seagate-nvme.h +rename to plugins/seagate/seagate-nvme.h +index bcf19d3..2a00e77 +--- a/seagate-nvme.h ++++ b/plugins/seagate/seagate-nvme.h +@@ -4,7 +4,7 @@ + // Copyright (c) 2017-2018 Seagate Technology LLC and/or its Affiliates, All Rights Reserved + // + // ****************************************************************************************** +-// ++// + // This program is free software; you can redistribute it and/or + // modify it under the terms of the GNU General Public License + // as published by the Free Software Foundation; either version 2 +@@ -17,9 +17,9 @@ + // + // \file seagate-nvme.h + // \brief This file defines the functions and macros to make building a nvme-cli seagate plug-in. +- ++ + #undef CMD_INC_FILE +-#define CMD_INC_FILE seagate-nvme ++#define CMD_INC_FILE plugins/seagate/seagate-nvme + + #if !defined(SEAGATE_NVME) || defined(CMD_HEADER_MULTI_READ) + #define SEAGATE_NVME +@@ -28,15 +28,15 @@ + + PLUGIN(NAME("seagate", "Seagate vendor specific extensions"), + COMMAND_LIST( +- ENTRY("vs-temperature-stats", "Retrieve Seagate temperature statistics ", temp_stats) +- ENTRY("vs-log-page-sup", "Retrieve Seagate Supported Log-pages Information ", log_pages_supp) +- ENTRY("vs-smart-add-log", "Retrieve Seagate extended-SMART Information ", vs_smart_log) +- ENTRY("vs-pcie-stats", "Retrieve Seagate PCIe error statistics ", vs_pcie_error_log) +- ENTRY("clear-pcie-correctable-errors", "Clear Seagate PCIe error statistics ", vs_clr_pcie_correctable_errs) +- ENTRY("get-host-tele", "Retrieve Seagate Host-Initiated Telemetry ", get_host_tele) +- ENTRY("get-ctrl-tele", "Retrieve Seagate Controller-Initiated Telemetry ", get_ctrl_tele) +- ENTRY("vs-internal-log", "Retrieve Seagate Controller-Initiated Telemetry in binary format", vs_internal_log) +- ENTRY("plugin-version", "Shows Seagate plugin's version information ", seagate_plugin_version) ++ ENTRY("vs-temperature-stats", "Retrieve Seagate temperature statistics ", temp_stats) ++ ENTRY("vs-log-page-sup", "Retrieve Seagate Supported Log-pages Information ", log_pages_supp) ++ ENTRY("vs-smart-add-log", "Retrieve Seagate extended-SMART Information ", vs_smart_log) ++ ENTRY("vs-pcie-stats", "Retrieve Seagate PCIe error statistics ", vs_pcie_error_log) ++ ENTRY("clear-pcie-correctable-errors", "Clear Seagate PCIe error statistics ", vs_clr_pcie_correctable_errs) ++ ENTRY("get-host-tele", "Retrieve Seagate Host-Initiated Telemetry ", get_host_tele) ++ ENTRY("get-ctrl-tele", "Retrieve Seagate Controller-Initiated Telemetry ", get_ctrl_tele) ++ ENTRY("vs-internal-log", "Retrieve Seagate Controller-Initiated Telemetry in binary format", vs_internal_log) ++ ENTRY("plugin-version", "Shows Seagate plugin's version information ", seagate_plugin_version) + ) + ); + +diff --git a/toshiba-nvme.c b/plugins/toshiba/toshiba-nvme.c +similarity index 100% +rename from toshiba-nvme.c +rename to plugins/toshiba/toshiba-nvme.c +diff --git a/toshiba-nvme.h b/plugins/toshiba/toshiba-nvme.h +similarity index 90% +rename from toshiba-nvme.h +rename to plugins/toshiba/toshiba-nvme.h +index cecbbf3..c405e78 100644 +--- a/toshiba-nvme.h ++++ b/plugins/toshiba/toshiba-nvme.h +@@ -1,5 +1,5 @@ + #undef CMD_INC_FILE +-#define CMD_INC_FILE toshiba-nvme ++#define CMD_INC_FILE plugins/toshiba/toshiba-nvme + + #if !defined(TOSHIBA_NVME) || defined(CMD_HEADER_MULTI_READ) + #define TOSHIBA_NVME +diff --git a/wdc-nvme.c b/plugins/wdc/wdc-nvme.c +similarity index 100% +rename from wdc-nvme.c +rename to plugins/wdc/wdc-nvme.c +diff --git a/wdc-nvme.h b/plugins/wdc/wdc-nvme.h +similarity index 95% +rename from wdc-nvme.h +rename to plugins/wdc/wdc-nvme.h +index 3732005..c2d892b 100644 +--- a/wdc-nvme.h ++++ b/plugins/wdc/wdc-nvme.h +@@ -1,5 +1,5 @@ + #undef CMD_INC_FILE +-#define CMD_INC_FILE wdc-nvme ++#define CMD_INC_FILE plugins/wdc/wdc-nvme + + #if !defined(WDC_NVME) || defined(CMD_HEADER_MULTI_READ) + #define WDC_NVME +diff --git a/wdc-utils.c b/plugins/wdc/wdc-utils.c +similarity index 100% +rename from wdc-utils.c +rename to plugins/wdc/wdc-utils.c +diff --git a/wdc-utils.h b/plugins/wdc/wdc-utils.h +similarity index 100% +rename from wdc-utils.h +rename to plugins/wdc/wdc-utils.h diff --git a/SPECS/nvme-cli.spec b/SPECS/nvme-cli.spec index b782f3e..c6b7aa6 100644 --- a/SPECS/nvme-cli.spec +++ b/SPECS/nvme-cli.spec @@ -3,7 +3,7 @@ Name: nvme-cli Version: 1.6 -Release: 2%{?dist} +Release: 4%{?dist} Summary: NVMe management command line interface License: GPLv2+ @@ -11,6 +11,12 @@ URL: https://github.com/linux-nvme/nvme-cli #Source0: https://github.com/linux-nvme/%{name}/archive/%{commit0}.tar.gz Source0: https://github.com/linux-nvme/%{name}/archive/v%{version}.tar.gz +Patch0: nvme-cli-refactor-plugins-file-dir-patch +Patch1: nvme-cli-add-netapp-ontapdev-command-patch +Patch2: nvme-cli-add-netapp-ontapdev-man-page-patch +Patch3: nvme-cli-fix-typo-rem-dup-are-patch +Patch4: nvme-cli-fix-cflags-param-patch + BuildRequires: libuuid-devel BuildRequires: gcc @@ -20,10 +26,15 @@ nvme-cli provides NVM-Express user space tooling for Linux. %prep #%setup -qn %{name}-%{commit0} %setup +%patch0 -p1 +%patch1 -p1 +%patch2 -p1 +%patch3 -p1 +%patch4 -p1 %build -make PREFIX=/usr CFLAGS="%{optflags} -std=c99" LDFLAGS="%{__global_ldflags}" %{?_smp_mflags} +make PREFIX=/usr CFLAGS="%{optflags} -std=c99 -I." LDFLAGS="%{__global_ldflags}" %{?_smp_mflags} %install