diff options
author | pjd <pjd@FreeBSD.org> | 2004-07-18 08:00:30 +0000 |
---|---|---|
committer | pjd <pjd@FreeBSD.org> | 2004-07-18 08:00:30 +0000 |
commit | dc0d79acb9ae46349d52709494439489723bcf99 (patch) | |
tree | 56759b660cfd0721069bfd93f9afb21b36c16e60 /sbin/geom/class/label | |
parent | 423139e3683de5f3751e84c86119b44eaa4acbf9 (diff) | |
download | FreeBSD-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.c | 53 | ||||
-rw-r--r-- | sbin/geom/class/label/glabel.8 | 6 |
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 |