[Cluster-devel] [PATCH 5/7] gfs2l: Add options to print block types and fields

Andrew Price anprice at redhat.com
Mon May 20 11:37:14 UTC 2013


This adds a -T option which prints out the list of possible meta header
types to be used in gfs2l scripts. It also adds -F <type> which prints
a list of fields in a block type given by <type>. The fields are
prefixed by their offset in the structure.

Signed-off-by: Andrew Price <anprice at redhat.com>
---
 gfs2/libgfs2/gfs2l.c | 42 +++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 41 insertions(+), 1 deletion(-)

diff --git a/gfs2/libgfs2/gfs2l.c b/gfs2/libgfs2/gfs2l.c
index 50ddb82..9fc647a 100644
--- a/gfs2/libgfs2/gfs2l.c
+++ b/gfs2/libgfs2/gfs2l.c
@@ -10,6 +10,8 @@ static void usage(const char *cmd)
 	printf("Available options:\n");
 	printf("  -h                Print this help message and exit\n");
 	printf("  -f <script_path>  Path to script file or '-' for stdin\n");
+	printf("  -T                Print a list of gfs2 structure types and exit\n");
+	printf("  -F <type>         Print a list of fields belonging to a type and exit\n");
 }
 
 struct cmdopts {
@@ -18,10 +20,42 @@ struct cmdopts {
 	unsigned help:1;
 };
 
+static int metastrcmp(const void *a, const void *b)
+{
+	const struct lgfs2_metadata *m1 = *(struct lgfs2_metadata **)a;
+	const struct lgfs2_metadata *m2 = *(struct lgfs2_metadata **)b;
+	return strcmp(m1->name, m2->name);
+}
+
+static void print_structs(void)
+{
+	const struct lgfs2_metadata *mlist[lgfs2_metadata_size];
+	int i;
+	for (i = 0; i < lgfs2_metadata_size; i++)
+		mlist[i] = &lgfs2_metadata[i];
+
+	qsort(mlist, lgfs2_metadata_size, sizeof(struct lgfs2_metadata *), metastrcmp);
+	for (i = 0; i < lgfs2_metadata_size; i++)
+		if (mlist[i]->mh_type != GFS2_METATYPE_NONE)
+			printf("%s\n", mlist[i]->name);
+}
+
+static void print_fields(const char *name)
+{
+	const struct lgfs2_metadata *m = lgfs2_find_mtype_name(name, LGFS2_MD_GFS1|LGFS2_MD_GFS2);
+	if (m != NULL) {
+		const struct lgfs2_metafield *fields = m->fields;
+		const unsigned nfields = m->nfields;
+		int i;
+		for (i = 0; i < nfields; i++)
+			printf("0x%.4x %s\n", fields[i].offset, fields[i].name);
+	}
+}
+
 static int getopts(int argc, char *argv[], struct cmdopts *opts)
 {
 	int opt;
-	while ((opt = getopt(argc, argv, "f:h")) != -1) {
+	while ((opt = getopt(argc, argv, "F:f:hT")) != -1) {
 		switch (opt) {
 		case 'f':
 			if (!strcmp("-", optarg)) {
@@ -34,6 +68,12 @@ static int getopts(int argc, char *argv[], struct cmdopts *opts)
 				}
 			}
 			break;
+		case 'T':
+			print_structs();
+			exit(0);
+		case 'F':
+			print_fields(optarg);
+			exit(0);
 		case 'h':
 			opts->help = 1;
 			return 0;
-- 
1.8.1.4




More information about the Cluster-devel mailing list