summaryrefslogtreecommitdiffstats
path: root/sbin/geom/class/label
diff options
context:
space:
mode:
authorpjd <pjd@FreeBSD.org>2004-07-18 08:00:30 +0000
committerpjd <pjd@FreeBSD.org>2004-07-18 08:00:30 +0000
commitdc0d79acb9ae46349d52709494439489723bcf99 (patch)
tree56759b660cfd0721069bfd93f9afb21b36c16e60 /sbin/geom/class/label
parent423139e3683de5f3751e84c86119b44eaa4acbf9 (diff)
downloadFreeBSD-src-dc0d79acb9ae46349d52709494439489723bcf99.zip
FreeBSD-src-dc0d79acb9ae46349d52709494439489723bcf99.tar.gz
MFp4: Add 'dump' command to gconcat(8), glabel(8) and gstripe(8) which allow
to dump metadata from given components.
Diffstat (limited to 'sbin/geom/class/label')
-rw-r--r--sbin/geom/class/label/geom_label.c53
-rw-r--r--sbin/geom/class/label/glabel.86
2 files changed, 58 insertions, 1 deletions
diff --git a/sbin/geom/class/label/geom_label.c b/sbin/geom/class/label/geom_label.c
index edb0d7e..1c301c3 100644
--- a/sbin/geom/class/label/geom_label.c
+++ b/sbin/geom/class/label/geom_label.c
@@ -45,8 +45,9 @@ uint32_t lib_version = G_LIB_VERSION;
uint32_t version = G_LABEL_VERSION;
static void label_main(struct gctl_req *req, unsigned flags);
-static void label_label(struct gctl_req *req);
static void label_clear(struct gctl_req *req);
+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 },
@@ -57,6 +58,7 @@ struct g_command class_commands[] = {
G_OPT_SENTINEL
}
},
+ { "dump", 0, label_main, G_NULL_OPTS },
{ "label", G_FLAG_VERBOSE | G_FLAG_LOADKLD, label_main, G_NULL_OPTS },
{ "stop", G_FLAG_VERBOSE, NULL,
{
@@ -80,6 +82,7 @@ usage(const char *name)
fprintf(stderr, " %s label [-v] <name> <dev>\n", name);
fprintf(stderr, " %s stop [-fv] <name> [name2 [...]]\n", name);
fprintf(stderr, " %s clear [-v] <dev1> [dev2 [...]]\n", name);
+ fprintf(stderr, " %s dump <dev1> [dev2 [...]]\n", name);
}
static void
@@ -99,6 +102,8 @@ label_main(struct gctl_req *req, unsigned flags)
label_label(req);
else if (strcmp(name, "clear") == 0)
label_clear(req);
+ else if (strcmp(name, "dump") == 0)
+ label_dump(req);
else
gctl_error(req, "Unknown command: %s.", name);
}
@@ -192,3 +197,49 @@ label_clear(struct gctl_req *req)
printf("Metadata cleared on %s.\n", name);
}
}
+
+static void
+label_metadata_dump(const struct g_label_metadata *md)
+{
+
+ printf(" Magic string: %s\n", md->md_magic);
+ printf("Metadata version: %u\n", (u_int)md->md_version);
+ printf(" Label: %s\n", md->md_label);
+}
+
+static void
+label_dump(struct gctl_req *req)
+{
+ struct g_label_metadata md, tmpmd;
+ const char *name;
+ char param[16];
+ int *nargs, error, i;
+
+ nargs = gctl_get_paraml(req, "nargs", sizeof(*nargs));
+ if (nargs == NULL) {
+ gctl_error(req, "No '%s' argument.", "nargs");
+ return;
+ }
+ if (*nargs < 1) {
+ gctl_error(req, "Too few arguments.");
+ return;
+ }
+
+ for (i = 0; i < *nargs; i++) {
+ snprintf(param, sizeof(param), "arg%u", i);
+ name = gctl_get_asciiparam(req, param);
+
+ error = g_metadata_read(name, (u_char *)&tmpmd, sizeof(tmpmd),
+ G_LABEL_MAGIC);
+ if (error != 0) {
+ fprintf(stderr, "Can't read metadata from %s: %s.\n",
+ name, strerror(error));
+ gctl_error(req, "Not fully done.");
+ continue;
+ }
+ label_metadata_decode((u_char *)&tmpmd, &md);
+ printf("Metadata on %s:\n", name);
+ label_metadata_dump(&md);
+ printf("\n");
+ }
+}
diff --git a/sbin/geom/class/label/glabel.8 b/sbin/geom/class/label/glabel.8
index cbf7615..15ccdb0 100644
--- a/sbin/geom/class/label/glabel.8
+++ b/sbin/geom/class/label/glabel.8
@@ -57,6 +57,10 @@
.Ar dev
.Op Ar dev Op Ar ...
.Nm
+.Cm dump
+.Ar dev
+.Op Ar dev Op Ar ...
+.Nm
.Cm list
.Op Ar prov Op Ar ...
.Nm
@@ -141,6 +145,8 @@ Same as
.Cm stop .
.It Cm clear
Clear metadata on the given devices.
+.It Cm dump
+Dump metadata stored on the given devices.
.It Cm list
List all currently configured devices, or list the given devices.
.It Cm load
OpenPOWER on IntegriCloud