From cdf961ac2a21c505598d8254b088255ffb59ac7d Mon Sep 17 00:00:00 2001 From: Pawel Jakub Dawidek Date: Sun, 18 Jul 2004 08:00:30 +0000 Subject: [PATCH] MFp4: Add 'dump' command to gconcat(8), glabel(8) and gstripe(8) which allow to dump metadata from given components. --- sbin/geom/class/concat/gconcat.8 | 6 +++ sbin/geom/class/concat/geom_concat.c | 56 ++++++++++++++++++++++++++- sbin/geom/class/label/geom_label.c | 53 +++++++++++++++++++++++++- sbin/geom/class/label/glabel.8 | 6 +++ sbin/geom/class/stripe/geom_stripe.c | 57 +++++++++++++++++++++++++++- sbin/geom/class/stripe/gstripe.8 | 6 +++ 6 files changed, 181 insertions(+), 3 deletions(-) diff --git a/sbin/geom/class/concat/gconcat.8 b/sbin/geom/class/concat/gconcat.8 index e47cedf96870..f0e4d7555def 100644 --- a/sbin/geom/class/concat/gconcat.8 +++ b/sbin/geom/class/concat/gconcat.8 @@ -61,6 +61,10 @@ .Ar dev1 .Op Ar dev2 Op Ar ... .Nm +.Cm dump +.Ar dev1 +.Op Ar dev2 Op Ar ... +.Nm .Cm list .Op Ar prov Op Ar ... .Nm @@ -118,6 +122,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 or the given currently configured devices. .It Cm load diff --git a/sbin/geom/class/concat/geom_concat.c b/sbin/geom/class/concat/geom_concat.c index 3042b5f4a46b..49e6101916f4 100644 --- a/sbin/geom/class/concat/geom_concat.c +++ b/sbin/geom/class/concat/geom_concat.c @@ -45,8 +45,9 @@ uint32_t lib_version = G_LIB_VERSION; uint32_t version = G_CONCAT_VERSION; static void concat_main(struct gctl_req *req, unsigned flags); -static void concat_label(struct gctl_req *req); static void concat_clear(struct gctl_req *req); +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 }, @@ -57,6 +58,7 @@ struct g_command class_commands[] = { G_OPT_SENTINEL } }, + { "dump", 0, concat_main, G_NULL_OPTS }, { "label", G_FLAG_VERBOSE | G_FLAG_LOADKLD, concat_main, G_NULL_OPTS }, { "stop", G_FLAG_VERBOSE, NULL, { @@ -80,6 +82,7 @@ usage(const char *name) fprintf(stderr, " %s label [-v] [dev3 [...]]\n", name); fprintf(stderr, " %s stop [-fv] [name2 [...]]\n", name); fprintf(stderr, " %s clear [-v] [dev2 [...]]\n", name); + fprintf(stderr, " %s dump [dev2 [...]]\n", name); } static void @@ -99,6 +102,8 @@ concat_main(struct gctl_req *req, unsigned flags) concat_label(req); else if (strcmp(name, "clear") == 0) concat_clear(req); + else if (strcmp(name, "dump") == 0) + concat_dump(req); else gctl_error(req, "Unknown command: %s.", name); } @@ -203,3 +208,52 @@ concat_clear(struct gctl_req *req) printf("Metadata cleared on %s.\n", name); } } + +static void +concat_metadata_dump(const struct g_concat_metadata *md) +{ + + printf(" Magic string: %s\n", md->md_magic); + printf(" Metadata version: %u\n", (u_int)md->md_version); + printf(" Device name: %s\n", md->md_name); + printf(" Device ID: %u\n", (u_int)md->md_id); + printf(" Disk number: %u\n", (u_int)md->md_no); + printf("Total number of disks: %u\n", (u_int)md->md_all); +} + +static void +concat_dump(struct gctl_req *req) +{ + struct g_concat_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_CONCAT_MAGIC); + if (error != 0) { + fprintf(stderr, "Can't read metadata from %s: %s.\n", + name, strerror(error)); + gctl_error(req, "Not fully done."); + continue; + } + concat_metadata_decode((u_char *)&tmpmd, &md); + printf("Metadata on %s:\n", name); + concat_metadata_dump(&md); + printf("\n"); + } +} diff --git a/sbin/geom/class/label/geom_label.c b/sbin/geom/class/label/geom_label.c index edb0d7e4ef9e..1c301c3bdb5d 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] \n", name); fprintf(stderr, " %s stop [-fv] [name2 [...]]\n", name); fprintf(stderr, " %s clear [-v] [dev2 [...]]\n", name); + fprintf(stderr, " %s dump [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 cbf7615e2d4f..15ccdb0def6e 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 diff --git a/sbin/geom/class/stripe/geom_stripe.c b/sbin/geom/class/stripe/geom_stripe.c index cde761380893..5b6a9a353a78 100644 --- a/sbin/geom/class/stripe/geom_stripe.c +++ b/sbin/geom/class/stripe/geom_stripe.c @@ -48,8 +48,9 @@ uint32_t version = G_STRIPE_VERSION; static intmax_t stripesize = 4096; static void stripe_main(struct gctl_req *req, unsigned flags); -static void stripe_label(struct gctl_req *req); static void stripe_clear(struct gctl_req *req); +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 }, @@ -65,6 +66,7 @@ struct g_command class_commands[] = { G_OPT_SENTINEL } }, + { "dump", 0, stripe_main, G_NULL_OPTS }, { "label", G_FLAG_VERBOSE | G_FLAG_LOADKLD, stripe_main, { { 's', "stripesize", &stripesize, G_TYPE_NUMBER }, @@ -92,6 +94,7 @@ usage(const char *name) fprintf(stderr, " %s label [-v] [-s stripesize] [dev3 [...]]\n", name); fprintf(stderr, " %s stop [-fv] [name2 [...]]\n", name); fprintf(stderr, " %s clear [-v] [dev2 [...]]\n", name); + fprintf(stderr, " %s dump [dev2 [...]]\n", name); } static void @@ -111,6 +114,8 @@ stripe_main(struct gctl_req *req, unsigned flags) stripe_label(req); else if (strcmp(name, "clear") == 0) stripe_clear(req); + else if (strcmp(name, "dump") == 0) + stripe_dump(req); else gctl_error(req, "Unknown command: %s.", name); } @@ -222,3 +227,53 @@ stripe_clear(struct gctl_req *req) printf("Metadata cleared on %s.\n", name); } } + +static void +stripe_metadata_dump(const struct g_stripe_metadata *md) +{ + + printf(" Magic string: %s\n", md->md_magic); + printf(" Metadata version: %u\n", (u_int)md->md_version); + printf(" Device name: %s\n", md->md_name); + printf(" Device ID: %u\n", (u_int)md->md_id); + printf(" Disk number: %u\n", (u_int)md->md_no); + printf("Total number of disks: %u\n", (u_int)md->md_all); + printf(" Stripe size: %u\n", (u_int)md->md_stripesize); +} + +static void +stripe_dump(struct gctl_req *req) +{ + struct g_stripe_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_STRIPE_MAGIC); + if (error != 0) { + fprintf(stderr, "Can't read metadata from %s: %s.\n", + name, strerror(error)); + gctl_error(req, "Not fully done."); + continue; + } + stripe_metadata_decode((u_char *)&tmpmd, &md); + printf("Metadata on %s:\n", name); + stripe_metadata_dump(&md); + printf("\n"); + } +} diff --git a/sbin/geom/class/stripe/gstripe.8 b/sbin/geom/class/stripe/gstripe.8 index 327cd9a1e893..59b0709afbf3 100644 --- a/sbin/geom/class/stripe/gstripe.8 +++ b/sbin/geom/class/stripe/gstripe.8 @@ -63,6 +63,10 @@ .Ar dev1 .Op Ar dev2 Op Ar ... .Nm +.Cm dump +.Ar dev1 +.Op Ar dev2 Op Ar ... +.Nm .Cm list .Op Ar prov Op Ar ... .Nm @@ -120,6 +124,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 or the given currently configured devices. .It Cm load