aboutsummaryrefslogtreecommitdiff
path: root/lib/geom/eli/geom_eli.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/geom/eli/geom_eli.c')
-rw-r--r--lib/geom/eli/geom_eli.c59
1 files changed, 46 insertions, 13 deletions
diff --git a/lib/geom/eli/geom_eli.c b/lib/geom/eli/geom_eli.c
index 2da4b56c2ed0..2b08bf14a185 100644
--- a/lib/geom/eli/geom_eli.c
+++ b/lib/geom/eli/geom_eli.c
@@ -1,7 +1,7 @@
/*-
* SPDX-License-Identifier: BSD-2-Clause-FreeBSD
*
- * Copyright (c) 2004-2010 Pawel Jakub Dawidek <pjd@FreeBSD.org>
+ * Copyright (c) 2004-2019 Pawel Jakub Dawidek <pawel@dawidek.net>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -91,13 +91,13 @@ static int eli_backup_create(struct gctl_req *req, const char *prov,
/*
* Available commands:
*
- * init [-bdgPTv] [-a aalgo] [-B backupfile] [-e ealgo] [-i iterations] [-l keylen] [-J newpassfile] [-K newkeyfile] [-s sectorsize] [-V version] prov ...
+ * init [-bdgPRTv] [-a aalgo] [-B backupfile] [-e ealgo] [-i iterations] [-l keylen] [-J newpassfile] [-K newkeyfile] [-s sectorsize] [-V version] prov ...
* label - alias for 'init'
* attach [-Cdprv] [-n keyno] [-j passfile] [-k keyfile] prov ...
* detach [-fl] prov ...
* stop - alias for 'detach'
- * onetime [-dT] [-a aalgo] [-e ealgo] [-l keylen] prov
- * configure [-bBgGtT] prov ...
+ * onetime [-dRT] [-a aalgo] [-e ealgo] [-l keylen] prov
+ * configure [-bBgGrRtT] prov ...
* setkey [-pPv] [-n keyno] [-j passfile] [-J newpassfile] [-k keyfile] [-K newkeyfile] prov
* delkey [-afv] [-n keyno] prov
* suspend [-v] -a | prov ...
@@ -124,12 +124,13 @@ struct g_command class_commands[] = {
{ 'K', "newkeyfile", G_VAL_OPTIONAL, G_TYPE_STRING | G_TYPE_MULTI },
{ 'l', "keylen", "0", G_TYPE_NUMBER },
{ 'P', "nonewpassphrase", NULL, G_TYPE_BOOL },
+ { 'R', "noautoresize", NULL, G_TYPE_BOOL },
{ 's', "sectorsize", "0", G_TYPE_NUMBER },
{ 'T', "notrim", NULL, G_TYPE_BOOL },
{ 'V', "mdversion", "-1", G_TYPE_NUMBER },
G_OPT_SENTINEL
},
- "[-bdgPTv] [-a aalgo] [-B backupfile] [-e ealgo] [-i iterations] [-l keylen] [-J newpassfile] [-K newkeyfile] [-s sectorsize] [-V version] prov ..."
+ "[-bdgPRTv] [-a aalgo] [-B backupfile] [-e ealgo] [-i iterations] [-l keylen] [-J newpassfile] [-K newkeyfile] [-s sectorsize] [-V version] prov ..."
},
{ "label", G_FLAG_VERBOSE, eli_main,
{
@@ -144,6 +145,7 @@ struct g_command class_commands[] = {
{ 'K', "newkeyfile", G_VAL_OPTIONAL, G_TYPE_STRING | G_TYPE_MULTI },
{ 'l', "keylen", "0", G_TYPE_NUMBER },
{ 'P', "nonewpassphrase", NULL, G_TYPE_BOOL },
+ { 'R', "noautoresize", NULL, G_TYPE_BOOL },
{ 's', "sectorsize", "0", G_TYPE_NUMBER },
{ 'T', "notrim", NULL, G_TYPE_BOOL },
{ 'V', "mdversion", "-1", G_TYPE_NUMBER },
@@ -186,11 +188,12 @@ struct g_command class_commands[] = {
{ 'd', "detach", NULL, G_TYPE_BOOL },
{ 'e', "ealgo", GELI_ENC_ALGO, G_TYPE_STRING },
{ 'l', "keylen", "0", G_TYPE_NUMBER },
+ { 'R', "noautoresize", NULL, G_TYPE_BOOL },
{ 's', "sectorsize", "0", G_TYPE_NUMBER },
{ 'T', "notrim", NULL, G_TYPE_BOOL },
G_OPT_SENTINEL
},
- "[-dT] [-a aalgo] [-e ealgo] [-l keylen] [-s sectorsize] prov"
+ "[-dRT] [-a aalgo] [-e ealgo] [-l keylen] [-s sectorsize] prov"
},
{ "configure", G_FLAG_VERBOSE, eli_main,
{
@@ -200,11 +203,13 @@ struct g_command class_commands[] = {
{ 'D', "nodisplaypass", NULL, G_TYPE_BOOL },
{ 'g', "geliboot", NULL, G_TYPE_BOOL },
{ 'G', "nogeliboot", NULL, G_TYPE_BOOL },
+ { 'r', "autoresize", NULL, G_TYPE_BOOL },
+ { 'R', "noautoresize", NULL, G_TYPE_BOOL },
{ 't', "trim", NULL, G_TYPE_BOOL },
{ 'T', "notrim", NULL, G_TYPE_BOOL },
G_OPT_SENTINEL
},
- "[-bBdDgGtT] prov ..."
+ "[-bBdDgGrRtT] prov ..."
},
{ "setkey", G_FLAG_VERBOSE, eli_main,
{
@@ -728,7 +733,7 @@ eli_init(struct gctl_req *req)
version = val;
}
md.md_version = version;
- md.md_flags = 0;
+ md.md_flags = G_ELI_FLAG_AUTORESIZE;
if (gctl_get_int(req, "boot"))
md.md_flags |= G_ELI_FLAG_BOOT;
if (gctl_get_int(req, "geliboot"))
@@ -737,6 +742,8 @@ eli_init(struct gctl_req *req)
md.md_flags |= G_ELI_FLAG_GELIDISPLAYPASS;
if (gctl_get_int(req, "notrim"))
md.md_flags |= G_ELI_FLAG_NODELETE;
+ if (gctl_get_int(req, "noautoresize"))
+ md.md_flags &= ~G_ELI_FLAG_AUTORESIZE;
md.md_ealgo = CRYPTO_ALGORITHM_MIN - 1;
str = gctl_get_ascii(req, "aalgo");
if (*str != '\0') {
@@ -1095,7 +1102,7 @@ out:
static void
eli_configure_detached(struct gctl_req *req, const char *prov, int boot,
- int geliboot, int displaypass, int trim)
+ int geliboot, int displaypass, int trim, int autoresize)
{
struct g_eli_metadata md;
bool changed = 0;
@@ -1160,6 +1167,20 @@ eli_configure_detached(struct gctl_req *req, const char *prov, int boot,
changed = 1;
}
+ if (autoresize == 1 && (md.md_flags & G_ELI_FLAG_AUTORESIZE)) {
+ if (verbose)
+ printf("AUTORESIZE flag already configured for %s.\n", prov);
+ } else if (autoresize == 0 && !(md.md_flags & G_ELI_FLAG_AUTORESIZE)) {
+ if (verbose)
+ printf("AUTORESIZE flag not configured for %s.\n", prov);
+ } else if (autoresize >= 0) {
+ if (autoresize)
+ md.md_flags |= G_ELI_FLAG_AUTORESIZE;
+ else
+ md.md_flags &= ~G_ELI_FLAG_AUTORESIZE;
+ changed = 1;
+ }
+
if (changed)
eli_metadata_store(req, prov, &md);
explicit_bzero(&md, sizeof(md));
@@ -1170,8 +1191,8 @@ eli_configure(struct gctl_req *req)
{
const char *prov;
bool boot, noboot, geliboot, nogeliboot, displaypass, nodisplaypass;
- bool trim, notrim;
- int doboot, dogeliboot, dodisplaypass, dotrim;
+ bool autoresize, noautoresize, trim, notrim;
+ int doboot, dogeliboot, dodisplaypass, dotrim, doautoresize;
int i, nargs;
nargs = gctl_get_int(req, "nargs");
@@ -1188,6 +1209,8 @@ eli_configure(struct gctl_req *req)
nodisplaypass = gctl_get_int(req, "nodisplaypass");
trim = gctl_get_int(req, "trim");
notrim = gctl_get_int(req, "notrim");
+ autoresize = gctl_get_int(req, "autoresize");
+ noautoresize = gctl_get_int(req, "noautoresize");
doboot = -1;
if (boot && noboot) {
@@ -1229,8 +1252,18 @@ eli_configure(struct gctl_req *req)
else if (notrim)
dotrim = 0;
+ doautoresize = -1;
+ if (autoresize && noautoresize) {
+ gctl_error(req, "Options -r and -R are mutually exclusive.");
+ return;
+ }
+ if (autoresize)
+ doautoresize = 1;
+ else if (noautoresize)
+ doautoresize = 0;
+
if (doboot == -1 && dogeliboot == -1 && dodisplaypass == -1 &&
- dotrim == -1) {
+ dotrim == -1 && doautoresize == -1) {
gctl_error(req, "No option given.");
return;
}
@@ -1242,7 +1275,7 @@ eli_configure(struct gctl_req *req)
prov = gctl_get_ascii(req, "arg%d", i);
if (!eli_is_attached(prov)) {
eli_configure_detached(req, prov, doboot, dogeliboot,
- dodisplaypass, dotrim);
+ dodisplaypass, dotrim, doautoresize);
}
}
}