diff options
author | Hans Rosenfeld <hans.rosenfeld@joyent.com> | 2017-07-20 17:45:45 +0200 |
---|---|---|
committer | Hans Rosenfeld <hans.rosenfeld@joyent.com> | 2017-09-12 16:59:24 +0200 |
commit | c6e58d8c85cf3e5d0db157501b40276eb59edf16 (patch) | |
tree | 16e9581822a437b60f84d6f8da60a57f8a3159cf | |
parent | faeab80b5dcf1bc503f1f02494131eb0e6da46c3 (diff) | |
download | illumos-gate-c6e58d8c85cf3e5d0db157501b40276eb59edf16.tar.gz |
8479 nvmeadm doesn't handle namespaces with EUI64
Reviewed by: Patrick Mooney <patrick.mooney@joyent.com>
Reviewed by: Jerry Jelinek <jerry.jelinek@joyent.com>
Reviewed by: Yuri Pankov <yuripv@gmx.com>
Reviewed by: Toomas Soome <tsoome@me.com>
Approved by: Richard Lowe <richlowe@richlowe.net>
-rw-r--r-- | usr/src/cmd/nvmeadm/nvmeadm.c | 61 |
1 files changed, 25 insertions, 36 deletions
diff --git a/usr/src/cmd/nvmeadm/nvmeadm.c b/usr/src/cmd/nvmeadm/nvmeadm.c index 13cace3ead..d7dffc1d47 100644 --- a/usr/src/cmd/nvmeadm/nvmeadm.c +++ b/usr/src/cmd/nvmeadm/nvmeadm.c @@ -11,6 +11,7 @@ /* * Copyright 2016 Nexenta Systems, Inc. + * Copyright 2017 Joyent, Inc. */ /* @@ -54,7 +55,8 @@ struct nvme_process_arg { int npa_argc; char **npa_argv; char *npa_name; - uint32_t npa_nsid; + char *npa_nsid; + int npa_found; boolean_t npa_isns; const nvmeadm_cmd_t *npa_cmd; di_node_t npa_node; @@ -121,7 +123,6 @@ static void usage_attach_detach(const char *); int verbose; int debug; -int found; static int exitcode; static const nvmeadm_cmd_t nvmeadm_cmds[] = { @@ -313,21 +314,8 @@ main(int argc, char **argv) if (npa.npa_name != NULL) { tmp = strchr(npa.npa_name, '/'); if (tmp != NULL) { - unsigned long nsid; *tmp++ = '\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_nsid = nsid; + npa.npa_nsid = tmp; npa.npa_isns = B_TRUE; } } @@ -337,18 +325,18 @@ main(int argc, char **argv) nvme_walk(&npa, node); di_fini(node); - if (found == 0) { + if (npa.npa_found == 0) { if (npa.npa_name != NULL) { - warnx("%s%.*s%.*d: no such controller or " + warnx("%s%.*s%.*s: no such controller or " "namespace", npa.npa_name, - npa.npa_nsid > 0 ? -1 : 0, "/", - npa.npa_nsid > 0 ? -1 : 0, npa.npa_nsid); + npa.npa_isns ? -1 : 0, "/", + npa.npa_isns ? -1 : 0, npa.npa_nsid); } else { warnx("no controllers found"); } exitcode--; } - found = 0; + npa.npa_found = 0; npa.npa_name = strtok_r(NULL, ",", &lasts); } while (npa.npa_name != NULL); @@ -388,7 +376,7 @@ static boolean_t nvme_match(nvme_process_arg_t *npa) { char *name; - uint32_t nsid = 0; + char *nsid = NULL; if (npa->npa_name == NULL) return (B_TRUE); @@ -405,13 +393,14 @@ nvme_match(nvme_process_arg_t *npa) free(name); if (npa->npa_isns) { - if (npa->npa_nsid == 0) + if (npa->npa_nsid == NULL) return (B_TRUE); - nsid = strtoul(di_minor_name(npa->npa_minor), NULL, 10); - } - if (npa->npa_isns && npa->npa_nsid != nsid) - return (B_FALSE); + nsid = di_minor_name(npa->npa_minor); + + if (nsid == NULL || strcmp(npa->npa_nsid, nsid) != 0) + return (B_FALSE); + } return (B_TRUE); } @@ -475,7 +464,7 @@ nvme_process(di_node_t node, di_minor_t minor, void *arg) if ((fd = nvme_open(minor)) < 0) return (DI_WALK_CONTINUE); - found++; + npa->npa_found++; npa->npa_path = di_devfs_path(node); if (npa->npa_path == NULL) @@ -589,7 +578,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_isns) { nvme_capabilities_t *cap; cap = nvme_capabilities(fd); @@ -627,7 +616,7 @@ do_get_logpage_error(int fd, const nvme_process_arg_t *npa) size_t bufsize = sizeof (nvme_error_log_entry_t) * nlog; nvme_error_log_entry_t *elog; - if (npa->npa_nsid != 0) + if (npa->npa_isns) errx(-1, "Error Log not available on a per-namespace basis"); elog = nvme_get_logpage(fd, NVME_LOGPAGE_ERROR, &bufsize); @@ -651,7 +640,7 @@ do_get_logpage_health(int fd, const nvme_process_arg_t *npa) size_t bufsize = sizeof (nvme_health_log_t); nvme_health_log_t *hlog; - if (npa->npa_nsid != 0) { + if (npa->npa_isns) { if (npa->npa_idctl->id_lpa.lp_smart == 0) errx(-1, "SMART/Health information not available " "on a per-namespace basis on this controller"); @@ -676,7 +665,7 @@ do_get_logpage_fwslot(int fd, const nvme_process_arg_t *npa) size_t bufsize = sizeof (nvme_fwslot_log_t); nvme_fwslot_log_t *fwlog; - if (npa->npa_nsid != 0) + if (npa->npa_isns) errx(-1, "Firmware Slot information not available on a " "per-namespace basis"); @@ -805,9 +794,9 @@ do_get_features(int fd, const nvme_process_arg_t *npa) 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_isns && (feat->f_getflags & NVMEADM_NS) == 0) || - (npa->npa_nsid == 0 && + (!npa->npa_isns && (feat->f_getflags & NVMEADM_CTRL) == 0)) continue; @@ -841,9 +830,9 @@ do_get_features(int fd, const nvme_process_arg_t *npa) continue; } - if ((npa->npa_nsid != 0 && + if ((npa->npa_isns && (feat->f_getflags & NVMEADM_NS) == 0) || - (npa->npa_nsid == 0 && + (!npa->npa_isns && (feat->f_getflags & NVMEADM_CTRL) == 0)) { warnx("feature %s %s supported for namespaces", feat->f_name, (feat->f_getflags & NVMEADM_NS) != 0 ? |