[DRBD-cvs] r1782 - in trunk: . user
www-data
www-data at garcon.linbit.com
Thu Apr 21 12:16:24 CEST 2005
Author: phil
Date: 2005-04-21 12:16:23 +0200 (Thu, 21 Apr 2005)
New Revision: 1782
Modified:
trunk/ROADMAP
trunk/user/drbd_endian.h
trunk/user/drbdmeta.c
Log:
Implemented set-gi in drbdmeta
Modified: trunk/ROADMAP
===================================================================
--- trunk/ROADMAP 2005-04-06 09:02:06 UTC (rev 1781)
+++ trunk/ROADMAP 2005-04-21 10:16:23 UTC (rev 1782)
@@ -411,7 +411,7 @@
When the cluster is in Connected state, then the bitmpat gen-UUID
is set to 0 (Since the Bitmap is empty). When we create a new current
- gen-UUID while we are disconencted the (old) current gets backuped
+ gen-UUID while we are disconencted the (old) current gets backed-up
to the bitmap gen-UUID. (This allowes us to identify the base of
of the bitmap later)
Modified: trunk/user/drbd_endian.h
===================================================================
--- trunk/user/drbd_endian.h 2005-04-06 09:02:06 UTC (rev 1781)
+++ trunk/user/drbd_endian.h 2005-04-21 10:16:23 UTC (rev 1782)
@@ -162,8 +162,19 @@
# define U32 "%u"
# define U64 "%lu"
#else
-# error "sorry, weird endianness on this box"
+# error "sorry, unsupported word length on this box"
#endif
+
+
+#if BITS_PER_LONG == 32
+# define strto_u64 strtoull
+#elif BITS_PER_LONG == 64
+# define strto_u64 strtoul
+#else
+# error "sorry, unsupported word length on this box"
#endif
+
+#endif
+
Modified: trunk/user/drbdmeta.c
===================================================================
--- trunk/user/drbdmeta.c 2005-04-06 09:02:06 UTC (rev 1781)
+++ trunk/user/drbdmeta.c 2005-04-21 10:16:23 UTC (rev 1782)
@@ -443,8 +443,9 @@
int (*md_initialize) (struct format *);
int (*md_disk_to_cpu) (struct format *);
int (*md_cpu_to_disk) (struct format *);
- void (*get_gi) (struct format *);
- void (*show_gi) (struct format *);
+ void (*get_gi) (struct md_cpu *md);
+ void (*show_gi) (struct md_cpu *md);
+ void (*set_gi) (struct md_cpu *md, char **argv, int argc);
};
/*
@@ -458,32 +459,14 @@
Drbd_Unknown,
};
-/*
- * Some glue
- */
+/* pre declarations */
+void m_get_gc(struct md_cpu *md);
+void m_show_gc(struct md_cpu *md);
+void m_set_gc(struct md_cpu *md, char **argv, int argc);
+void m_get_uuid(struct md_cpu *md);
+void m_show_uuid(struct md_cpu *md);
+void m_set_uuid(struct md_cpu *md, char **argv, int argc);
-void m_get_gc(struct format *cfg)
-{
- dt_print_gc(cfg->md.gc);
-}
-
-void m_show_gc(struct format *cfg)
-{
- dt_pretty_print_gc(cfg->md.gc);
-}
-
-void m_get_uuid(struct format *cfg)
-{
- dt_print_uuids(cfg->md.uuid,cfg->md.flags);
-}
-
-void m_show_uuid(struct format *cfg)
-{
- dt_pretty_print_uuids(cfg->md.uuid,cfg->md.flags);
-}
-
-
-/* pre declarations */
int v06_md_close(struct format *cfg);
int v06_md_cpu_to_disk(struct format *cfg);
int v06_md_disk_to_cpu(struct format *cfg);
@@ -515,6 +498,7 @@
.md_cpu_to_disk = v06_md_cpu_to_disk,
.get_gi = m_get_gc,
.show_gi = m_show_gc,
+ .set_gi = m_set_gc,
},
[Drbd_07] = {
.name = "v07",
@@ -527,6 +511,7 @@
.md_cpu_to_disk = v07_md_cpu_to_disk,
.get_gi = m_get_gc,
.show_gi = m_show_gc,
+ .set_gi = m_set_gc,
},
[Drbd_08] = {
.name = "v08",
@@ -539,6 +524,7 @@
.md_cpu_to_disk = v08_md_cpu_to_disk,
.get_gi = m_get_uuid,
.show_gi = m_show_uuid,
+ .set_gi = m_set_uuid,
},
};
@@ -554,24 +540,24 @@
};
/* pre declarations */
-int meta_get_gc(struct format *cfg, char **argv, int argc);
-int meta_show_gc(struct format *cfg, char **argv, int argc);
+int meta_get_gi(struct format *cfg, char **argv, int argc);
+int meta_show_gi(struct format *cfg, char **argv, int argc);
int meta_dump_md(struct format *cfg, char **argv, int argc);
int meta_create_md(struct format *cfg, char **argv, int argc);
-int meta_set_gc(struct format *cfg, char **argv, int argc);
-int meta_outdate_gc(struct format *cfg, char **argv, int argc);
+int meta_set_gi(struct format *cfg, char **argv, int argc);
+int meta_outdate(struct format *cfg, char **argv, int argc);
int meta_set_uuid(struct format *cfg, char **argv, int argc);
struct meta_cmd cmds[] = {
- {"get-gi", 0, meta_get_gc, 1},
- {"show-gi", 0, meta_show_gc, 1},
+ {"get-gi", 0, meta_get_gi, 1},
+ {"show-gi", 0, meta_show_gi, 1},
{"dump-md", 0, meta_dump_md, 1},
{"create-md", 0, meta_create_md, 1},
/* FIXME convert still missing.
* implicit convert from v07 to v08 by create-md
* see comments there */
- {"outdate", 0, meta_outdate_gc, 1},
- {"set-gi", ":::VAL:VAL:...", meta_set_gc, 0},
+ {"outdate", 0, meta_outdate, 1},
+ {"set-gi", ":::VAL:VAL:...", meta_set_gi, 0},
};
/*
@@ -752,6 +738,144 @@
return 0;
}
+void m_get_gc(struct md_cpu *md)
+{
+ dt_print_gc(md->gc);
+}
+
+void m_show_gc(struct md_cpu *md)
+{
+ dt_pretty_print_gc(md->gc);
+}
+
+void m_get_uuid(struct md_cpu *md)
+{
+ dt_print_uuids(md->uuid,md->flags);
+}
+
+void m_show_uuid(struct md_cpu *md)
+{
+ dt_pretty_print_uuids(md->uuid,md->flags);
+}
+
+int m_strsep_u32(char **s, u32 *val)
+{
+ char *t, *e;
+ u32 v;
+
+ if ((t = strsep(s, ":"))) {
+ if (strlen(t)) {
+ e = t;
+ v = strtol(t, &e, 0);
+ if (*e != 0) {
+ fprintf(stderr, "'%s' is not a number.\n", *s);
+ exit(10);
+ }
+ if (v < 0) {
+ fprintf(stderr, "'%s' is negative.\n", *s);
+ exit(10);
+ }
+ if (v > 0xFFffFFff) {
+ fprintf(stderr,
+ "'%s' is out of range (max 0xFFffFFff).\n",
+ *s);
+ exit(10);
+ }
+ *val = v;
+ }
+ return 1;
+ }
+ return 0;
+}
+
+int m_strsep_u64(char **s, u64 *val)
+{
+ char *t, *e;
+ u64 v;
+
+ if ((t = strsep(s, ":"))) {
+ if (strlen(t)) {
+ e = t;
+ v = strto_u64(t, &e, 16);
+ if (*e != 0) {
+ fprintf(stderr, "'%s' is not a number.\n", *s);
+ exit(10);
+ }
+ if (v < 0) {
+ fprintf(stderr, "'%s' is negative.\n", *s);
+ exit(10);
+ }
+ *val = v;
+ }
+ return 1;
+ }
+ return 0;
+}
+
+int m_strsep_bit(char **s, int *val, int mask)
+{
+ int d;
+ int rv;
+
+ d = *val & mask;
+
+ rv = m_strsep_u32(s, &d);
+
+ if (d > 1) {
+ fprintf(stderr, "'%d' is not 0 or 1.\n", d);
+ exit(10);
+ }
+
+ if (d)
+ *val |= mask;
+ else
+ *val &= ~mask;
+
+ return rv;
+}
+
+void m_set_gc(struct md_cpu *md, char **argv, int argc)
+{
+ char **str;
+
+ str = &argv[0];
+
+ do {
+ if (!m_strsep_bit(str, &md->gc[Flags], MDF_Consistent)) break;
+ if (!m_strsep_bit(str, &md->gc[Flags], MDF_WasUpToDate)) break;
+ if (!m_strsep_u32(str, &md->gc[HumanCnt])) break;
+ if (!m_strsep_u32(str, &md->gc[TimeoutCnt])) break;
+ if (!m_strsep_u32(str, &md->gc[ConnectedCnt])) break;
+ if (!m_strsep_u32(str, &md->gc[ArbitraryCnt])) break;
+ if (!m_strsep_bit(str, &md->gc[Flags], MDF_PrimaryInd)) break;
+ if (!m_strsep_bit(str, &md->gc[Flags], MDF_ConnectedInd)) break;
+ if (!m_strsep_bit(str, &md->gc[Flags], MDF_FullSync)) break;
+ } while (0);
+}
+
+void m_set_uuid(struct md_cpu *md, char **argv, int argc)
+{
+ char **str;
+ int i;
+
+ str = &argv[0];
+
+ do {
+ for ( i=Current ; i<UUID_SIZE ; i++ ) {
+ if (!m_strsep_u64(str, &md->uuid[i])) goto done;
+ }
+ if (!m_strsep_bit(str, &md->flags, MDF_Consistent)) break;
+ if (!m_strsep_bit(str, &md->flags, MDF_WasUpToDate)) break;
+ if (!m_strsep_bit(str, &md->flags, MDF_PrimaryInd)) break;
+ if (!m_strsep_bit(str, &md->flags, MDF_ConnectedInd)) break;
+ if (!m_strsep_bit(str, &md->flags, MDF_FullSync)) break;
+ } while (0);
+ done:
+}
+
+
+
+
/******************************************
begin of v06 {{{
******************************************/
@@ -1101,7 +1225,7 @@
/******************************************
}}} end of v08
******************************************/
-int meta_get_gc(struct format *cfg, char **argv, int argc)
+int meta_get_gi(struct format *cfg, char **argv, int argc)
{
if (argc > 0) {
fprintf(stderr, "Ignoring additional arguments\n");
@@ -1110,12 +1234,12 @@
if (cfg->ops->open(cfg))
return -1;
- cfg->ops->get_gi(cfg);
+ cfg->ops->get_gi(&cfg->md);
return cfg->ops->close(cfg);
}
-int meta_show_gc(struct format *cfg, char **argv, int argc)
+int meta_show_gi(struct format *cfg, char **argv, int argc)
{
char ppb[10];
@@ -1126,7 +1250,7 @@
if (cfg->ops->open(cfg))
return -1;
- cfg->ops->show_gi(cfg);
+ cfg->ops->show_gi(&cfg->md);
if (cfg->md.la_sect) {
printf("last agreed size: %s\n",
@@ -1140,6 +1264,45 @@
return cfg->ops->close(cfg);
}
+int meta_set_gi(struct format *cfg, char **argv, int argc)
+{
+ struct md_cpu tmp;
+ int err;
+
+ if (argc > 1) {
+ fprintf(stderr, "Ignoring additional arguments\n");
+ }
+ if (argc < 1) {
+ fprintf(stderr, "Required Argument missing\n");
+ exit(10);
+ }
+
+ if (cfg->ops->open(cfg))
+ return -1;
+
+ tmp = cfg->md;
+
+ cfg->ops->set_gi(&tmp,argv,argc);
+ printf("previously ");
+ cfg->ops->get_gi(&cfg->md);
+ printf("set GI to ");
+ cfg->ops->get_gi(&tmp);
+
+ if (!confirmed("Write new GI to disk?")) {
+ printf("Operation cancelled.\n");
+ exit(0);
+ }
+
+ cfg->md = tmp;
+
+ err = cfg->ops->md_cpu_to_disk(cfg)
+ || cfg->ops->close(cfg);
+ if (err)
+ fprintf(stderr, "update failed\n");
+
+ return err;
+}
+
int meta_dump_md(struct format *cfg, char **argv, int argc)
{
int i;
@@ -1243,115 +1406,10 @@
return err;
}
-int m_strsep(char **s, int *val)
+int meta_outdate(struct format *cfg, char **argv, int argc)
{
- char *t, *e;
- long v;
-
- if ((t = strsep(s, ":"))) {
- if (strlen(t)) {
- e = t;
- v = strtol(t, &e, 0);
- if (*e != 0) {
- fprintf(stderr, "'%s' is not a number.\n", *s);
- exit(10);
- }
- if (v < 0) {
- fprintf(stderr, "'%s' is negative.\n", *s);
- exit(10);
- }
- if (v > 0xFFffFFff) {
- fprintf(stderr,
- "'%s' is out of range (max 0xFFffFFff).\n",
- *s);
- exit(10);
- }
- *val = v;
- }
- return 1;
- }
- return 0;
-}
-
-int m_strsep_b(char **s, int *val, int mask)
-{
- int d;
- int rv;
-
- d = *val & mask;
-
- rv = m_strsep(s, &d);
-
- if (d > 1) {
- fprintf(stderr, "'%d' is not 0 or 1.\n", d);
- exit(10);
- }
-
- if (d)
- *val |= mask;
- else
- *val &= ~mask;
-
- return rv;
-}
-
-int meta_set_gc(struct format *cfg, char **argv, int argc)
-{
- struct md_cpu tmp;
int err;
- char **str;
- if (argc > 1) {
- fprintf(stderr, "Ignoring additional arguments\n");
- }
- if (argc < 1) {
- fprintf(stderr, "Required Argument missing\n");
- exit(10);
- }
-
- if (cfg->ops->open(cfg))
- return -1;
-
- tmp = cfg->md;
- str = &argv[0];
-
- do {
- if (!m_strsep_b(str, &tmp.gc[Flags], MDF_Consistent)) break;
- if (!m_strsep_b(str, &tmp.gc[Flags], MDF_WasUpToDate)) break;
- if (!m_strsep(str, &tmp.gc[HumanCnt])) break;
- if (!m_strsep(str, &tmp.gc[TimeoutCnt])) break;
- if (!m_strsep(str, &tmp.gc[ConnectedCnt])) break;
- if (!m_strsep(str, &tmp.gc[ArbitraryCnt])) break;
- if (!m_strsep_b(str, &tmp.gc[Flags], MDF_PrimaryInd)) break;
- if (!m_strsep_b(str, &tmp.gc[Flags], MDF_ConnectedInd)) break;
- if (!m_strsep_b(str, &tmp.gc[Flags], MDF_FullSync)) break;
- } while (0);
-
- printf(" consistent:H:T:C:A:p:c:f\n");
- printf("previously ");
- dt_print_gc(cfg->md.gc);
- printf("GCs set to ");
- dt_print_gc(tmp.gc);
-
- if (!confirmed("Write new GCs to disk?")) {
- printf("Operation cancelled.\n");
- exit(0);
- }
-
- cfg->md = tmp;
-
- err = cfg->ops->md_cpu_to_disk(cfg)
- || cfg->ops->close(cfg);
- if (err)
- fprintf(stderr, "update failed\n");
-
- return err;
-}
-
-int meta_outdate_gc(struct format *cfg, char **argv, int argc)
-{
- int err;
-
if (argc > 0) {
fprintf(stderr, "Ignoring additional arguments\n");
}
More information about the drbd-cvs
mailing list