Print this page
8479 nvmeadm doesn't handle namespaces with EUI64
Reviewed by: Patrick Mooney <patrick.mooney@joyent.com>
Reviewed by: Jerry Jelinek <jerry.jelinek@joyent.com>
*** 52,62 ****
struct nvme_process_arg {
int npa_argc;
char **npa_argv;
char *npa_name;
! uint32_t npa_nsid;
boolean_t npa_isns;
const nvmeadm_cmd_t *npa_cmd;
di_node_t npa_node;
di_minor_t npa_minor;
char *npa_path;
--- 52,63 ----
struct nvme_process_arg {
int npa_argc;
char **npa_argv;
char *npa_name;
! char *npa_nsid;
! int npa_found;
boolean_t npa_isns;
const nvmeadm_cmd_t *npa_cmd;
di_node_t npa_node;
di_minor_t npa_minor;
char *npa_path;
*** 119,129 ****
static void usage_secure_erase(const char *);
static void usage_attach_detach(const char *);
int verbose;
int debug;
- int found;
static int exitcode;
static const nvmeadm_cmd_t nvmeadm_cmds[] = {
{
"list",
--- 120,129 ----
*** 311,356 ****
npa.npa_name = strtok_r(argv[optind], ",", &lasts);
do {
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_isns = B_TRUE;
}
}
if ((node = di_init("/", DINFOSUBTREE | DINFOMINOR)) == NULL)
err(-1, "failed to initialize libdevinfo");
nvme_walk(&npa, node);
di_fini(node);
! if (found == 0) {
if (npa.npa_name != NULL) {
! warnx("%s%.*s%.*d: no such controller or "
"namespace", npa.npa_name,
! npa.npa_nsid > 0 ? -1 : 0, "/",
! npa.npa_nsid > 0 ? -1 : 0, npa.npa_nsid);
} else {
warnx("no controllers found");
}
exitcode--;
}
! found = 0;
npa.npa_name = strtok_r(NULL, ",", &lasts);
} while (npa.npa_name != NULL);
exit(exitcode);
}
--- 311,343 ----
npa.npa_name = strtok_r(argv[optind], ",", &lasts);
do {
if (npa.npa_name != NULL) {
tmp = strchr(npa.npa_name, '/');
if (tmp != NULL) {
*tmp++ = '\0';
! npa.npa_nsid = tmp;
npa.npa_isns = B_TRUE;
}
}
if ((node = di_init("/", DINFOSUBTREE | DINFOMINOR)) == NULL)
err(-1, "failed to initialize libdevinfo");
nvme_walk(&npa, node);
di_fini(node);
! if (npa.npa_found == 0) {
if (npa.npa_name != NULL) {
! warnx("%s%.*s%.*s: no such controller or "
"namespace", npa.npa_name,
! npa.npa_isns ? -1 : 0, "/",
! npa.npa_isns ? -1 : 0, npa.npa_nsid);
} else {
warnx("no controllers found");
}
exitcode--;
}
! npa.npa_found = 0;
npa.npa_name = strtok_r(NULL, ",", &lasts);
} while (npa.npa_name != NULL);
exit(exitcode);
}
*** 386,396 ****
static boolean_t
nvme_match(nvme_process_arg_t *npa)
{
char *name;
! uint32_t nsid = 0;
if (npa->npa_name == NULL)
return (B_TRUE);
if (asprintf(&name, "%s%d", di_driver_name(npa->npa_node),
--- 373,383 ----
static boolean_t
nvme_match(nvme_process_arg_t *npa)
{
char *name;
! char *nsid = NULL;
if (npa->npa_name == NULL)
return (B_TRUE);
if (asprintf(&name, "%s%d", di_driver_name(npa->npa_node),
*** 403,419 ****
}
free(name);
if (npa->npa_isns) {
! if (npa->npa_nsid == 0)
return (B_TRUE);
- nsid = strtoul(di_minor_name(npa->npa_minor), NULL, 10);
- }
! if (npa->npa_isns && npa->npa_nsid != nsid)
return (B_FALSE);
return (B_TRUE);
}
char *
--- 390,407 ----
}
free(name);
if (npa->npa_isns) {
! if (npa->npa_nsid == NULL)
return (B_TRUE);
! nsid = di_minor_name(npa->npa_minor);
!
! if (nsid == NULL || strcmp(npa->npa_nsid, nsid) != 0)
return (B_FALSE);
+ }
return (B_TRUE);
}
char *
*** 473,483 ****
return (DI_WALK_CONTINUE);
if ((fd = nvme_open(minor)) < 0)
return (DI_WALK_CONTINUE);
! found++;
npa->npa_path = di_devfs_path(node);
if (npa->npa_path == NULL)
goto out;
--- 461,471 ----
return (DI_WALK_CONTINUE);
if ((fd = nvme_open(minor)) < 0)
return (DI_WALK_CONTINUE);
! npa->npa_found++;
npa->npa_path = di_devfs_path(node);
if (npa->npa_path == NULL)
goto out;
*** 587,597 ****
}
static int
do_identify(int fd, const nvme_process_arg_t *npa)
{
! if (npa->npa_nsid == 0) {
nvme_capabilities_t *cap;
cap = nvme_capabilities(fd);
if (cap == NULL)
return (-1);
--- 575,585 ----
}
static int
do_identify(int fd, const nvme_process_arg_t *npa)
{
! if (!npa->npa_isns) {
nvme_capabilities_t *cap;
cap = nvme_capabilities(fd);
if (cap == NULL)
return (-1);
*** 625,635 ****
{
int nlog = npa->npa_idctl->id_elpe + 1;
size_t bufsize = sizeof (nvme_error_log_entry_t) * nlog;
nvme_error_log_entry_t *elog;
! if (npa->npa_nsid != 0)
errx(-1, "Error Log not available on a per-namespace basis");
elog = nvme_get_logpage(fd, NVME_LOGPAGE_ERROR, &bufsize);
if (elog == NULL)
--- 613,623 ----
{
int nlog = npa->npa_idctl->id_elpe + 1;
size_t bufsize = sizeof (nvme_error_log_entry_t) * nlog;
nvme_error_log_entry_t *elog;
! if (npa->npa_isns)
errx(-1, "Error Log not available on a per-namespace basis");
elog = nvme_get_logpage(fd, NVME_LOGPAGE_ERROR, &bufsize);
if (elog == NULL)
*** 649,659 ****
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_idctl->id_lpa.lp_smart == 0)
errx(-1, "SMART/Health information not available "
"on a per-namespace basis on this controller");
}
--- 637,647 ----
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_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");
}
*** 674,684 ****
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)
errx(-1, "Firmware Slot information not available on a "
"per-namespace basis");
fwlog = nvme_get_logpage(fd, NVME_LOGPAGE_FWSLOT, &bufsize);
--- 662,672 ----
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_isns)
errx(-1, "Firmware Slot information not available on a "
"per-namespace basis");
fwlog = nvme_get_logpage(fd, NVME_LOGPAGE_FWSLOT, &bufsize);
*** 803,815 ****
* No feature list given, print all supported features.
*/
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 &&
(feat->f_getflags & NVMEADM_NS) == 0) ||
! (npa->npa_nsid == 0 &&
(feat->f_getflags & NVMEADM_CTRL) == 0))
continue;
(void) feat->f_get(fd, feat, npa->npa_idctl);
}
--- 791,803 ----
* No feature list given, print all supported features.
*/
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_isns &&
(feat->f_getflags & NVMEADM_NS) == 0) ||
! (!npa->npa_isns &&
(feat->f_getflags & NVMEADM_CTRL) == 0))
continue;
(void) feat->f_get(fd, feat, npa->npa_idctl);
}
*** 839,851 ****
if (feat->f_feature == 0) {
warnx("unknown feature %s", f);
continue;
}
! if ((npa->npa_nsid != 0 &&
(feat->f_getflags & NVMEADM_NS) == 0) ||
! (npa->npa_nsid == 0 &&
(feat->f_getflags & NVMEADM_CTRL) == 0)) {
warnx("feature %s %s supported for namespaces",
feat->f_name, (feat->f_getflags & NVMEADM_NS) != 0 ?
"only" : "not");
continue;
--- 827,839 ----
if (feat->f_feature == 0) {
warnx("unknown feature %s", f);
continue;
}
! if ((npa->npa_isns &&
(feat->f_getflags & NVMEADM_NS) == 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 ?
"only" : "not");
continue;