[DRBD-cvs] r1694 - trunk/user

svn at svn.drbd.org svn at svn.drbd.org
Tue Jan 4 15:40:55 CET 2005


Author: phil
Date: 2005-01-04 15:40:52 +0100 (Tue, 04 Jan 2005)
New Revision: 1694

Modified:
   trunk/user/drbdmeta.c
Log:
Creating v08 metadata was not woking since in v08
we used v07_md_open() ... but now v07 and v08 have
different size....


Modified: trunk/user/drbdmeta.c
===================================================================
--- trunk/user/drbdmeta.c	2005-01-04 14:25:47 UTC (rev 1693)
+++ trunk/user/drbdmeta.c	2005-01-04 14:40:52 UTC (rev 1694)
@@ -496,6 +496,7 @@
 int v07_parse(struct format *cfg, char **argv, int argc, int *ai);
 int v07_md_initialize(struct format *cfg);
 
+int v08_md_open(struct format *cfg);
 int v08_md_cpu_to_disk(struct format *cfg);
 int v08_md_disk_to_cpu(struct format *cfg);
 int v08_md_initialize(struct format *cfg);
@@ -525,7 +526,7 @@
 		     .name = "v08",
 		     .args = (char *[]){"device", "index", NULL},
 		     .parse = v07_parse,
-		     .open = v07_md_open,
+		     .open = v08_md_open,
 		     .close = v07_md_close,
 		     .md_initialize = v08_md_initialize,
 		     .md_disk_to_cpu = v08_md_disk_to_cpu,
@@ -655,6 +656,104 @@
 	       md->gc[Flags] & MDF_FullSync ? 1 : 0);
 }
 
+int get_real_random(void * p, int size)
+{
+	int fd,rv;
+
+	fd = open("/dev/random", O_RDONLY);
+	if(fd == -1) {
+		PERROR("open('/dev/random',O_RDONLY)");
+		exit(20);
+	}
+	rv = size == read(fd,p,size);
+	close(fd);
+	return rv;
+}
+
+u64 new_style_offset(struct format * cfg)
+{
+	u64 offset;
+
+	if (cfg->md_index == -1) {
+		offset = (bdev_size(cfg->md_fd) & ~((1 << 12) - 1))
+		    - MD_RESERVED_SIZE_07;
+	} else {
+		offset = MD_RESERVED_SIZE_07 * cfg->md_index;
+	}
+	return offset;
+}
+
+int new_style_md_open(struct format *cfg, size_t size)
+{
+	struct stat sb;
+	unsigned long words;
+	u64 offset, al_offset, bm_offset;
+
+	cfg->md_fd = open(cfg->md_device_name, O_RDWR);
+
+	if (cfg->md_fd == -1) {
+		PERROR("open(%s) failed", cfg->md_device_name);
+		exit(20);
+	}
+
+	if (fstat(cfg->md_fd, &sb)) {
+		PERROR("fstat(%s) failed", cfg->md_device_name);
+		exit(20);
+	}
+
+	if (!S_ISBLK(sb.st_mode)) {
+		fprintf(stderr, "'%s' is not a block device!\n",
+			cfg->md_device_name);
+		exit(20);
+	}
+
+	if (ioctl(cfg->md_fd, BLKFLSBUF) == -1) {
+		PERROR("ioctl(,BLKFLSBUF,) failed");
+		exit(20);
+	}
+
+	offset = new_style_offset(cfg);
+	cfg->on_disk.md7 =
+	    mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, cfg->md_fd, 
+		 offset);
+	if (cfg->on_disk.md7 == NULL) {
+		PERROR("mmap(md_on_disk) failed");
+		exit(20);
+	}
+	cfg->md_offset = offset;
+
+	if (cfg->ops->md_disk_to_cpu(cfg)) {
+		return -1;
+	}
+
+	al_offset = offset + cfg->md.al_offset * 512;
+	bm_offset = offset + cfg->md.bm_offset * 512;
+
+	cfg->on_disk.al =
+	    mmap(NULL, MD_AL_MAX_SIZE_07 * 512, PROT_READ | PROT_WRITE,
+		 MAP_SHARED, cfg->md_fd, al_offset);
+	if (cfg->on_disk.al == NULL) {
+		PERROR("mmap(al_on_disk) failed");
+		exit(20);
+	}
+
+	cfg->on_disk.bm = mmap(NULL, MD_BM_MAX_SIZE_07, PROT_READ | PROT_WRITE,
+			       MAP_SHARED, cfg->md_fd, bm_offset);
+	if (cfg->on_disk.bm == NULL) {
+		PERROR("mmap(bm_on_disk) failed");
+		exit(20);
+	}
+
+	words = bm_words(cfg->md.la_sect);
+	cfg->bm_bytes = words * sizeof(long);
+	cfg->bits_set =
+	    count_bits((const unsigned long *)cfg->on_disk.bm, words);
+
+	/* FIXME paranoia verify that unused bits and words are unset... */
+
+	return 0;
+}
+
 /******************************************
  begin of v06 {{{
  ******************************************/
