[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