Incorporate feedback from bde@ based on r252672 changes:
* Use 0/1 instead of sysexits. Man pages are confusing on this topic, but 0/1 is sufficient for nvmecontrol. * Use err function family where possible instead of fprintf/exit. * Fix some typing errors. * Clean up some error message inconsistencies. Sponsored by: Intel Submitted by: bde (parts of firmware.c changes) MFC after: 3 days
This commit is contained in:
parent
ec526ea90b
commit
821ef73ca6
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=253109
@ -29,13 +29,12 @@ __FBSDID("$FreeBSD$");
|
||||
|
||||
#include <sys/param.h>
|
||||
|
||||
#include <errno.h>
|
||||
#include <err.h>
|
||||
#include <fcntl.h>
|
||||
#include <stddef.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <sysexits.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include "nvmecontrol.h"
|
||||
@ -45,7 +44,7 @@ devlist_usage(void)
|
||||
{
|
||||
fprintf(stderr, "usage:\n");
|
||||
fprintf(stderr, DEVLIST_USAGE);
|
||||
exit(EX_USAGE);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
static inline uint32_t
|
||||
@ -62,9 +61,7 @@ devlist(int argc, char *argv[])
|
||||
struct nvme_namespace_data nsdata;
|
||||
char name[64];
|
||||
uint32_t i;
|
||||
int ch, ctrlr, exit_code, fd, found;
|
||||
|
||||
exit_code = EX_OK;
|
||||
int ch, ctrlr, fd, found, ret;
|
||||
|
||||
while ((ch = getopt(argc, argv, "")) != -1) {
|
||||
switch ((char)ch) {
|
||||
@ -80,14 +77,14 @@ devlist(int argc, char *argv[])
|
||||
ctrlr++;
|
||||
sprintf(name, "%s%d", NVME_CTRLR_PREFIX, ctrlr);
|
||||
|
||||
exit_code = open_dev(name, &fd, 0, 0);
|
||||
ret = open_dev(name, &fd, 0, 0);
|
||||
|
||||
if (exit_code == EX_NOINPUT)
|
||||
break;
|
||||
else if (exit_code == EX_NOPERM) {
|
||||
printf("Could not open /dev/%s, errno = %d (%s)\n",
|
||||
name, errno, strerror(errno));
|
||||
if (ret != 0) {
|
||||
if (fd < 0) {
|
||||
warnx("could not open /dev/%s\n", name);
|
||||
continue;
|
||||
} else
|
||||
break;
|
||||
}
|
||||
|
||||
found++;
|
||||
@ -111,5 +108,5 @@ devlist(int argc, char *argv[])
|
||||
if (found == 0)
|
||||
printf("No NVMe controllers found.\n");
|
||||
|
||||
exit(EX_OK);
|
||||
exit(1);
|
||||
}
|
||||
|
@ -36,14 +36,14 @@ __FBSDID("$FreeBSD$");
|
||||
#include <sys/types.h>
|
||||
|
||||
#include <ctype.h>
|
||||
#include <errno.h>
|
||||
#include <err.h>
|
||||
#include <fcntl.h>
|
||||
#include <inttypes.h>
|
||||
#include <stdbool.h>
|
||||
#include <stddef.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <sysexits.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include "nvmecontrol.h"
|
||||
@ -64,60 +64,58 @@ slot_has_valid_firmware(int fd, int slot)
|
||||
}
|
||||
|
||||
static void
|
||||
read_image_file(char *path, void **buf, ssize_t *size)
|
||||
read_image_file(char *path, void **buf, int32_t *size)
|
||||
{
|
||||
struct stat sb;
|
||||
int32_t filesize;
|
||||
int fd;
|
||||
|
||||
*size = 0;
|
||||
*buf = NULL;
|
||||
|
||||
if ((fd = open(path, O_RDONLY)) < 0) {
|
||||
fprintf(stderr, "Unable to open '%s'.\n", path);
|
||||
exit(EX_IOERR);
|
||||
}
|
||||
if (fstat(fd, &sb) < 0) {
|
||||
fprintf(stderr, "Unable to stat '%s'.\n", path);
|
||||
close(fd);
|
||||
exit(EX_IOERR);
|
||||
}
|
||||
if ((*buf = malloc(sb.st_size)) == NULL) {
|
||||
fprintf(stderr, "Unable to malloc %jd bytes.\n",
|
||||
sb.st_size);
|
||||
close(fd);
|
||||
exit(EX_IOERR);
|
||||
}
|
||||
if ((*size = read(fd, *buf, sb.st_size)) < 0) {
|
||||
fprintf(stderr, "Error reading '%s', errno=%d (%s)\n",
|
||||
path, errno, strerror(errno));
|
||||
close(fd);
|
||||
exit(EX_IOERR);
|
||||
}
|
||||
if (*size != sb.st_size) {
|
||||
fprintf(stderr, "Error reading '%s', "
|
||||
"read %zd bytes, requested %jd bytes\n",
|
||||
path, *size, sb.st_size);
|
||||
close(fd);
|
||||
exit(EX_IOERR);
|
||||
}
|
||||
if ((fd = open(path, O_RDONLY)) < 0)
|
||||
err(1, "unable to open '%s'", path);
|
||||
if (fstat(fd, &sb) < 0)
|
||||
err(1, "unable to stat '%s'", path);
|
||||
|
||||
/*
|
||||
* The NVMe spec does not explicitly state a maximum firmware image
|
||||
* size, although one can be inferred from the dword size limitation
|
||||
* for the size and offset fields in the Firmware Image Download
|
||||
* command.
|
||||
*
|
||||
* Technically, the max is UINT32_MAX * sizeof(uint32_t), since the
|
||||
* size and offsets are specified in terms of dwords (not bytes), but
|
||||
* realistically INT32_MAX is sufficient here and simplifies matters
|
||||
* a bit.
|
||||
*/
|
||||
if (sb.st_size > INT32_MAX)
|
||||
errx(1, "size of file '%s' is too large (%jd bytes)",
|
||||
path, (intmax_t)sb.st_size);
|
||||
filesize = (int32_t)sb.st_size;
|
||||
if ((*buf = malloc(filesize)) == NULL)
|
||||
errx(1, "unable to malloc %zd bytes", filesize);
|
||||
if ((*size = read(fd, *buf, filesize)) < 0)
|
||||
err(1, "error reading '%s'", path);
|
||||
/* XXX assuming no short reads */
|
||||
if (*size != filesize)
|
||||
errx(1,
|
||||
"error reading '%s' (read %d bytes, requested %d bytes)",
|
||||
path, *size, filesize);
|
||||
}
|
||||
|
||||
static void
|
||||
update_firmware(int fd, uint8_t *payload, uint32_t payload_size)
|
||||
update_firmware(int fd, uint8_t *payload, int32_t payload_size)
|
||||
{
|
||||
struct nvme_pt_command pt;
|
||||
size_t size;
|
||||
int32_t off, resid, size;
|
||||
void *chunk;
|
||||
uint32_t off, resid;
|
||||
int exit_code = EX_OK;
|
||||
|
||||
off = 0;
|
||||
resid = payload_size;
|
||||
|
||||
if ((chunk = malloc((size_t)NVME_MAX_XFER_SIZE)) == NULL) {
|
||||
printf("Unable to malloc %d bytes.\n", NVME_MAX_XFER_SIZE);
|
||||
exit(EX_IOERR);
|
||||
}
|
||||
if ((chunk = malloc(NVME_MAX_XFER_SIZE)) == NULL)
|
||||
errx(1, "unable to malloc %d bytes", NVME_MAX_XFER_SIZE);
|
||||
|
||||
while (resid > 0) {
|
||||
size = (resid >= NVME_MAX_XFER_SIZE) ?
|
||||
@ -132,26 +130,15 @@ update_firmware(int fd, uint8_t *payload, uint32_t payload_size)
|
||||
pt.len = size;
|
||||
pt.is_read = 0;
|
||||
|
||||
if (ioctl(fd, NVME_PASSTHROUGH_CMD, &pt) < 0) {
|
||||
printf("Firmware image download request failed. "
|
||||
"errno=%d (%s)\n",
|
||||
errno, strerror(errno));
|
||||
exit_code = EX_IOERR;
|
||||
break;
|
||||
}
|
||||
if (ioctl(fd, NVME_PASSTHROUGH_CMD, &pt) < 0)
|
||||
err(1, "firmware download request failed");
|
||||
|
||||
if (nvme_completion_is_error(&pt.cpl)) {
|
||||
printf("Passthrough command returned error.\n");
|
||||
exit_code = EX_IOERR;
|
||||
break;
|
||||
}
|
||||
if (nvme_completion_is_error(&pt.cpl))
|
||||
errx(1, "firmware download request returned error");
|
||||
|
||||
resid -= size;
|
||||
off += size;
|
||||
}
|
||||
|
||||
if (exit_code != EX_OK)
|
||||
exit(exit_code);
|
||||
}
|
||||
|
||||
static void
|
||||
@ -164,16 +151,11 @@ activate_firmware(int fd, int slot, int activate_action)
|
||||
pt.cmd.cdw10 = (activate_action << 3) | slot;
|
||||
pt.is_read = 0;
|
||||
|
||||
if (ioctl(fd, NVME_PASSTHROUGH_CMD, &pt) < 0) {
|
||||
printf("Firmware activate request failed. errno=%d (%s)\n",
|
||||
errno, strerror(errno));
|
||||
exit(EX_IOERR);
|
||||
}
|
||||
if (ioctl(fd, NVME_PASSTHROUGH_CMD, &pt) < 0)
|
||||
err(1, "firmware activate request failed");
|
||||
|
||||
if (nvme_completion_is_error(&pt.cpl)) {
|
||||
printf("Passthrough command returned error.\n");
|
||||
exit(EX_IOERR);
|
||||
}
|
||||
if (nvme_completion_is_error(&pt.cpl))
|
||||
errx(1, "firmware activate request returned error");
|
||||
}
|
||||
|
||||
static void
|
||||
@ -181,7 +163,7 @@ firmware_usage(void)
|
||||
{
|
||||
fprintf(stderr, "usage:\n");
|
||||
fprintf(stderr, FIRMWARE_USAGE);
|
||||
exit(EX_USAGE);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
void
|
||||
@ -192,7 +174,7 @@ firmware(int argc, char *argv[])
|
||||
char ch, *p, *image = NULL;
|
||||
char *controller = NULL, prompt[64];
|
||||
void *buf = NULL;
|
||||
ssize_t size;
|
||||
int32_t size = 0;
|
||||
struct nvme_controller_data cdata;
|
||||
|
||||
a_flag = s_flag = f_flag = false;
|
||||
@ -252,34 +234,24 @@ firmware(int argc, char *argv[])
|
||||
open_dev(controller, &fd, 1, 1);
|
||||
read_controller_data(fd, &cdata);
|
||||
|
||||
if (cdata.oacs.firmware == 0) {
|
||||
fprintf(stderr,
|
||||
"Controller does not support firmware "
|
||||
"activate/download.\n");
|
||||
exit(EX_IOERR);
|
||||
}
|
||||
if (cdata.oacs.firmware == 0)
|
||||
errx(1,
|
||||
"controller does not support firmware activate/download");
|
||||
|
||||
if (f_flag && slot == 1 && cdata.frmw.slot1_ro) {
|
||||
fprintf(stderr, "Slot %d is marked as read only.\n", slot);
|
||||
exit(EX_IOERR);
|
||||
}
|
||||
if (f_flag && slot == 1 && cdata.frmw.slot1_ro)
|
||||
errx(1, "slot %d is marked as read only", slot);
|
||||
|
||||
if (slot > cdata.frmw.num_slots) {
|
||||
fprintf(stderr,
|
||||
"Slot %d was specified but controller only "
|
||||
"supports %d firmware slots.\n",
|
||||
if (slot > cdata.frmw.num_slots)
|
||||
errx(1,
|
||||
"slot %d specified but controller only supports %d slots",
|
||||
slot, cdata.frmw.num_slots);
|
||||
exit(EX_IOERR);
|
||||
}
|
||||
|
||||
if (!slot_has_valid_firmware(fd, slot)) {
|
||||
fprintf(stderr,
|
||||
"Slot %d does not contain valid firmware.\n"
|
||||
"Try 'nvmecontrol logpage -p 3 %s' to get a list "
|
||||
"of available firmware images.\n",
|
||||
if (!slot_has_valid_firmware(fd, slot))
|
||||
errx(1,
|
||||
"slot %d does not contain valid firmware,\n"
|
||||
"try 'nvmecontrol logpage -p 3 %s' to get a list "
|
||||
"of available images\n",
|
||||
slot, controller);
|
||||
exit(EX_IOERR);
|
||||
}
|
||||
|
||||
if (f_flag && a_flag)
|
||||
printf("You are about to download and activate "
|
||||
@ -305,7 +277,7 @@ firmware(int argc, char *argv[])
|
||||
if (strncasecmp(prompt, "yes", 3) == 0)
|
||||
break;
|
||||
if (strncasecmp(prompt, "no", 2) == 0)
|
||||
exit(EX_OK);
|
||||
exit(1);
|
||||
printf("Please answer \"yes\" or \"no\". ");
|
||||
}
|
||||
|
||||
@ -331,5 +303,5 @@ firmware(int argc, char *argv[])
|
||||
}
|
||||
|
||||
close(fd);
|
||||
exit(EX_OK);
|
||||
exit(0);
|
||||
}
|
||||
|
@ -30,13 +30,13 @@ __FBSDID("$FreeBSD$");
|
||||
#include <sys/param.h>
|
||||
|
||||
#include <ctype.h>
|
||||
#include <err.h>
|
||||
#include <errno.h>
|
||||
#include <fcntl.h>
|
||||
#include <stddef.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <sysexits.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include "nvmecontrol.h"
|
||||
@ -139,7 +139,7 @@ identify_usage(void)
|
||||
{
|
||||
fprintf(stderr, "usage:\n");
|
||||
fprintf(stderr, IDENTIFY_USAGE);
|
||||
exit(EX_USAGE);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
static void
|
||||
@ -177,16 +177,16 @@ identify_ctrlr(int argc, char *argv[])
|
||||
hexlength = offsetof(struct nvme_controller_data,
|
||||
reserved5);
|
||||
print_hex(&cdata, hexlength);
|
||||
exit(EX_OK);
|
||||
exit(0);
|
||||
}
|
||||
|
||||
if (verboseflag == 1) {
|
||||
printf("-v not currently supported without -x.\n");
|
||||
fprintf(stderr, "-v not currently supported without -x\n");
|
||||
identify_usage();
|
||||
}
|
||||
|
||||
print_controller(&cdata);
|
||||
exit(EX_OK);
|
||||
exit(0);
|
||||
}
|
||||
|
||||
static void
|
||||
@ -231,10 +231,8 @@ identify_ns(int argc, char *argv[])
|
||||
nsloc = strnstr(argv[optind], NVME_NS_PREFIX, 10);
|
||||
if (nsloc != NULL)
|
||||
nsid = strtol(nsloc + 2, NULL, 10);
|
||||
if (nsloc == NULL || (nsid == 0 && errno != 0)) {
|
||||
printf("Invalid namespace ID %s.\n", argv[optind]);
|
||||
exit(EX_IOERR);
|
||||
}
|
||||
if (nsloc == NULL || (nsid == 0 && errno != 0))
|
||||
errx(1, "invalid namespace ID '%s'", argv[optind]);
|
||||
|
||||
/*
|
||||
* We send IDENTIFY commands to the controller, not the namespace,
|
||||
@ -253,16 +251,16 @@ identify_ns(int argc, char *argv[])
|
||||
hexlength = offsetof(struct nvme_namespace_data,
|
||||
reserved6);
|
||||
print_hex(&nsdata, hexlength);
|
||||
exit(EX_OK);
|
||||
exit(0);
|
||||
}
|
||||
|
||||
if (verboseflag == 1) {
|
||||
printf("-v not currently supported without -x.\n");
|
||||
fprintf(stderr, "-v not currently supported without -x\n");
|
||||
identify_usage();
|
||||
}
|
||||
|
||||
print_namespace(&nsdata);
|
||||
exit(EX_OK);
|
||||
exit(0);
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -34,6 +34,7 @@ __FBSDID("$FreeBSD$");
|
||||
#include <sys/ioccom.h>
|
||||
|
||||
#include <ctype.h>
|
||||
#include <err.h>
|
||||
#include <errno.h>
|
||||
#include <fcntl.h>
|
||||
#include <stdbool.h>
|
||||
@ -41,7 +42,6 @@ __FBSDID("$FreeBSD$");
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <sysexits.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include "nvmecontrol.h"
|
||||
@ -52,14 +52,13 @@ __FBSDID("$FreeBSD$");
|
||||
typedef void (*print_fn_t)(void *buf, uint32_t size);
|
||||
|
||||
static void *
|
||||
get_log_buffer(size_t size)
|
||||
get_log_buffer(uint32_t size)
|
||||
{
|
||||
void *buf;
|
||||
|
||||
if ((buf = malloc(size)) == NULL) {
|
||||
fprintf(stderr, "Unable to malloc %zd bytes\n", size);
|
||||
exit(EX_IOERR);
|
||||
}
|
||||
if ((buf = malloc(size)) == NULL)
|
||||
errx(1, "unable to malloc %u bytes", size);
|
||||
|
||||
memset(buf, 0, size);
|
||||
return (buf);
|
||||
}
|
||||
@ -79,16 +78,11 @@ read_logpage(int fd, uint8_t log_page, int nsid, void *payload,
|
||||
pt.len = payload_size;
|
||||
pt.is_read = 1;
|
||||
|
||||
if (ioctl(fd, NVME_PASSTHROUGH_CMD, &pt) < 0) {
|
||||
printf("Get log page request failed. errno=%d (%s)\n",
|
||||
errno, strerror(errno));
|
||||
exit(EX_IOERR);
|
||||
}
|
||||
if (ioctl(fd, NVME_PASSTHROUGH_CMD, &pt) < 0)
|
||||
err(1, "get log page request failed");
|
||||
|
||||
if (nvme_completion_is_error(&pt.cpl)) {
|
||||
printf("Passthrough command returned error.\n");
|
||||
exit(EX_IOERR);
|
||||
}
|
||||
if (nvme_completion_is_error(&pt.cpl))
|
||||
errx(1, "get log page request returned error");
|
||||
}
|
||||
|
||||
static void
|
||||
@ -242,7 +236,7 @@ logpage_usage(void)
|
||||
{
|
||||
fprintf(stderr, "usage:\n");
|
||||
fprintf(stderr, LOGPAGE_USAGE);
|
||||
exit(EX_USAGE);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
void
|
||||
@ -254,7 +248,7 @@ logpage(int argc, char *argv[])
|
||||
int allow_ns = false;
|
||||
char ch, *p, *nsloc = NULL;
|
||||
char *cname = NULL;
|
||||
size_t size;
|
||||
uint32_t size;
|
||||
void *buf;
|
||||
struct logpage_function *f;
|
||||
struct nvme_controller_data cdata;
|
||||
@ -313,28 +307,20 @@ logpage(int argc, char *argv[])
|
||||
/* If a namespace id was specified, validate it's use */
|
||||
if (strstr(argv[optind], NVME_NS_PREFIX) != NULL) {
|
||||
if (!allow_ns) {
|
||||
if (log_page != NVME_LOG_HEALTH_INFORMATION) {
|
||||
fprintf(stderr,
|
||||
"Namespace ID not valid for log page %d.\n",
|
||||
if (log_page != NVME_LOG_HEALTH_INFORMATION)
|
||||
errx(1,
|
||||
"log page %d valid only at controller level",
|
||||
log_page);
|
||||
} else if (cdata.lpa.ns_smart == 0) {
|
||||
fprintf(stderr,
|
||||
"Controller does not support per "
|
||||
"namespace SMART/Health information.\n");
|
||||
}
|
||||
close(fd);
|
||||
exit(EX_IOERR);
|
||||
else if (cdata.lpa.ns_smart == 0)
|
||||
errx(1,
|
||||
"controller does not support per "
|
||||
"namespace smart/health information");
|
||||
}
|
||||
nsloc = strnstr(argv[optind], NVME_NS_PREFIX, 10);
|
||||
if (nsloc != NULL)
|
||||
nsid = strtol(nsloc + 2, NULL, 10);
|
||||
if (nsloc == NULL || (nsid == 0 && errno != 0)) {
|
||||
fprintf(stderr,
|
||||
"Invalid namespace ID %s.\n",
|
||||
argv[optind]);
|
||||
close(fd);
|
||||
exit(EX_IOERR);
|
||||
}
|
||||
if (nsloc == NULL || (nsid == 0 && errno != 0))
|
||||
errx(1, "invalid namespace id '%s'", argv[optind]);
|
||||
|
||||
/*
|
||||
* User is asking for per namespace log page information
|
||||
@ -384,5 +370,5 @@ logpage(int argc, char *argv[])
|
||||
print_fn(buf, size);
|
||||
|
||||
close(fd);
|
||||
exit(EX_OK);
|
||||
exit(0);
|
||||
}
|
||||
|
@ -32,14 +32,13 @@ __FBSDID("$FreeBSD$");
|
||||
#include <sys/stat.h>
|
||||
|
||||
#include <ctype.h>
|
||||
#include <errno.h>
|
||||
#include <err.h>
|
||||
#include <fcntl.h>
|
||||
#include <stdbool.h>
|
||||
#include <stddef.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <sysexits.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include "nvmecontrol.h"
|
||||
@ -71,7 +70,7 @@ usage(void)
|
||||
fprintf(stderr, "%s", f->usage);
|
||||
f++;
|
||||
}
|
||||
exit(EX_USAGE);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
static void
|
||||
@ -134,16 +133,11 @@ read_controller_data(int fd, struct nvme_controller_data *cdata)
|
||||
pt.len = sizeof(*cdata);
|
||||
pt.is_read = 1;
|
||||
|
||||
if (ioctl(fd, NVME_PASSTHROUGH_CMD, &pt) < 0) {
|
||||
printf("Identify request failed. errno=%d (%s)\n",
|
||||
errno, strerror(errno));
|
||||
exit(EX_IOERR);
|
||||
}
|
||||
if (ioctl(fd, NVME_PASSTHROUGH_CMD, &pt) < 0)
|
||||
err(1, "identify request failed");
|
||||
|
||||
if (nvme_completion_is_error(&pt.cpl)) {
|
||||
printf("Passthrough command returned error.\n");
|
||||
exit(EX_IOERR);
|
||||
}
|
||||
if (nvme_completion_is_error(&pt.cpl))
|
||||
errx(1, "identify request returned error");
|
||||
}
|
||||
|
||||
void
|
||||
@ -158,16 +152,11 @@ read_namespace_data(int fd, int nsid, struct nvme_namespace_data *nsdata)
|
||||
pt.len = sizeof(*nsdata);
|
||||
pt.is_read = 1;
|
||||
|
||||
if (ioctl(fd, NVME_PASSTHROUGH_CMD, &pt) < 0) {
|
||||
printf("Identify request failed. errno=%d (%s)\n",
|
||||
errno, strerror(errno));
|
||||
exit(EX_IOERR);
|
||||
}
|
||||
if (ioctl(fd, NVME_PASSTHROUGH_CMD, &pt) < 0)
|
||||
err(1, "identify request failed");
|
||||
|
||||
if (nvme_completion_is_error(&pt.cpl)) {
|
||||
printf("Passthrough command returned error.\n");
|
||||
exit(EX_IOERR);
|
||||
}
|
||||
if (nvme_completion_is_error(&pt.cpl))
|
||||
errx(1, "identify request returned error");
|
||||
}
|
||||
|
||||
int
|
||||
@ -178,38 +167,35 @@ open_dev(const char *str, int *fd, int show_error, int exit_on_error)
|
||||
|
||||
if (!strnstr(str, NVME_CTRLR_PREFIX, strlen(NVME_CTRLR_PREFIX))) {
|
||||
if (show_error)
|
||||
fprintf(stderr,
|
||||
"Controller/namespace IDs must begin with '%s'.\n",
|
||||
warnx("controller/namespace ids must begin with '%s'",
|
||||
NVME_CTRLR_PREFIX);
|
||||
if (exit_on_error)
|
||||
exit(EX_USAGE);
|
||||
exit(1);
|
||||
else
|
||||
return (EX_USAGE);
|
||||
return (1);
|
||||
}
|
||||
|
||||
snprintf(full_path, sizeof(full_path), "/dev/%s", str);
|
||||
if (stat(full_path, &devstat) != 0) {
|
||||
if (show_error)
|
||||
fprintf(stderr, "Could not stat %s. errno=%d (%s)\n",
|
||||
full_path, errno, strerror(errno));
|
||||
warn("could not stat %s", full_path);
|
||||
if (exit_on_error)
|
||||
exit(EX_NOINPUT);
|
||||
exit(1);
|
||||
else
|
||||
return (EX_NOINPUT);
|
||||
return (1);
|
||||
}
|
||||
|
||||
*fd = open(full_path, O_RDWR);
|
||||
if (*fd < 0) {
|
||||
if (show_error)
|
||||
fprintf(stderr, "Could not open %s. errno=%d (%s)\n",
|
||||
full_path, errno, strerror(errno));
|
||||
warn("could not open %s", full_path);
|
||||
if (exit_on_error)
|
||||
exit(EX_NOPERM);
|
||||
exit(1);
|
||||
else
|
||||
return (EX_NOPERM);
|
||||
return (1);
|
||||
}
|
||||
|
||||
return (EX_OK);
|
||||
return (0);
|
||||
}
|
||||
|
||||
int
|
||||
|
@ -31,14 +31,13 @@ __FBSDID("$FreeBSD$");
|
||||
#include <sys/ioccom.h>
|
||||
|
||||
#include <ctype.h>
|
||||
#include <errno.h>
|
||||
#include <err.h>
|
||||
#include <fcntl.h>
|
||||
#include <stdbool.h>
|
||||
#include <stddef.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <sysexits.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include "nvmecontrol.h"
|
||||
@ -72,7 +71,7 @@ perftest_usage(void)
|
||||
{
|
||||
fprintf(stderr, "usage:\n");
|
||||
fprintf(stderr, PERFTEST_USAGE);
|
||||
exit(EX_USAGE);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
void
|
||||
@ -168,14 +167,10 @@ perftest(int argc, char *argv[])
|
||||
perftest_usage();
|
||||
|
||||
open_dev(argv[optind], &fd, 1, 1);
|
||||
if (ioctl(fd, ioctl_cmd, &io_test) < 0) {
|
||||
fprintf(stderr, "NVME_IO_TEST failed. errno=%d (%s)\n", errno,
|
||||
strerror(errno));
|
||||
close(fd);
|
||||
exit(EX_IOERR);
|
||||
}
|
||||
if (ioctl(fd, ioctl_cmd, &io_test) < 0)
|
||||
err(1, "ioctl NVME_IO_TEST failed");
|
||||
|
||||
close(fd);
|
||||
print_perftest(&io_test, perthread);
|
||||
exit(EX_OK);
|
||||
exit(0);
|
||||
}
|
||||
|
@ -30,12 +30,11 @@ __FBSDID("$FreeBSD$");
|
||||
#include <sys/param.h>
|
||||
#include <sys/ioccom.h>
|
||||
|
||||
#include <errno.h>
|
||||
#include <err.h>
|
||||
#include <fcntl.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <sysexits.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include "nvmecontrol.h"
|
||||
@ -45,7 +44,7 @@ reset_usage(void)
|
||||
{
|
||||
fprintf(stderr, "usage:\n");
|
||||
fprintf(stderr, RESET_USAGE);
|
||||
exit(EX_USAGE);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
void
|
||||
@ -65,11 +64,8 @@ reset(int argc, char *argv[])
|
||||
reset_usage();
|
||||
|
||||
open_dev(argv[optind], &fd, 1, 1);
|
||||
if (ioctl(fd, NVME_RESET_CONTROLLER) < 0) {
|
||||
printf("Reset request to %s failed. errno=%d (%s)\n",
|
||||
argv[optind], errno, strerror(errno));
|
||||
exit(EX_IOERR);
|
||||
}
|
||||
if (ioctl(fd, NVME_RESET_CONTROLLER) < 0)
|
||||
err(1, "reset request to %s failed", argv[optind]);
|
||||
|
||||
exit(EX_OK);
|
||||
exit(0);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user