@@ -783,19 +882,6 @@
  begin of v07 {{{
  ******************************************/
 
-u64 v07_offset(struct format * cfg)
-{
-	u64 offset;
-
-	if (cfg->md_index == -1) {
-		offset = (bdev_size(cfg->md_fd) & ~((1 << 12) - 1))
-		    - MD_RESERVED_SIZE_07;
-	} else {
-		offset = MD_RESERVED_SIZE_07 * cfg->md_index;
-	}
-	return offset;
-}
-
 int v07_md_disk_to_cpu(struct format *cfg)
 {
 	md_disk_07_to_cpu(&cfg->md, cfg->on_disk.md7);
@@ -847,73 +933,7 @@
 
 int v07_md_open(struct format *cfg)
 {
-	struct stat sb;
-	unsigned long words;
-	u64 offset, al_offset, bm_offset;
-
-	cfg->md_fd = open(cfg->md_device_name, O_RDWR);
-
-	if (cfg->md_fd == -1) {
-		PERROR("open(%s) failed", cfg->md_device_name);
-		exit(20);
-	}
-
-	if (fstat(cfg->md_fd, &sb)) {
-		PERROR("fstat(%s) failed", cfg->md_device_name);
-		exit(20);
-	}
-
-	if (!S_ISBLK(sb.st_mode)) {
-		fprintf(stderr, "'%s' is not a block device!\n",
-			cfg->md_device_name);
-		exit(20);
-	}
-
-	if (ioctl(cfg->md_fd, BLKFLSBUF) == -1) {
-		PERROR("ioctl(,BLKFLSBUF,) failed");
-		exit(20);
-	}
-
-	offset = v07_offset(cfg);
-	cfg->on_disk.md7 =
-	    mmap(NULL, sizeof(struct md_on_disk_07), PROT_READ | PROT_WRITE,
-		 MAP_SHARED, cfg->md_fd, offset);
-	if (cfg->on_disk.md7 == NULL) {
-		PERROR("mmap(md_on_disk) failed");
-		exit(20);
-	}
-	cfg->md_offset = offset;
-
-	if (cfg->ops->md_disk_to_cpu(cfg)) {
-		return -1;
-	}
-
-	al_offset = offset + cfg->md.al_offset * 512;
-	bm_offset = offset + cfg->md.bm_offset * 512;
-
-	cfg->on_disk.al =
-	    mmap(NULL, MD_AL_MAX_SIZE_07 * 512, PROT_READ | PROT_WRITE,
-		 MAP_SHARED, cfg->md_fd, al_offset);
-	if (cfg->on_disk.al == NULL) {
-		PERROR("mmap(al_on_disk) failed");
-		exit(20);
-	}
-
-	cfg->on_disk.bm = mmap(NULL, MD_BM_MAX_SIZE_07, PROT_READ | PROT_WRITE,
-			       MAP_SHARED, cfg->md_fd, bm_offset);
-	if (cfg->on_disk.bm == NULL) {
-		PERROR("mmap(bm_on_disk) failed");
-		exit(20);
-	}
-
-	words = bm_words(cfg->md.la_sect);
-	cfg->bm_bytes = words * sizeof(long);
-	cfg->bits_set =
-	    count_bits((const unsigned long *)cfg->on_disk.bm, words);
-
-	/* FIXME paranoia verify that unused bits and words are unset... */
-
-	return 0;
+	return new_style_md_open(cfg, sizeof(struct md_on_disk_07));
 }
 
 int v07_md_close(struct format *cfg)
@@ -1024,18 +1044,9 @@
 	return 0;
 }
 
-int get_real_random(void * p, int size)
+int v08_md_open(struct format *cfg)
 {
-	int fd,rv;
-
-	fd = open("/dev/random", O_RDONLY);
-	if(fd == -1) {
-		PERROR("open('/dev/random',O_RDONLY)");
-		exit(20);
-	}
-	rv = size == read(fd,p,size);
-	close(fd);
-	return rv;
+	return new_style_md_open(cfg, sizeof(struct md_on_disk_08));
 }
 
 int v08_md_initialize(struct format *cfg)



More information about the drbd-cvs mailing list