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:
parent
613e383e81
commit
cdf961ac2a
@ -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
|
||||
|
@ -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");
|
||||
}
|
||||
}
|
||||
|
@ -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");
|
||||
}
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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");
|
||||
}
|
||||
}
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user