MFp4: Add 'dump' command to gconcat(8), glabel(8) and gstripe(8) which allow

to dump metadata from given components.
This commit is contained in:
Pawel Jakub Dawidek 2004-07-18 08:00:30 +00:00
parent 613e383e81
commit cdf961ac2a
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=132344
6 changed files with 181 additions and 3 deletions

View File

@ -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

View File

@ -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] <name> <dev1> <dev2> [dev3 [...]]\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 @@ 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");
}
}

View File

@ -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");
}
}

View File

@ -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

View File

@ -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] <name> <dev1> <dev2> [dev3 [...]]\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
@ -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");
}
}

View File

@ -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