[DRBD-cvs] r1779 - in trunk: . drbd drbd/linux user
www-data
www-data at garcon.linbit.com
Tue Apr 5 16:25:54 CEST 2005
Author: phil
Date: 2005-04-05 16:25:45 +0200 (Tue, 05 Apr 2005)
New Revision: 1779
Modified:
trunk/ROADMAP
trunk/drbd/drbd_fs.c
trunk/drbd/drbd_receiver.c
trunk/drbd/drbd_worker.c
trunk/drbd/linux/drbd.h
trunk/user/drbd_endian.h
trunk/user/drbdadm_main.c
trunk/user/drbdmeta.c
trunk/user/drbdsetup.c
trunk/user/drbdtool_common.c
trunk/user/drbdtool_common.h
Log:
More work on item 16. Mostly implemented by now, needs
debugging.
Modified: trunk/ROADMAP
===================================================================
--- trunk/ROADMAP 2005-04-05 12:30:20 UTC (rev 1778)
+++ trunk/ROADMAP 2005-04-05 14:25:45 UTC (rev 1779)
@@ -468,9 +468,9 @@
NB: If they are needed, I think they can be implemented
as special UUID values.
- 50% DONE. Kernel part is implemented, not tested. But testing
- will only be possible after drbdmeta was updated.
- Drbdmeta still has no clue of gen-UUIDs, not drbdsetup.
+ 80% DONE. Kernel part is implemented, little tested. Userlang parts
+ implemented, seem to work. Known bugs: Upon connect
+ sync_handshake is not called, need to fix this.
17 Something like
Modified: trunk/drbd/drbd_fs.c
===================================================================
--- trunk/drbd/drbd_fs.c 2005-04-05 12:30:20 UTC (rev 1778)
+++ trunk/drbd/drbd_fs.c 2005-04-05 14:25:45 UTC (rev 1779)
@@ -992,6 +992,7 @@
for (i = Current; i < UUID_SIZE; i++) {
cn.uuid[i]=mdev->uuid[i];
}
+ cn.flags = mdev->md_flags;
cn.bits_set = drbd_bm_total_weight(mdev);
cn.current_size = drbd_get_capacity(mdev->this_bdev);
Modified: trunk/drbd/drbd_receiver.c
===================================================================
--- trunk/drbd/drbd_receiver.c 2005-04-05 12:30:20 UTC (rev 1778)
+++ trunk/drbd/drbd_receiver.c 2005-04-05 14:25:45 UTC (rev 1779)
@@ -1529,10 +1529,8 @@
nconn = mdev->state.s.conn;
if (nconn == WFReportParams ) nconn = Connected;
- if (mdev->p_uuid && mdev->state.s.conn == Connected) {
+ if (mdev->p_uuid && mdev->state.s.conn <= Connected) {
nconn=drbd_sync_handshake(mdev);
- kfree(mdev->p_uuid);
- mdev->p_uuid = 0;
if(nconn == conn_mask) return FALSE;
}
Modified: trunk/drbd/drbd_worker.c
===================================================================
--- trunk/drbd/drbd_worker.c 2005-04-05 12:30:20 UTC (rev 1778)
+++ trunk/drbd/drbd_worker.c 2005-04-05 14:25:45 UTC (rev 1779)
@@ -390,7 +390,9 @@
mdev->rs_total = 0;
mdev->rs_paused = 0;
- drbd_uuid_set_current(mdev,mdev->p_uuid[Current]);
+ if ( mdev->state.s.conn == SyncTarget ) {
+ drbd_uuid_set_current(mdev,mdev->p_uuid[Current]);
+ }
drbd_uuid_reset_bm(mdev);
drbd_request_state(mdev,NS3(conn,Connected,
Modified: trunk/drbd/linux/drbd.h
===================================================================
--- trunk/drbd/linux/drbd.h 2005-04-05 12:30:20 UTC (rev 1778)
+++ trunk/drbd/linux/drbd.h 2005-04-05 14:25:45 UTC (rev 1779)
@@ -296,6 +296,7 @@
struct ioctl_get_uuids {
OUT __u64 uuid[UUID_SIZE];
OUT __u64 current_size;
+ OUT unsigned int flags;
OUT unsigned int bits_set;
};
Modified: trunk/user/drbd_endian.h
===================================================================
--- trunk/user/drbd_endian.h 2005-04-05 12:30:20 UTC (rev 1778)
+++ trunk/user/drbd_endian.h 2005-04-05 14:25:45 UTC (rev 1779)
@@ -140,4 +140,30 @@
return sizeof(w) == 4 ? generic_hweight32(w) : generic_hweight64(w);
}
+
+/*
+ * Format macros for printf()
+ */
+
+#if BITS_PER_LONG == 32
+# define X32 "%lX"
+//# define X64 "%llX"
+# define X64(a) "%"#a"llX"
+# define D32 "%ld"
+# define D64 "%lld"
+# define U32 "%lu"
+# define U64 "%llu"
+#elif BITS_PER_LONG == 64
+# define X32 "%X"
+//# define X64 "%lX"
+# define X64(a) "%"#a"lX"
+# define D32 "%d"
+# define D64 "%ld"
+# define U32 "%u"
+# define U64 "%lu"
+#else
+# error "sorry, weird endianness on this box"
#endif
+
+#endif
+
Modified: trunk/user/drbdadm_main.c
===================================================================
--- trunk/user/drbdadm_main.c 2005-04-05 12:30:20 UTC (rev 1778)
+++ trunk/user/drbdadm_main.c 2005-04-05 14:25:45 UTC (rev 1779)
@@ -191,11 +191,10 @@
{ "cstate", adm_generic_s, 1, 1 },
{ "dump", adm_dump, 1, 1 },
{ "create-md", admm_generic, 1, 1 },
- { "show-gc", adm_generic_b, 1, 1 },
- { "get-gc", adm_generic_b, 1, 1 },
+ { "show-gi", adm_generic_b, 1, 1 },
+ { "get-gi", adm_generic_b, 1, 1 },
{ "dump-md", admm_generic, 1, 1 },
- { "set-gc", admm_generic, 0, 1 },
- { "set-uuid", admm_generic, 0, 1 },
+ { "set-gi", admm_generic, 0, 1 },
{ "pri-on-incon-degr", adm_khelper, 0, 1 },
{ "pri-sees-sec-with-higher-gc", adm_khelper, 0, 1 },
{ "outdate-peer", adm_khelper, 0, 1 },
Modified: trunk/user/drbdmeta.c
===================================================================
--- trunk/user/drbdmeta.c 2005-04-05 12:30:20 UTC (rev 1778)
+++ trunk/user/drbdmeta.c 2005-04-05 14:25:45 UTC (rev 1779)
@@ -137,13 +137,13 @@
* 0.7 stores la_size on disk as kb, 0.8 in units of sectors.
* we use sectors in our general working structure here */
u64 la_sect; /* last agreed size. */
- u64 uuid;
- u64 peer_uuid;
u32 md_size;
u32 al_offset; /* offset to this block */
u32 al_nr_extents; /* important for restoring the AL */
u32 bm_offset; /* offset to the bitmap, from here */
- /* more to come eventually */
+ /* Since DRBD 0.8 we have uuid instead of gc */
+ u64 uuid[UUID_SIZE];
+ u32 flags;
};
/*
@@ -319,9 +319,8 @@
struct __attribute__ ((packed)) md_on_disk_08 {
be_u64 la_sect; /* last agreed size. */
- be_u64 uuid; /* universally unique identifier */
- be_u64 peer_uuid; /* universally unique identifier */
- be_u32 gc[GEN_CNT_SIZE]; /* generation counter */
+ be_u64 uuid[UUID_SIZE]; // UUIDs.
+ be_u32 flags;
be_u32 magic;
be_u32 md_size;
be_u32 al_offset; /* offset to this block */
@@ -334,10 +333,9 @@
{
int i;
cpu->la_sect = be64_to_cpu(disk->la_sect.be);
- cpu->uuid = be64_to_cpu(disk->uuid.be);
- cpu->peer_uuid = be64_to_cpu(disk->peer_uuid.be);
- for (i = 0; i < GEN_CNT_SIZE; i++)
- cpu->gc[i] = be32_to_cpu(disk->gc[i].be);
+ for ( i=Current ; i<UUID_SIZE ; i++ )
+ cpu->uuid[i] = be64_to_cpu(disk->uuid[i].be);
+ cpu->flags = be32_to_cpu(disk->flags.be);
cpu->magic = be32_to_cpu(disk->magic.be);
cpu->md_size = be32_to_cpu(disk->md_size.be);
cpu->al_offset = be32_to_cpu(disk->al_offset.be);
@@ -349,10 +347,9 @@
{
int i;
disk->la_sect.be = cpu_to_be64(cpu->la_sect);
- disk->uuid.be = cpu_to_be64(cpu->uuid);
- disk->peer_uuid.be = cpu_to_be64(cpu->peer_uuid);
- for (i = 0; i < GEN_CNT_SIZE; i++)
- disk->gc[i].be = cpu_to_be32(cpu->gc[i]);
+ for ( i=Current ; i<UUID_SIZE ; i++ )
+ disk->uuid[i].be = cpu_to_be64(cpu->uuid[i]);
+ disk->flags.be = cpu_to_be32(cpu->flags);
disk->magic.be = cpu_to_be32(cpu->magic);
disk->md_size.be = cpu_to_be32(cpu->md_size);
disk->al_offset.be = cpu_to_be32(cpu->al_offset);
@@ -446,6 +443,8 @@
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 *);
};
/*
@@ -459,6 +458,31 @@
Drbd_Unknown,
};
+/*
+ * Some glue
+ */
+
+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);
@@ -489,6 +513,8 @@
.md_initialize = v06_md_initialize,
.md_disk_to_cpu = v06_md_disk_to_cpu,
.md_cpu_to_disk = v06_md_cpu_to_disk,
+ .get_gi = m_get_gc,
+ .show_gi = m_show_gc,
},
[Drbd_07] = {
.name = "v07",
@@ -499,6 +525,8 @@
.md_initialize = v07_md_initialize,
.md_disk_to_cpu = v07_md_disk_to_cpu,
.md_cpu_to_disk = v07_md_cpu_to_disk,
+ .get_gi = m_get_gc,
+ .show_gi = m_show_gc,
},
[Drbd_08] = {
.name = "v08",
@@ -509,6 +537,8 @@
.md_initialize = v08_md_initialize,
.md_disk_to_cpu = v08_md_disk_to_cpu,
.md_cpu_to_disk = v08_md_cpu_to_disk,
+ .get_gi = m_get_uuid,
+ .show_gi = m_show_uuid,
},
};
@@ -533,16 +563,15 @@
int meta_set_uuid(struct format *cfg, char **argv, int argc);
struct meta_cmd cmds[] = {
- {"get-gc", 0, meta_get_gc, 1},
- {"show-gc", 0, meta_show_gc, 1},
+ {"get-gi", 0, meta_get_gc, 1},
+ {"show-gi", 0, meta_show_gc, 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-uuid", 0, meta_set_uuid, 1},
- {"set-gc", ":::VAL:VAL:...", meta_set_gc, 0},
+ {"set-gi", ":::VAL:VAL:...", meta_set_gc, 0},
};
/*
@@ -1021,15 +1050,15 @@
int v08_md_initialize(struct format *cfg)
{
u64 al_offset, bm_offset;
+ int i;
cfg->md.la_sect = 0;
- get_real_random(&cfg->md.uuid,sizeof(u64));
- cfg->md.peer_uuid = 0;
- cfg->md.gc[Flags] = 0;
- cfg->md.gc[HumanCnt] = 1; /* THINK 0? 1? */
- cfg->md.gc[TimeoutCnt] = 1;
- cfg->md.gc[ConnectedCnt] = 1;
- cfg->md.gc[ArbitraryCnt] = 1;
+ cfg->md.uuid[Current] = UUID_JUST_CREATED;
+ cfg->md.uuid[Bitmap] = 0;
+ for ( i=History_start ; i<=History_end ; i++ ) {
+ cfg->md.uuid[i]=0;
+ }
+ cfg->md.flags = 0;
cfg->md.magic = DRBD_MD_MAGIC_08;
/*
@@ -1072,7 +1101,6 @@
/******************************************
}}} end of v08
******************************************/
-
int meta_get_gc(struct format *cfg, char **argv, int argc)
{
if (argc > 0) {
@@ -1081,7 +1109,9 @@
if (cfg->ops->open(cfg))
return -1;
- dt_print_gc(cfg->md.gc);
+
+ cfg->ops->get_gi(cfg);
+
return cfg->ops->close(cfg);
}
@@ -1096,7 +1126,7 @@
if (cfg->ops->open(cfg))
return -1;
- dt_pretty_print_gc(cfg->md.gc);
+ cfg->ops->show_gi(cfg);
if (cfg->md.la_sect) {
printf("last agreed size: %s\n",
@@ -1107,9 +1137,6 @@
printf("zero size device -- never seen peer yet?\n");
}
- printf("local uuid: %llX\n",cfg->md.uuid);
- printf("peer's uuid: %llX\n",cfg->md.peer_uuid);
-
return cfg->ops->close(cfg);
}
@@ -1128,23 +1155,21 @@
* so we can safely restore it later */
printf("DRBD meta data dump version <FIXME drbdmeta dump version>\n");
printf("meta data version %s\n\n", cfg->ops->name);
- printf("gc {");
- for (i = 0; i < GEN_CNT_SIZE; i++) {
- printf(" 0x%X;", cfg->md.gc[i]);
+ if (cfg->ops < f_ops + Drbd_08) {
+ printf("gc {");
+ for (i = 0; i < GEN_CNT_SIZE; i++) {
+ printf(" 0x%X;", cfg->md.gc[i]);
+ }
+ } else { // >= 08
+ printf("uuid {");
+ for ( i=Current ; i<UUID_SIZE ; i++ ) {
+ printf(" 0x"X64(016)";", cfg->md.uuid[i]);
+ }
}
printf(" }\n");
if (cfg->ops >= f_ops + Drbd_07) {
printf("la-size-sect %llu;\n", cfg->md.la_sect);
- }
-
- if (cfg->ops >= f_ops + Drbd_08) {
- printf("uuid %llX;\n", cfg->md.uuid);
- printf("peer-uuid %llX;\n", cfg->md.peer_uuid);
- printf("# FIXME include offsets, once they are not fixed anymore\n");
- }
-
- if (cfg->ops >= f_ops + Drbd_07) {
printf("# bm-bytes %u;\n", cfg->bm_bytes);
printf("# bits-set %u;\n", cfg->bits_set);
if (cfg->on_disk.bm)
@@ -1168,14 +1193,15 @@
* We only need to adjust the magic here. */
printf("Converting meta data...\n");
cfg->md.magic = DRBD_MD_MAGIC_08;
- get_real_random(&cfg->md.uuid,sizeof(u64));
- cfg->md.peer_uuid = 0;
+ // get_real_random(&cfg->md.uuid,sizeof(u64));
+ // cfg->md.peer_uuid = 0;
if (cfg->ops->md_cpu_to_disk(cfg)
|| cfg->ops->close(cfg)) {
fprintf(stderr, "conversion failed\n");
return -1;
}
- printf("Successfully converted v07 meta data to v08 format.\n");
+ printf("Convertion Currently BROKEN!\n");
+ //printf("Successfully converted v07 meta data to v08 format.\n");
return 0;
}
@@ -1269,32 +1295,6 @@
return rv;
}
-int meta_set_uuid(struct format *cfg, char **argv, int argc)
-{
- 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;
-
- cfg->md.uuid = strtoll(argv[0],NULL,16);
-
- err = cfg->ops->md_cpu_to_disk(cfg)
- || cfg->ops->close(cfg);
- if (err)
- fprintf(stderr, "update failed\n");
-
- return err;
-
-}
-
int meta_set_gc(struct format *cfg, char **argv, int argc)
{
struct md_cpu tmp;
Modified: trunk/user/drbdsetup.c
===================================================================
--- trunk/user/drbdsetup.c 2005-04-05 12:30:20 UTC (rev 1778)
+++ trunk/user/drbdsetup.c 2005-04-05 14:25:45 UTC (rev 1779)
@@ -114,8 +114,8 @@
int cmd_detach(int drbd_fd,char** argv,int argc,struct option *options);
int cmd_state(int drbd_fd,char** argv,int argc,struct option *options);
int cmd_cstate(int drbd_fd,char** argv,int argc,struct option *options);
-int cmd_show_gc(int drbd_fd,char** argv,int argc,struct option *options);
-int cmd_get_gc(int drbd_fd,char** argv,int argc,struct option *options);
+int cmd_show_gi(int drbd_fd,char** argv,int argc,struct option *options);
+int cmd_get_gi(int drbd_fd,char** argv,int argc,struct option *options);
struct drbd_cmd commands[] = {
{"primary", cmd_primary, 0,
@@ -181,8 +181,8 @@
{"disconnect", cmd_disconnect, 0, 0, },
{"state", cmd_state, 0, 0, },
{"cstate", cmd_cstate, 0, 0, },
- {"show-gc", cmd_show_gc, 0, 0, },
- {"get-gc", cmd_get_gc, 0, 0, },
+ {"show-gi", cmd_show_gi, 0, 0, },
+ {"get-gi", cmd_get_gi, 0, 0, },
{"show", cmd_show, 0, 0, },
};
@@ -1349,45 +1349,42 @@
return 0;
}
-int cmd_get_gc(int drbd_fd,char** argv,int argc,struct option *options)
+int cmd_get_gi(int drbd_fd,char** argv,int argc,struct option *options)
{
- struct ioctl_get_gen_cnt cn;
+ struct ioctl_get_uuids cn;
int err;
- err=ioctl(drbd_fd,DRBD_IOCTL_GET_GEN_CNT,&cn);
+ err=ioctl(drbd_fd,DRBD_IOCTL_GET_UUIDS,&cn);
if(err)
{
- PERROR("ioctl(,GET_GEN_CNT,) failed");
+ PERROR("ioctl(,GET_GEN_UUIDS,) failed");
return 20;
}
- dt_print_gc(cn.gen_cnt);
+ dt_print_uuids(cn.uuid, cn.flags);
return 0;
}
-int cmd_show_gc(int drbd_fd,char** argv,int argc,struct option *options)
+int cmd_show_gi(int drbd_fd,char** argv,int argc,struct option *options)
{
- struct ioctl_get_gen_cnt cn;
+ struct ioctl_get_uuids cn;
char ppb[10];
int err;
- err=ioctl(drbd_fd,DRBD_IOCTL_GET_GEN_CNT,&cn);
+ err=ioctl(drbd_fd,DRBD_IOCTL_GET_UUIDS,&cn);
if(err)
{
- PERROR("ioctl(,GET_GEN_CNT,) failed");
+ PERROR("ioctl(,GET_GEN_UUIDS,) failed");
return 20;
}
- dt_pretty_print_gc(cn.gen_cnt);
+ dt_pretty_print_uuids(cn.uuid, cn.flags);
printf("current agreed size: %s\n", ppsize(ppb, cn.current_size >> 1));
printf("%u bits set in the bitmap [ %s out of sync ]\n",
cn.bits_set, ppsize(ppb, cn.bits_set * 4));
- printf("local uuid: %llX\n",cn.uuid);
- printf("peer's uuid: %llX\n",cn.peer_uuid);
-
return 0;
}
Modified: trunk/user/drbdtool_common.c
===================================================================
--- trunk/user/drbdtool_common.c 2005-04-05 12:30:20 UTC (rev 1778)
+++ trunk/user/drbdtool_common.c 2005-04-05 14:25:45 UTC (rev 1779)
@@ -15,6 +15,7 @@
#include <linux/drbd.h>
#include "drbdtool_common.h"
+#include "drbd_endian.h"
char* ppsize(char* buf, size_t size)
{
@@ -318,3 +319,25 @@
gen_cnt[Flags] & MDF_ConnectedInd ? "1/c" : "0/n",
gen_cnt[Flags] & MDF_FullSync ? "1/y" : "0/n");
}
+
+void dt_print_uuids(const __u64* uuid, unsigned int flags)
+{
+ int i;
+ printf(X64(016)":"X64(016)":",
+ uuid[Current],
+ uuid[Bitmap]);
+ for ( i=History_start ; i<=History_end ; i++ ) {
+ printf(X64(016)":", uuid[i]);
+ }
+ printf("%d:%d:%d:%d:%d\n",
+ flags & MDF_Consistent ? 1 : 0,
+ flags & MDF_WasUpToDate ? 1 : 0,
+ flags & MDF_PrimaryInd ? 1 : 0,
+ flags & MDF_ConnectedInd ? 1 : 0,
+ flags & MDF_FullSync ? 1 : 0);
+}
+
+void dt_pretty_print_uuids(const __u64* uuid, unsigned int flags)
+{
+ dt_print_uuids(uuid, flags);
+}
Modified: trunk/user/drbdtool_common.h
===================================================================
--- trunk/user/drbdtool_common.h 2005-04-05 12:30:20 UTC (rev 1778)
+++ trunk/user/drbdtool_common.h 2005-04-05 14:25:45 UTC (rev 1779)
@@ -22,6 +22,7 @@
extern char* ppsize(char* buf, size_t size);
extern void dt_print_gc(const __u32* gen_cnt);
extern void dt_pretty_print_gc(const __u32* gen_cnt);
+extern void dt_print_uuids(const __u64* uuid, unsigned int flags);
+extern void dt_pretty_print_uuids(const __u64* uuid, unsigned int flags);
#endif
-
More information about the drbd-cvs
mailing list