diff -r b2645bd381e1 -r 401cc01a1d39 usr/src/cmd/nvmeadm/nvmeadm.c --- a/usr/src/cmd/nvmeadm/nvmeadm.c Wed Jun 14 07:19:18 2017 -0700 +++ b/usr/src/cmd/nvmeadm/nvmeadm.c Tue Jul 11 23:15:55 2017 -0700 @@ -55,6 +55,8 @@ struct nvme_process_arg { char **npa_argv; char *npa_name; uint32_t npa_nsid; + char npa_eui64[17]; + boolean_t npa_eui_set; boolean_t npa_isns; const nvmeadm_cmd_t *npa_cmd; di_node_t npa_node; @@ -315,17 +317,24 @@ main(int argc, char **argv) if (tmp != NULL) { unsigned long nsid; *tmp++ = '\0'; + nsid = 0; errno = 0; - nsid = strtoul(tmp, NULL, 10); - if (nsid >= UINT32_MAX || errno != 0) { - warn("invalid namespace %s", tmp); - exitcode--; - continue; - } - if (nsid == 0) { - warnx("invalid namespace %s", tmp); - exitcode--; - continue; + npa.npa_eui_set = B_FALSE; + if (strlen(tmp) == 16) { + (void) strlcpy(npa.npa_eui64, tmp, sizeof(npa.npa_eui64)); + npa.npa_eui_set = B_TRUE; + } else { + nsid = strtoul(tmp, NULL, 10); + if (nsid >= UINT32_MAX || errno != 0) { + warn("invalid namespace %s", tmp); + exitcode--; + continue; + } + if (nsid == 0) { + warnx("invalid namespace %s", tmp); + exitcode--; + continue; + } } npa.npa_nsid = nsid; npa.npa_isns = B_TRUE; @@ -405,14 +414,22 @@ nvme_match(nvme_process_arg_t *npa) free(name); if (npa->npa_isns) { - if (npa->npa_nsid == 0) + if (npa->npa_nsid == 0 && !npa->npa_eui_set) return (B_TRUE); - nsid = strtoul(di_minor_name(npa->npa_minor), NULL, 10); + + if (npa->npa_eui_set) { + if (strcasestr(di_minor_name(npa->npa_minor), + npa->npa_eui64) == NULL) { + return (B_FALSE); + } + } else { + nsid = strtoul(di_minor_name(npa->npa_minor), NULL, 10); + if (npa->npa_nsid != nsid) { + return (B_FALSE); + } + } } - if (npa->npa_isns && npa->npa_nsid != nsid) - return (B_FALSE); - return (B_TRUE); } @@ -589,7 +606,7 @@ usage_identify(const char *c_name) static int do_identify(int fd, const nvme_process_arg_t *npa) { - if (npa->npa_nsid == 0) { + if (npa->npa_nsid == 0 && !npa->npa_eui_set) { nvme_capabilities_t *cap; cap = nvme_capabilities(fd); @@ -805,9 +822,9 @@ do_get_features(int fd, const nvme_proce if (npa->npa_argc == 0) { (void) printf("%s: Get Features\n", npa->npa_name); for (feat = &features[0]; feat->f_feature != 0; feat++) { - if ((npa->npa_nsid != 0 && + if (((npa->npa_nsid != 0 || npa->npa_eui_set) && (feat->f_getflags & NVMEADM_NS) == 0) || - (npa->npa_nsid == 0 && + ((npa->npa_nsid == 0 && !npa->npa_eui_set) && (feat->f_getflags & NVMEADM_CTRL) == 0)) continue; @@ -841,9 +858,9 @@ do_get_features(int fd, const nvme_proce continue; } - if ((npa->npa_nsid != 0 && + if (((npa->npa_nsid != 0 || npa->npa_eui_set) && (feat->f_getflags & NVMEADM_NS) == 0) || - (npa->npa_nsid == 0 && + ((npa->npa_nsid == 0 && !npa->npa_eui_set) && (feat->f_getflags & NVMEADM_CTRL) == 0)) { warnx("feature %s %s supported for namespaces", feat->f_name, (feat->f_getflags & NVMEADM_NS) != 0 ?