svn commit: r330846 - head/sbin/nvmecontrol
Alexander Motin
mav at FreeBSD.org
Tue Mar 13 15:29:14 UTC 2018
Author: mav
Date: Tue Mar 13 15:29:13 2018
New Revision: 330846
URL: https://svnweb.freebsd.org/changeset/base/330846
Log:
Add some argument checks to be more user-friendly.
MFC after: 2 weeks
Sponsored by: iXsystems, Inc.
Modified:
head/sbin/nvmecontrol/format.c
Modified: head/sbin/nvmecontrol/format.c
==============================================================================
--- head/sbin/nvmecontrol/format.c Tue Mar 13 15:03:58 2018 (r330845)
+++ head/sbin/nvmecontrol/format.c Tue Mar 13 15:29:13 2018 (r330846)
@@ -81,9 +81,13 @@ format(int argc, char *argv[])
pil = strtol(optarg, NULL, 0);
break;
case 'E':
+ if (ses == 2)
+ errx(1, "-E and -C are mutually exclusive");
ses = 1;
break;
case 'C':
+ if (ses == 1)
+ errx(1, "-E and -C are mutually exclusive");
ses = 2;
break;
default:
@@ -109,19 +113,7 @@ format(int argc, char *argv[])
*/
if (strstr(target, NVME_NS_PREFIX) == NULL) {
nsid = NVME_GLOBAL_NAMESPACE_TAG;
-
- /* We have no previous parameters, so use defaults. */
- if (lbaf < 0)
- lbaf = 0;
- if (mset < 0)
- mset = 0;
- if (pi < 0)
- pi = 0;
- if (pil < 0)
- pil = 0;
} else {
- parse_ns_str(target, path, &nsid);
-
/*
* We send FORMAT commands to the controller, not the namespace,
* since it is an admin cmd. The namespace ID will be specified
@@ -129,25 +121,34 @@ format(int argc, char *argv[])
* string to get the controller substring and namespace ID.
*/
close(fd);
+ parse_ns_str(target, path, &nsid);
open_dev(path, &fd, 1, 1);
+ }
- /* Check that controller can execute this command. */
- read_controller_data(fd, &cd);
- if (((cd.fna >> NVME_CTRLR_DATA_FNA_FORMAT_ALL_SHIFT)
- & NVME_CTRLR_DATA_FNA_FORMAT_ALL_MASK) && ses == 0) {
- fprintf(stderr, "H/w doesn't support per-NS format\n");
- exit(1);
- } else if (((cd.fna >> NVME_CTRLR_DATA_FNA_ERASE_ALL_SHIFT)
- & NVME_CTRLR_DATA_FNA_ERASE_ALL_MASK) && ses != 0) {
- fprintf(stderr, "H/w doesn't support per-NS erase\n");
- exit(1);
- }
+ /* Check that controller can execute this command. */
+ read_controller_data(fd, &cd);
+ if (((cd.oacs >> NVME_CTRLR_DATA_OACS_FORMAT_SHIFT) &
+ NVME_CTRLR_DATA_OACS_FORMAT_MASK) == 0)
+ errx(1, "controller does not support format");
+ if (((cd.fna >> NVME_CTRLR_DATA_FNA_CRYPTO_ERASE_SHIFT) &
+ NVME_CTRLR_DATA_FNA_CRYPTO_ERASE_MASK) == 0 && ses == 2)
+ errx(1, "controller does not support cryptographic erase");
+ if (nsid != NVME_GLOBAL_NAMESPACE_TAG) {
+ if (((cd.fna >> NVME_CTRLR_DATA_FNA_FORMAT_ALL_SHIFT) &
+ NVME_CTRLR_DATA_FNA_FORMAT_ALL_MASK) && ses == 0)
+ errx(1, "controller does not support per-NS format");
+ if (((cd.fna >> NVME_CTRLR_DATA_FNA_ERASE_ALL_SHIFT) &
+ NVME_CTRLR_DATA_FNA_ERASE_ALL_MASK) && ses != 0)
+ errx(1, "controller does not support per-NS erase");
+
/* Try to keep previous namespace parameters. */
read_namespace_data(fd, nsid, &nsd);
if (lbaf < 0)
lbaf = (nsd.flbas >> NVME_NS_DATA_FLBAS_FORMAT_SHIFT)
& NVME_NS_DATA_FLBAS_FORMAT_MASK;
+ if (lbaf > nsd.nlbaf)
+ errx(1, "LBA format is out of range");
if (mset < 0)
mset = (nsd.flbas >> NVME_NS_DATA_FLBAS_EXTENDED_SHIFT)
& NVME_NS_DATA_FLBAS_EXTENDED_MASK;
@@ -157,6 +158,17 @@ format(int argc, char *argv[])
if (pil < 0)
pil = (nsd.dps >> NVME_NS_DATA_DPS_PIT_SHIFT)
& NVME_NS_DATA_DPS_PIT_MASK;
+ } else {
+
+ /* We have no previous parameters, so default to zeroes. */
+ if (lbaf < 0)
+ lbaf = 0;
+ if (mset < 0)
+ mset = 0;
+ if (pi < 0)
+ pi = 0;
+ if (pil < 0)
+ pil = 0;
}
memset(&pt, 0, sizeof(pt));
More information about the svn-src-all
mailing list