From 3cf55d3ab983b900d2cfbdb2d2b60072ac26bd87 Mon Sep 17 00:00:00 2001 From: Marcel Moolenaar Date: Tue, 15 May 2007 20:25:18 +0000 Subject: [PATCH] Add gpart(8). In order to support gpart(8), geom(8) needs to support a named argument. Also, optional string parameters are a requirement. Both have been added to the infrastructure. The former required all existing classes to be adjusted. --- sbin/geom/class/Makefile | 1 + sbin/geom/class/cache/geom_cache.c | 16 +- sbin/geom/class/concat/geom_concat.c | 12 +- sbin/geom/class/eli/geom_eli.c | 28 +- sbin/geom/class/journal/geom_journal.c | 10 +- sbin/geom/class/label/geom_label.c | 12 +- sbin/geom/class/mirror/geom_mirror.c | 22 +- sbin/geom/class/multipath/geom_multipath.c | 4 +- sbin/geom/class/nop/geom_nop.c | 10 +- sbin/geom/class/part/Makefile | 9 + sbin/geom/class/part/geom_part.c | 91 ++++++ sbin/geom/class/part/gpart.8 | 308 +++++++++++++++++++++ sbin/geom/class/raid3/geom_raid3.c | 16 +- sbin/geom/class/shsec/geom_shsec.c | 8 +- sbin/geom/class/stripe/geom_stripe.c | 12 +- sbin/geom/core/geom.c | 41 ++- sbin/geom/core/geom.h | 3 +- 17 files changed, 512 insertions(+), 91 deletions(-) create mode 100644 sbin/geom/class/part/Makefile create mode 100644 sbin/geom/class/part/geom_part.c create mode 100644 sbin/geom/class/part/gpart.8 diff --git a/sbin/geom/class/Makefile b/sbin/geom/class/Makefile index f52695b8b672..7b99726bd9d9 100644 --- a/sbin/geom/class/Makefile +++ b/sbin/geom/class/Makefile @@ -12,6 +12,7 @@ SUBDIR+=label SUBDIR+=mirror SUBDIR+=multipath SUBDIR+=nop +SUBDIR+=part SUBDIR+=raid3 SUBDIR+=shsec SUBDIR+=stripe diff --git a/sbin/geom/class/cache/geom_cache.c b/sbin/geom/class/cache/geom_cache.c index 5ca829cdf03f..636c54119ce1 100644 --- a/sbin/geom/class/cache/geom_cache.c +++ b/sbin/geom/class/cache/geom_cache.c @@ -53,7 +53,7 @@ static void cache_dump(struct gctl_req *req); static void cache_label(struct gctl_req *req); struct g_command class_commands[] = { - { "clear", G_FLAG_VERBOSE, cache_main, G_NULL_OPTS, + { "clear", G_FLAG_VERBOSE, cache_main, G_NULL_OPTS, NULL, "[-v] prov ..." }, { "configure", G_FLAG_VERBOSE, NULL, @@ -62,7 +62,7 @@ struct g_command class_commands[] = { { 's', "size", &size_configure, G_TYPE_NUMBER }, G_OPT_SENTINEL }, - "[-v] [-b blocksize] [-s size] name" + NULL, "[-v] [-b blocksize] [-s size] name" }, { "create", G_FLAG_VERBOSE | G_FLAG_LOADKLD, NULL, { @@ -70,16 +70,16 @@ struct g_command class_commands[] = { { 's', "size", &size_label, G_TYPE_NUMBER }, G_OPT_SENTINEL }, - "[-v] [-b blocksize] [-s size] name prov" + NULL, "[-v] [-b blocksize] [-s size] name prov" }, { "destroy", G_FLAG_VERBOSE, NULL, { { 'f', "force", NULL, G_TYPE_BOOL }, G_OPT_SENTINEL }, - "[-fv] name ..." + NULL, "[-fv] name ..." }, - { "dump", 0, cache_main, G_NULL_OPTS, + { "dump", 0, cache_main, G_NULL_OPTS, NULL, "prov ..." }, { "label", G_FLAG_VERBOSE | G_FLAG_LOADKLD, cache_main, @@ -88,9 +88,9 @@ struct g_command class_commands[] = { { 's', "size", &size_label, G_TYPE_NUMBER }, G_OPT_SENTINEL }, - "[-v] [-b blocksize] [-s size] name prov" + NULL, "[-v] [-b blocksize] [-s size] name prov" }, - { "reset", G_FLAG_VERBOSE, NULL, G_NULL_OPTS, + { "reset", G_FLAG_VERBOSE, NULL, G_NULL_OPTS, NULL, "[-v] name ..." }, { "stop", G_FLAG_VERBOSE, NULL, @@ -98,7 +98,7 @@ struct g_command class_commands[] = { { 'f', "force", NULL, G_TYPE_BOOL }, G_OPT_SENTINEL }, - "[-fv] name ..." + NULL, "[-fv] name ..." }, G_CMD_SENTINEL }; diff --git a/sbin/geom/class/concat/geom_concat.c b/sbin/geom/class/concat/geom_concat.c index 80fe26bedef0..e1b7342a0376 100644 --- a/sbin/geom/class/concat/geom_concat.c +++ b/sbin/geom/class/concat/geom_concat.c @@ -51,20 +51,20 @@ static void concat_dump(struct gctl_req *req); static void concat_label(struct gctl_req *req); struct g_command class_commands[] = { - { "clear", G_FLAG_VERBOSE, concat_main, G_NULL_OPTS, + { "clear", G_FLAG_VERBOSE, concat_main, G_NULL_OPTS, NULL, "[-v] prov ..." }, { "create", G_FLAG_VERBOSE | G_FLAG_LOADKLD, NULL, G_NULL_OPTS, - "[-v] name prov ..." + NULL, "[-v] name prov ..." }, { "destroy", G_FLAG_VERBOSE, NULL, { { 'f', "force", NULL, G_TYPE_BOOL }, G_OPT_SENTINEL }, - "[-fv] name ..." + NULL, "[-fv] name ..." }, - { "dump", 0, concat_main, G_NULL_OPTS, + { "dump", 0, concat_main, G_NULL_OPTS, NULL, "prov ..." }, { "label", G_FLAG_VERBOSE | G_FLAG_LOADKLD, concat_main, @@ -72,14 +72,14 @@ struct g_command class_commands[] = { { 'h', "hardcode", NULL, G_TYPE_BOOL }, G_OPT_SENTINEL }, - "[-hv] name prov ..." + NULL, "[-hv] name prov ..." }, { "stop", G_FLAG_VERBOSE, NULL, { { 'f', "force", NULL, G_TYPE_BOOL }, G_OPT_SENTINEL }, - "[-fv] name ..." + NULL, "[-fv] name ..." }, G_CMD_SENTINEL }; diff --git a/sbin/geom/class/eli/geom_eli.c b/sbin/geom/class/eli/geom_eli.c index 7c961d9f4e15..46f1bce684a5 100644 --- a/sbin/geom/class/eli/geom_eli.c +++ b/sbin/geom/class/eli/geom_eli.c @@ -105,7 +105,7 @@ struct g_command class_commands[] = { { 's', "sectorsize", §orsize, G_TYPE_NUMBER }, G_OPT_SENTINEL }, - "[-bPv] [-a aalgo] [-e ealgo] [-i iterations] [-l keylen] [-K newkeyfile] [-s sectorsize] prov" + NULL, "[-bPv] [-a aalgo] [-e ealgo] [-i iterations] [-l keylen] [-K newkeyfile] [-s sectorsize] prov" }, { "label", G_FLAG_VERBOSE, eli_main, { @@ -119,7 +119,7 @@ struct g_command class_commands[] = { { 's', "sectorsize", §orsize, G_TYPE_NUMBER }, G_OPT_SENTINEL }, - "- an alias for 'init'" + NULL, "- an alias for 'init'" }, { "attach", G_FLAG_VERBOSE | G_FLAG_LOADKLD, eli_main, { @@ -129,7 +129,7 @@ struct g_command class_commands[] = { { 'r', "readonly", NULL, G_TYPE_BOOL }, G_OPT_SENTINEL }, - "[-dprv] [-k keyfile] prov" + NULL, "[-dprv] [-k keyfile] prov" }, { "detach", 0, NULL, { @@ -137,7 +137,7 @@ struct g_command class_commands[] = { { 'l', "last", NULL, G_TYPE_BOOL }, G_OPT_SENTINEL }, - "[-fl] prov ..." + NULL, "[-fl] prov ..." }, { "stop", 0, NULL, { @@ -145,7 +145,7 @@ struct g_command class_commands[] = { { 'l', "last", NULL, G_TYPE_BOOL }, G_OPT_SENTINEL }, - "- an alias for 'detach'" + NULL, "- an alias for 'detach'" }, { "onetime", G_FLAG_VERBOSE | G_FLAG_LOADKLD, NULL, { @@ -156,7 +156,7 @@ struct g_command class_commands[] = { { 's', "sectorsize", §orsize, G_TYPE_NUMBER }, G_OPT_SENTINEL }, - "[-d] [-a aalgo] [-e ealgo] [-l keylen] [-s sectorsize] prov ..." + NULL, "[-d] [-a aalgo] [-e ealgo] [-l keylen] [-s sectorsize] prov ..." }, { "configure", G_FLAG_VERBOSE, eli_main, { @@ -164,7 +164,7 @@ struct g_command class_commands[] = { { 'B', "noboot", NULL, G_TYPE_BOOL }, G_OPT_SENTINEL }, - "[-bB] prov ..." + NULL, "[-bB] prov ..." }, { "setkey", G_FLAG_VERBOSE, eli_main, { @@ -176,7 +176,7 @@ struct g_command class_commands[] = { { 'P', "nonewpassphrase", NULL, G_TYPE_BOOL }, G_OPT_SENTINEL }, - "[-pPv] [-n keyno] [-i iterations] [-k keyfile] [-K newkeyfile] prov" + NULL, "[-pPv] [-n keyno] [-i iterations] [-k keyfile] [-K newkeyfile] prov" }, { "delkey", G_FLAG_VERBOSE, eli_main, { @@ -185,25 +185,25 @@ struct g_command class_commands[] = { { 'n', "keyno", &keyno, G_TYPE_NUMBER }, G_OPT_SENTINEL }, - "[-afv] [-n keyno] prov" + NULL, "[-afv] [-n keyno] prov" }, { "kill", G_FLAG_VERBOSE, eli_main, { { 'a', "all", NULL, G_TYPE_BOOL }, G_OPT_SENTINEL }, - "[-av] [prov ...]" + NULL, "[-av] [prov ...]" }, - { "backup", G_FLAG_VERBOSE, eli_main, G_NULL_OPTS, + { "backup", G_FLAG_VERBOSE, eli_main, G_NULL_OPTS, NULL, "[-v] prov file" }, - { "restore", G_FLAG_VERBOSE, eli_main, G_NULL_OPTS, + { "restore", G_FLAG_VERBOSE, eli_main, G_NULL_OPTS, NULL, "[-v] file prov" }, - { "clear", G_FLAG_VERBOSE, eli_main, G_NULL_OPTS, + { "clear", G_FLAG_VERBOSE, eli_main, G_NULL_OPTS, NULL, "[-v] prov ..." }, - { "dump", G_FLAG_VERBOSE, eli_main, G_NULL_OPTS, + { "dump", G_FLAG_VERBOSE, eli_main, G_NULL_OPTS, NULL, "[-v] prov ..." }, G_CMD_SENTINEL diff --git a/sbin/geom/class/journal/geom_journal.c b/sbin/geom/class/journal/geom_journal.c index ea620b2e28ed..37169990ac4e 100644 --- a/sbin/geom/class/journal/geom_journal.c +++ b/sbin/geom/class/journal/geom_journal.c @@ -55,10 +55,10 @@ static void journal_dump(struct gctl_req *req); static void journal_label(struct gctl_req *req); struct g_command class_commands[] = { - { "clear", G_FLAG_VERBOSE, journal_main, G_NULL_OPTS, + { "clear", G_FLAG_VERBOSE, journal_main, G_NULL_OPTS, NULL, "[-v] prov ..." }, - { "dump", 0, journal_main, G_NULL_OPTS, + { "dump", 0, journal_main, G_NULL_OPTS, NULL, "prov ..." }, { "label", G_FLAG_VERBOSE, journal_main, @@ -69,16 +69,16 @@ struct g_command class_commands[] = { { 's', "jsize", &default_jsize, G_TYPE_NUMBER }, G_OPT_SENTINEL }, - "[-cfhv] [-s jsize] dataprov [jprov]" + NULL, "[-cfhv] [-s jsize] dataprov [jprov]" }, { "stop", G_FLAG_VERBOSE, NULL, { { 'f', "force", NULL, G_TYPE_BOOL }, G_OPT_SENTINEL }, - "[-fv] name ..." + NULL, "[-fv] name ..." }, - { "sync", G_FLAG_VERBOSE, NULL, G_NULL_OPTS, + { "sync", G_FLAG_VERBOSE, NULL, G_NULL_OPTS, NULL, "[-v]" }, G_CMD_SENTINEL diff --git a/sbin/geom/class/label/geom_label.c b/sbin/geom/class/label/geom_label.c index c3bdebcc7b2c..9e27eec376e8 100644 --- a/sbin/geom/class/label/geom_label.c +++ b/sbin/geom/class/label/geom_label.c @@ -50,31 +50,31 @@ static void label_dump(struct gctl_req *req); static void label_label(struct gctl_req *req); struct g_command class_commands[] = { - { "clear", G_FLAG_VERBOSE, label_main, G_NULL_OPTS, + { "clear", G_FLAG_VERBOSE, label_main, G_NULL_OPTS, NULL, "[-v] dev ..." }, { "create", G_FLAG_VERBOSE | G_FLAG_LOADKLD, NULL, G_NULL_OPTS, - "[-v] name dev" + NULL, "[-v] name dev" }, { "destroy", G_FLAG_VERBOSE, NULL, { { 'f', "force", NULL, G_TYPE_BOOL }, G_OPT_SENTINEL }, - "[-fv] name ..." + NULL, "[-fv] name ..." }, - { "dump", 0, label_main, G_NULL_OPTS, + { "dump", 0, label_main, G_NULL_OPTS, NULL, "dev ..." }, { "label", G_FLAG_VERBOSE | G_FLAG_LOADKLD, label_main, G_NULL_OPTS, - "[-v] name dev" + NULL, "[-v] name dev" }, { "stop", G_FLAG_VERBOSE, NULL, { { 'f', "force", NULL, G_TYPE_BOOL }, G_OPT_SENTINEL }, - "[-fv] name ..." + NULL, "[-fv] name ..." }, G_CMD_SENTINEL }; diff --git a/sbin/geom/class/mirror/geom_mirror.c b/sbin/geom/class/mirror/geom_mirror.c index 7fc01cdd2f71..38912a34958b 100644 --- a/sbin/geom/class/mirror/geom_mirror.c +++ b/sbin/geom/class/mirror/geom_mirror.c @@ -56,10 +56,10 @@ static void mirror_dump(struct gctl_req *req); static void mirror_label(struct gctl_req *req); struct g_command class_commands[] = { - { "activate", G_FLAG_VERBOSE, mirror_main, G_NULL_OPTS, + { "activate", G_FLAG_VERBOSE, mirror_main, G_NULL_OPTS, NULL, "[-v] name prov ..." }, - { "clear", G_FLAG_VERBOSE, mirror_main, G_NULL_OPTS, + { "clear", G_FLAG_VERBOSE, mirror_main, G_NULL_OPTS, NULL, "[-v] prov ..." }, { "configure", G_FLAG_VERBOSE, NULL, @@ -74,15 +74,15 @@ struct g_command class_commands[] = { { 's', "slice", &configure_slice, G_TYPE_NUMBER }, G_OPT_SENTINEL }, - "[-adfFhnv] [-b balance] [-s slice] name" + NULL, "[-adfFhnv] [-b balance] [-s slice] name" }, - { "deactivate", G_FLAG_VERBOSE, NULL, G_NULL_OPTS, + { "deactivate", G_FLAG_VERBOSE, NULL, G_NULL_OPTS, NULL, "[-v] name prov ..." }, - { "dump", 0, mirror_main, G_NULL_OPTS, + { "dump", 0, mirror_main, G_NULL_OPTS, NULL, "prov ..." }, - { "forget", G_FLAG_VERBOSE, NULL, G_NULL_OPTS, + { "forget", G_FLAG_VERBOSE, NULL, G_NULL_OPTS, NULL, "name ..." }, { "label", G_FLAG_VERBOSE, mirror_main, @@ -94,7 +94,7 @@ struct g_command class_commands[] = { { 's', "slice", &label_slice, G_TYPE_NUMBER }, G_OPT_SENTINEL }, - "[-Fhnv] [-b balance] [-s slice] name prov ..." + NULL, "[-Fhnv] [-b balance] [-s slice] name prov ..." }, { "insert", G_FLAG_VERBOSE, NULL, { @@ -103,12 +103,12 @@ struct g_command class_commands[] = { { 'p', "priority", &insert_priority, G_TYPE_NUMBER }, G_OPT_SENTINEL }, - "[-hiv] [-p priority] name prov ..." + NULL, "[-hiv] [-p priority] name prov ..." }, - { "rebuild", G_FLAG_VERBOSE, NULL, G_NULL_OPTS, + { "rebuild", G_FLAG_VERBOSE, NULL, G_NULL_OPTS, NULL, "[-v] name prov ..." }, - { "remove", G_FLAG_VERBOSE, NULL, G_NULL_OPTS, + { "remove", G_FLAG_VERBOSE, NULL, G_NULL_OPTS, NULL, "[-v] name prov ..." }, { "stop", G_FLAG_VERBOSE, NULL, @@ -116,7 +116,7 @@ struct g_command class_commands[] = { { 'f', "force", NULL, G_TYPE_BOOL }, G_OPT_SENTINEL }, - "[-fv] name ..." + NULL, "[-fv] name ..." }, G_CMD_SENTINEL }; diff --git a/sbin/geom/class/multipath/geom_multipath.c b/sbin/geom/class/multipath/geom_multipath.c index d729af778e3c..1bb3f32239a2 100644 --- a/sbin/geom/class/multipath/geom_multipath.c +++ b/sbin/geom/class/multipath/geom_multipath.c @@ -52,11 +52,11 @@ static void mp_clear(struct gctl_req *); struct g_command class_commands[] = { { "label", G_FLAG_VERBOSE | G_FLAG_LOADKLD, mp_main, G_NULL_OPTS, - "[-v] name prov ..." + NULL, "[-v] name prov ..." }, { "clear", G_FLAG_VERBOSE, mp_main, G_NULL_OPTS, - "[-v] prov ..." + NULL, "[-v] prov ..." }, G_CMD_SENTINEL }; diff --git a/sbin/geom/class/nop/geom_nop.c b/sbin/geom/class/nop/geom_nop.c index e33ee541802b..7306add3674b 100644 --- a/sbin/geom/class/nop/geom_nop.c +++ b/sbin/geom/class/nop/geom_nop.c @@ -56,8 +56,8 @@ struct g_command class_commands[] = { { 'w', "wfailprob", &wfailprob, G_TYPE_NUMBER }, G_OPT_SENTINEL }, - "[-v] [-e error] [-o offset] [-r rfailprob] [-s size] [-S secsize] " - "[-w wfailprob] dev ..." + NULL, "[-v] [-e error] [-o offset] [-r rfailprob] [-s size] " + "[-S secsize] [-w wfailprob] dev ..." }, { "configure", G_FLAG_VERBOSE, NULL, { @@ -66,16 +66,16 @@ struct g_command class_commands[] = { { 'w', "wfailprob", &wfailprob, G_TYPE_NUMBER }, G_OPT_SENTINEL }, - "[-v] [-e error] [-r rfailprob] [-w wfailprob] prov ..." + NULL, "[-v] [-e error] [-r rfailprob] [-w wfailprob] prov ..." }, { "destroy", G_FLAG_VERBOSE, NULL, { { 'f', "force", NULL, G_TYPE_BOOL }, G_OPT_SENTINEL }, - "[-fv] prov ..." + NULL, "[-fv] prov ..." }, - { "reset", G_FLAG_VERBOSE, NULL, G_NULL_OPTS, + { "reset", G_FLAG_VERBOSE, NULL, G_NULL_OPTS, NULL, "[-v] prov ..." }, G_CMD_SENTINEL diff --git a/sbin/geom/class/part/Makefile b/sbin/geom/class/part/Makefile new file mode 100644 index 000000000000..0588646f09b7 --- /dev/null +++ b/sbin/geom/class/part/Makefile @@ -0,0 +1,9 @@ +# $FreeBSD$ + +.PATH: ${.CURDIR}/../../misc + +CLASS= part + +WARNS?= 4 + +.include diff --git a/sbin/geom/class/part/geom_part.c b/sbin/geom/class/part/geom_part.c new file mode 100644 index 000000000000..ce9dfb39526d --- /dev/null +++ b/sbin/geom/class/part/geom_part.c @@ -0,0 +1,91 @@ +/*- + * Copyright (c) 2007 Marcel Moolenaar + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "core/geom.h" +#include "misc/subr.h" + +uint32_t lib_version = G_LIB_VERSION; +uint32_t version = 0; + +static char optional[] = ""; +static char flags[] = "C"; + +struct g_command class_commands[] = { + { "add", 0, NULL, { + { 'b', "start", NULL, G_TYPE_STRING }, + { 's', "size", NULL, G_TYPE_STRING }, + { 't', "type", NULL, G_TYPE_STRING }, + { 'i', "index", optional, G_TYPE_STRING }, + { 'l', "label", optional, G_TYPE_STRING }, + { 'f', "flags", flags, G_TYPE_STRING }, + G_OPT_SENTINEL }, + "geom", NULL, + }, + { "commit", 0, NULL, G_NULL_OPTS, "geom", NULL }, + { "create", 0, NULL, { + { 's', "scheme", NULL, G_TYPE_STRING }, + { 'n', "entries", optional, G_TYPE_STRING }, + { 'f', "flags", flags, G_TYPE_STRING }, + G_OPT_SENTINEL }, + "provider", NULL + }, + { "delete", 0, NULL, { + { 'i', "index", NULL, G_TYPE_STRING }, + { 'f', "flags", flags, G_TYPE_STRING }, + G_OPT_SENTINEL }, + "geom", NULL + }, + { "destroy", 0, NULL, { + { 'f', "flags", flags, G_TYPE_STRING }, + G_OPT_SENTINEL }, + "geom", NULL }, + { "modify", 0, NULL, { + { 'i', "index", NULL, G_TYPE_STRING }, + { 'l', "label", optional, G_TYPE_STRING }, + { 't', "type", optional, G_TYPE_STRING }, + { 'f', "flags", flags, G_TYPE_STRING }, + G_OPT_SENTINEL }, + "geom", NULL + }, + { "undo", 0, NULL, G_NULL_OPTS, "geom", NULL }, + G_CMD_SENTINEL +}; diff --git a/sbin/geom/class/part/gpart.8 b/sbin/geom/class/part/gpart.8 new file mode 100644 index 000000000000..f98aefa9a25e --- /dev/null +++ b/sbin/geom/class/part/gpart.8 @@ -0,0 +1,308 @@ +.\" Copyright (c) 2007 Marcel Moolenaar +.\" All rights reserved. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +.\" SUCH DAMAGE. +.\" +.\" $FreeBSD$ +.\" +.Dd May 15, 2007 +.Dt GPART 8 +.Os +.Sh NAME +.Nm gpart +.Nd "control utility for the disk partitioning GEOM class" +.Sh SYNOPSIS +To add support for the disk partitioning GEOM class, +place one or more of the following +lines in your kernel configuration file: +.Bd -ragged -offset indent +.Cd "options GEOM_PART_APM" +.Cd "options GEOM_PART_GPT" +.Ed +.Pp +The GEOM_PART_APM option adds support for the Apple Partition Map (APM) +found on Apple Macintosh computers, and the GEOM_PART_GPT option adds +support for the GUID Partition Table (GPT) found on Intel Itanium +computers and Intel-based Macintosh computers. +.Pp +Usage of the +.Xr gpart 8 +utility: +.Pp +.\" ==== ADD ==== +.Nm +.Cm add +.Fl b Ar start +.Fl s Ar size +.Fl t Ar type +.Op Fl i Ar index +.Op Fl l Ar label +.Op Fl f Ar flags +.Ar geom +.\" ==== COMMIT ==== +.Nm +.Cm commit +.Ar geom +.\" ==== CREATE ==== +.Nm +.Cm create +.Fl s Ar scheme +.Op Fl n Ar entries +.Op Fl f Ar flags +.Ar provider +.\" ==== DELETE ==== +.Nm +.Cm delete +.Fl i Ar index +.Op Fl f Ar flags +.Ar geom +.\" ==== DESTROY ==== +.Nm +.Cm destroy +.Op Fl f Ar flags +.Ar geom +.\" ==== MODIFY ==== +.Nm +.Cm modify +.Fl i Ar index +.Op Fl l Ar label +.Op Fl t Ar type +.Op Fl f Ar flags +.Ar geom +.\" ==== UNDO ==== +.Nm +.Cm undo +.Ar geom +.\" +.Sh DESCRIPTION +The +.Nm +utility is used to partition GEOM providers, normally disks. +The first argument of which is the action to be taken: +.Bl -tag -width ".Cm wwwwwww" +.\" ==== ADD ==== +.It Cm add +Add a new partition to the partitioning scheme given by +.Ar geom . +The partition begins on the logical block address given by the +.Fl b Ar start +option. +Its size is expressed in logical block numbers and given by the +.Fl s Ar size +option. +The type of the partition is given by the +.Fl t Ar type +option. +Partition types are discussed in the section entitled "Partition Types". +.Pp +Addition options include: +.Bl -tag -width ".Fl w Ar wwwwwww" +.It Fl i Ar index +The index in the partition table at which the new partition is to be +placed. The index determines the name of the device special file used +to represent the partition. +.It Fl l Ar label +The label attached to the partition. +This option is only valid when used on partitioning schemes that support +partition labels. +.It Fl f Ar flags +Additional operational flags. +See the section entitled "Operational flags" below for a discussion +about its use. +.El +.\" ==== COMMIT ==== +.It Cm commit +Commit any pending changes for geom +.Ar geom . +All actions are being committed by default and will not result in +pending changes. +Actions can be modified with the +.Fl f Ar flags +option so that they are not being committed by default. +As such, they become pending. +Pending changes are reflected by the geom and the +.Nm +utility, but they are not actually written to disk. +The +.Cm commit +action will write any and all pending changes to disk. +.\" ==== CREATE ==== +.It Cm create +Create a new partitioning scheme on a provider given by +.Ar provider . +The +.Fl s Ar scheme +option determines the scheme to use. +The kernel needs to have support for a particular scheme before +that scheme can be used to partition a disk. +.Pp +Addition options include: +.Bl -tag -width ".Fl w Ar wwwwwww" +.It Fl n Ar entries +The number of entries in the partition table. +Every partitioning scheme has a minimum and a maximum number of entries +and this option allows tables to be created with the number of entries +that lies anywhere between the minimum and the maximum. +Some schemes have a maximum equal to the minimum and some schemes have +a maximum large enough to be considered unlimited. +By default, partition tables are created with the minimum number of +entries. +.It Fl f Ar flags +Additional operational flags. +See the section entitled "Operational flags" below for a discussion +about its use. +.El +.\" ==== DELETE ==== +.It Cm delete +Delete a partition from geom +.Ar geom +and further identified by the +.Fl i Ar index +option. +The partition cannot be actively used by the kernel. +.Pp +Addition options include: +.Bl -tag -width ".Fl w Ar wwwwwww" +.It Fl f Ar flags +Additional operational flags. +See the section entitled "Operational flags" below for a discussion +about its use. +.El +.\" ==== DESTROY ==== +.It Cm destroy +Destroy the partitioning scheme as implemented by geom +.Ar geom . +.Pp +Addition options include: +.Bl -tag -width ".Fl w Ar wwwwwww" +.It Fl f Ar flags +Additional operational flags. +See the section entitled "Operational flags" below for a discussion +about its use. +.El +.\" ==== MODIFY ==== +.It Cm modify +Modify a partition from geom +.Ar geom +and further identified by the +.Fl i Ar index +option. +Only the the type and/or label of the partition can be modified. +To change the type of a partition, specify the new type with the +.Fl t Ar type +option. +To change the label of a partition, specify the new label with the +.Fl l Ar label +option. +Not all partitioning schemes support labels and it is invalid to +try to change a partition label in such cases. +.Pp +Addition options include: +.Bl -tag -width ".Fl w Ar wwwwwww" +.It Fl f Ar flags +Additional operational flags. +See the section entitled "Operational flags" below for a discussion +about its use. +.El +.\" ==== UNDO ==== +.It Cm undo +Revert any pending changes. +This action is the opposite of the +.Cm commit +action and can be used to undo any changes that have not been committed. +.El +.Sh PARTITION TYPES +The +.Nm +utility uses symbolic names for common partition types to avoid that the +user needs to know what the partitioning scheme in question is and what +the actual number or identification needs to be used for a particular +type. +the +.Nm +utility also allows the user to specify scheme-specific partition types +for partition types that don't have symbol names. +The symbolic names currently understood are: +.Bl -tag -width "wwwwwwwwwwwww" +.It efi +The system partition for computers that use the Extensible Firmware +Interface (EFI). +In such cases, the GPT partitioning scheme is being used and the +actual partition type for the system partition can also be specified as +"!c12a7328-f81f-11d2-ba4b-00a0c93ec93ab". +.It freebsd +A FreeBSD partition that uses the BSD disklabel to sub-divide the +partition into file systems. +This is a legacy partition type and should not be used for the APM +or GPT schemes. +The scheme-specific types are "!FreeBSD" for APM, and +"!516e7cb4-6ecf-11d6-8ff8-00022d09712b" for GPT. +.It freebsd-swap +A FreeBSD partition dedicated to swap space. +The scheme-specific types are "!FreeBSD-swap" for APM, and +"!516e7cb5-6ecf-11d6-8ff8-00022d09712b" for GPT. +.It freebsd-ufs +A FreeBSD partition that contains a UFS or UFS2 file system. +the scheme-specific types are "!FreeBSD-UFS" for APM, and +"!516e7cb6-6ecf-11d6-8ff8-00022d09712b" for GPT. +.It freebsd-vinum +A FreeBSD partition that contains a Vinum volume. +The scheme-specific types are "!FreeBSD-Vinum" for APM, and +"!516e7cb8-6ecf-11d6-8ff8-00022d09712b" for GPT. +.It mbr +A partition that is sub-partitioned by a master boot record (MBR). +This type is known as "!024dee41-33e7-11d3-9d69-0008c781f39f" by GPT. +.El +.Sh OPERATIONAL FLAGS +Actions other than the +.Cm commit +and +.Cm undo +actions take an optional +.Fl f Ar flags +option. +This option is used to specify action-specific operational flags. +By default, the +.Nm +utility defines the 'C' flag so that the action is immediately +committed. +The user can specify +.Fl f Ar x +to have the action result in a pending change that can later, with +other pending changes, be committed as a single compound change with +the +.Cm commit +action or reverted with the +.Cm undo +action. +.Sh EXIT STATUS +Exit status is 0 on success, and 1 if the command fails. +.Sh SEE ALSO +.Xr geom 4 , +.Xr geom 8 , +.Sh HISTORY +The +.Nm +utility appeared in +.Fx 7.0 . +.Sh AUTHORS +.An Marcel Moolenaar Aq marcel@FreeBSD.org diff --git a/sbin/geom/class/raid3/geom_raid3.c b/sbin/geom/class/raid3/geom_raid3.c index 1bb41cbde593..4a2dbe201ef2 100644 --- a/sbin/geom/class/raid3/geom_raid3.c +++ b/sbin/geom/class/raid3/geom_raid3.c @@ -51,7 +51,7 @@ static void raid3_dump(struct gctl_req *req); static void raid3_label(struct gctl_req *req); struct g_command class_commands[] = { - { "clear", G_FLAG_VERBOSE, raid3_main, G_NULL_OPTS, + { "clear", G_FLAG_VERBOSE, raid3_main, G_NULL_OPTS, NULL, "[-v] prov ..." }, { "configure", G_FLAG_VERBOSE, NULL, @@ -68,9 +68,9 @@ struct g_command class_commands[] = { { 'W', "noverify", NULL, G_TYPE_BOOL }, G_OPT_SENTINEL }, - "[-adfFhnrRvwW] name" + NULL, "[-adfFhnrRvwW] name" }, - { "dump", 0, raid3_main, G_NULL_OPTS, + { "dump", 0, raid3_main, G_NULL_OPTS, NULL, "prov ..." }, { "insert", G_FLAG_VERBOSE, NULL, @@ -79,7 +79,7 @@ struct g_command class_commands[] = { { 'n', "number", NULL, G_TYPE_NUMBER }, G_OPT_SENTINEL }, - "[-hv] <-n number> name prov" + NULL, "[-hv] <-n number> name prov" }, { "label", G_FLAG_VERBOSE, raid3_main, { @@ -90,9 +90,9 @@ struct g_command class_commands[] = { { 'w', "verify", NULL, G_TYPE_BOOL }, G_OPT_SENTINEL }, - "[-hFnrvw] name prov prov prov ..." + NULL, "[-hFnrvw] name prov prov prov ..." }, - { "rebuild", G_FLAG_VERBOSE, NULL, G_NULL_OPTS, + { "rebuild", G_FLAG_VERBOSE, NULL, G_NULL_OPTS, NULL, "[-v] name prov" }, { "remove", G_FLAG_VERBOSE, NULL, @@ -100,14 +100,14 @@ struct g_command class_commands[] = { { 'n', "number", NULL, G_TYPE_NUMBER }, G_OPT_SENTINEL }, - "[-v] <-n number> name" + NULL, "[-v] <-n number> name" }, { "stop", G_FLAG_VERBOSE, NULL, { { 'f', "force", NULL, G_TYPE_BOOL }, G_OPT_SENTINEL }, - "[-fv] name ..." + NULL, "[-fv] name ..." }, G_CMD_SENTINEL }; diff --git a/sbin/geom/class/shsec/geom_shsec.c b/sbin/geom/class/shsec/geom_shsec.c index 75791de6ac0f..8af47ee62d1f 100644 --- a/sbin/geom/class/shsec/geom_shsec.c +++ b/sbin/geom/class/shsec/geom_shsec.c @@ -52,10 +52,10 @@ static void shsec_dump(struct gctl_req *req); static void shsec_label(struct gctl_req *req); struct g_command class_commands[] = { - { "clear", G_FLAG_VERBOSE, shsec_main, G_NULL_OPTS, + { "clear", G_FLAG_VERBOSE, shsec_main, G_NULL_OPTS, NULL, "[-v] prov ..." }, - { "dump", 0, shsec_main, G_NULL_OPTS, + { "dump", 0, shsec_main, G_NULL_OPTS, NULL, "prov ..." }, { "label", G_FLAG_VERBOSE | G_FLAG_LOADKLD, shsec_main, @@ -63,14 +63,14 @@ struct g_command class_commands[] = { { 'h', "hardcode", NULL, G_TYPE_BOOL }, G_OPT_SENTINEL }, - "[-hv] name prov prov ..." + NULL, "[-hv] name prov prov ..." }, { "stop", G_FLAG_VERBOSE, NULL, { { 'f', "force", NULL, G_TYPE_BOOL }, G_OPT_SENTINEL }, - "[-fv] name ..." + NULL, "[-fv] name ..." }, G_CMD_SENTINEL }; diff --git a/sbin/geom/class/stripe/geom_stripe.c b/sbin/geom/class/stripe/geom_stripe.c index 1e3364364a19..704e00078872 100644 --- a/sbin/geom/class/stripe/geom_stripe.c +++ b/sbin/geom/class/stripe/geom_stripe.c @@ -54,7 +54,7 @@ static void stripe_dump(struct gctl_req *req); static void stripe_label(struct gctl_req *req); struct g_command class_commands[] = { - { "clear", G_FLAG_VERBOSE, stripe_main, G_NULL_OPTS, + { "clear", G_FLAG_VERBOSE, stripe_main, G_NULL_OPTS, NULL, "[-v] prov ..." }, { "create", G_FLAG_VERBOSE | G_FLAG_LOADKLD, NULL, @@ -62,16 +62,16 @@ struct g_command class_commands[] = { { 's', "stripesize", &default_stripesize, G_TYPE_NUMBER }, G_OPT_SENTINEL }, - "[-hv] [-s stripesize] name prov prov ..." + NULL, "[-hv] [-s stripesize] name prov prov ..." }, { "destroy", G_FLAG_VERBOSE, NULL, { { 'f', "force", NULL, G_TYPE_BOOL }, G_OPT_SENTINEL }, - "[-fv] name ..." + NULL, "[-fv] name ..." }, - { "dump", 0, stripe_main, G_NULL_OPTS, + { "dump", 0, stripe_main, G_NULL_OPTS, NULL, "dump prov ..." }, { "label", G_FLAG_VERBOSE | G_FLAG_LOADKLD, stripe_main, @@ -80,14 +80,14 @@ struct g_command class_commands[] = { { 's', "stripesize", &default_stripesize, G_TYPE_NUMBER }, G_OPT_SENTINEL }, - "[-hv] [-s stripesize] name prov prov ..." + NULL, "[-hv] [-s stripesize] name prov prov ..." }, { "stop", G_FLAG_VERBOSE, NULL, { { 'f', "force", NULL, G_TYPE_BOOL }, G_OPT_SENTINEL }, - "[-fv] name ..." + NULL, "[-fv] name ..." }, G_CMD_SENTINEL }; diff --git a/sbin/geom/core/geom.c b/sbin/geom/core/geom.c index d375ba337cc9..7547f502b0b4 100644 --- a/sbin/geom/core/geom.c +++ b/sbin/geom/core/geom.c @@ -69,8 +69,8 @@ static void std_load(struct gctl_req *req, unsigned flags); static void std_unload(struct gctl_req *req, unsigned flags); struct g_command std_commands[] = { - { "help", 0, std_help, G_NULL_OPTS, NULL }, - { "list", 0, std_list, G_NULL_OPTS, + { "help", 0, std_help, G_NULL_OPTS, NULL, NULL }, + { "list", 0, std_list, G_NULL_OPTS, NULL, "[name ...]" }, { "status", 0, std_status, @@ -78,10 +78,11 @@ struct g_command std_commands[] = { { 's', "script", NULL, G_TYPE_BOOL }, G_OPT_SENTINEL }, - "[-s] [name ...]" + NULL, "[-s] [name ...]" }, - { "load", G_FLAG_VERBOSE | G_FLAG_LOADKLD, std_load, G_NULL_OPTS, NULL }, - { "unload", G_FLAG_VERBOSE, std_unload, G_NULL_OPTS, NULL }, + { "load", G_FLAG_VERBOSE | G_FLAG_LOADKLD, std_load, G_NULL_OPTS, + NULL, NULL }, + { "unload", G_FLAG_VERBOSE, std_unload, G_NULL_OPTS, NULL, NULL }, G_CMD_SENTINEL }; @@ -112,6 +113,8 @@ usage_command(struct g_command *cmd, const char *prefix) if (opt->go_val != NULL || G_OPT_TYPE(opt) == G_TYPE_BOOL) fprintf(stderr, "]"); } + if (cmd->gc_argname) + fprintf(stderr, " %s", cmd->gc_argname); fprintf(stderr, "\n"); } @@ -327,23 +330,31 @@ parse_arguments(struct g_command *cmd, struct gctl_req *req, int *argc, gctl_ro_param(req, opt->go_name, sizeof(intmax_t), opt->go_val); } else if (G_OPT_TYPE(opt) == G_TYPE_STRING) { - gctl_ro_param(req, opt->go_name, -1, - opt->go_val); + if (*(char *)opt->go_val != '\0') + gctl_ro_param(req, opt->go_name, + -1, opt->go_val); } else { assert(!"Invalid type"); } } } } - /* - * Add rest of given arguments. - */ - gctl_ro_param(req, "nargs", sizeof(int), argc); - for (i = 0; i < (unsigned)*argc; i++) { - char argname[16]; - snprintf(argname, sizeof(argname), "arg%u", i); - gctl_ro_param(req, argname, -1, (*argv)[i]); + if (cmd->gc_argname == NULL) { + /* + * Add rest of given arguments. + */ + gctl_ro_param(req, "nargs", sizeof(int), argc); + for (i = 0; i < (unsigned)*argc; i++) { + char argname[16]; + + snprintf(argname, sizeof(argname), "arg%u", i); + gctl_ro_param(req, argname, -1, (*argv)[i]); + } + } else { + if (*argc != 1) + usage(); + gctl_ro_param(req, cmd->gc_argname, -1, (*argv)[0]); } } diff --git a/sbin/geom/core/geom.h b/sbin/geom/core/geom.h index 5368b56bdf26..ecca7b63ff4e 100644 --- a/sbin/geom/core/geom.h +++ b/sbin/geom/core/geom.h @@ -48,7 +48,7 @@ #define G_OPT_SENTINEL { '\0', NULL, NULL, G_TYPE_NONE } #define G_NULL_OPTS { G_OPT_SENTINEL } -#define G_CMD_SENTINEL { NULL, 0, NULL, G_NULL_OPTS, NULL } +#define G_CMD_SENTINEL { NULL, 0, NULL, G_NULL_OPTS, NULL, NULL } struct g_option { char go_char; @@ -62,6 +62,7 @@ struct g_command { unsigned gc_flags; void (*gc_func)(struct gctl_req *, unsigned); struct g_option gc_options[G_OPT_MAX]; + const char *gc_argname; const char *gc_usage; }; #endif /* !_GEOM_H_ */