[DRBD-cvs] svn commit by phil - r2130 - in trunk: . scripts user -
Made drbdmeta to destroy any v07 superblocks when a v08
drbd-cvs at lists.linbit.com
drbd-cvs at lists.linbit.com
Tue Apr 4 16:11:15 CEST 2006
Author: phil
Date: 2006-04-04 16:11:13 +0200 (Tue, 04 Apr 2006)
New Revision: 2130
Modified:
trunk/ROADMAP
trunk/scripts/drbd.conf
trunk/user/drbdmeta.c
Log:
Made drbdmeta to destroy any v07 superblocks when a v08 meta
data area is initialized.
When using internal meta data the superblocks of v07 and v08 are
in different locations.
Modified: trunk/ROADMAP
===================================================================
--- trunk/ROADMAP 2006-03-31 13:12:56 UTC (rev 2129)
+++ trunk/ROADMAP 2006-04-04 14:11:13 UTC (rev 2130)
@@ -687,14 +687,20 @@
31 Resizing several GB results in ko-count timeouts, maybe since the
secondary node does the enlargement of the bitmap in the receiver (?)
+ DONE, by using the async bitmap IO code.
+
32 drbdmeta: with internal meta-data v07 and v08 meta-data super blocks
are in different places. -> It is possible to have v07 AND v08 meta
data on one device.
=> drbdmeta should make sure that it overwrites the other location
in case it create a meta-data block.
-33? Online verification.
+ 99% DONE
+33 Save the minor number and the backing device in the (external) meta
+ data as sanity check.
+
+
plus-banches:
----------------------
Modified: trunk/scripts/drbd.conf
===================================================================
--- trunk/scripts/drbd.conf 2006-03-31 13:12:56 UTC (rev 2129)
+++ trunk/scripts/drbd.conf 2006-04-04 14:11:13 UTC (rev 2130)
@@ -275,7 +275,7 @@
# the current secondary's data. Otherwise disconnect.
# "discard-secondary"
# discard the version of the secondary.
- # "panic-primary" Always honour the outcome of the "after-sb-2sc"
+ # "panic-primary" Always honour the outcome of the "after-sb-0pri"
# algorithm. In case it decides the the current
# secondary has the right data, it panics the
# current primary.
Modified: trunk/user/drbdmeta.c
===================================================================
--- trunk/user/drbdmeta.c 2006-03-31 13:12:56 UTC (rev 2129)
+++ trunk/user/drbdmeta.c 2006-04-04 14:11:13 UTC (rev 2130)
@@ -306,9 +306,9 @@
int (*open) (struct format *);
int (*close) (struct format *);
int (*md_initialize) (struct format *);
- int (*md_get_byte_offset) (struct format *);
int (*md_disk_to_cpu) (struct format *);
int (*md_cpu_to_disk) (struct format *);
+ void (*md_erase_other_sbs) (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);
@@ -660,6 +660,7 @@
int v06_parse(struct format *cfg, char **argv, int argc, int *ai);
int v06_md_open(struct format *cfg);
int v06_md_initialize(struct format *cfg);
+void v06_md_erase_others(struct format *cfg);
int v07_md_close(struct format *cfg);
int v07_md_cpu_to_disk(struct format *cfg);
@@ -667,13 +668,15 @@
int v07_md_open(struct format *cfg);
int v07_parse(struct format *cfg, char **argv, int argc, int *ai);
int v07_md_initialize(struct format *cfg);
-int v07_md_get_byte_offset(struct format * cfg);
+void v07_md_erase_others(struct format *cfg);
+u64 v07_md_get_byte_offset(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);
-int v08_md_get_byte_offset(struct format * cfg);
+void v08_md_erase_others(struct format *cfg);
+u64 v08_md_get_byte_offset(struct format * cfg);
struct format_ops f_ops[] = {
[Drbd_06] = {
@@ -683,9 +686,9 @@
.open = v06_md_open,
.close = v06_md_close,
.md_initialize = v06_md_initialize,
- .md_get_byte_offset = NULL, /* unused */
.md_disk_to_cpu = v06_md_disk_to_cpu,
.md_cpu_to_disk = v06_md_cpu_to_disk,
+ .md_erase_other_sbs = v06_md_erase_others,
.get_gi = m_get_gc,
.show_gi = m_show_gc,
.set_gi = m_set_gc,
@@ -698,9 +701,9 @@
.open = v07_md_open,
.close = v07_md_close,
.md_initialize = v07_md_initialize,
- .md_get_byte_offset = v07_md_get_byte_offset,
.md_disk_to_cpu = v07_md_disk_to_cpu,
.md_cpu_to_disk = v07_md_cpu_to_disk,
+ .md_erase_other_sbs = v07_md_erase_others,
.get_gi = m_get_gc,
.show_gi = m_show_gc,
.set_gi = m_set_gc,
@@ -713,9 +716,9 @@
.open = v08_md_open,
.close = v07_md_close,
.md_initialize = v08_md_initialize,
- .md_get_byte_offset = v08_md_get_byte_offset,
.md_disk_to_cpu = v08_md_disk_to_cpu,
.md_cpu_to_disk = v08_md_cpu_to_disk,
+ .md_erase_other_sbs = v08_md_erase_others,
.get_gi = m_get_uuid,
.show_gi = m_show_uuid,
.set_gi = m_set_uuid,
@@ -769,9 +772,6 @@
{"dump-md", 0, meta_dump_md, 1},
{"restore-md", "file", meta_restore_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, 1},
{"dstate", 0, meta_dstate, 1},
{"read-dev-uuid", "VAL", meta_read_dev_uuid, 0},
@@ -848,7 +848,9 @@
printf("\n}\n");
}
-int v07_style_md_open(struct format *cfg, size_t size)
+int v07_style_md_open(struct format *cfg,
+ u64 (*md_get_byte_offset) (struct format *),
+ size_t size)
{
struct stat sb;
unsigned long words;
@@ -875,7 +877,7 @@
PERROR("WARN: ioctl(,BLKFLSBUF,) failed");
}
- (void) cfg->ops->md_get_byte_offset(cfg);
+ cfg->md_offset = md_get_byte_offset(cfg);
// fprintf(stderr,"offset: "U64"\n", cfg->md_offset);
cfg->md_mmaped_length = size;
@@ -924,6 +926,39 @@
return 0;
}
+void md_erase_sb(struct format *cfg,
+ u64 (*md_get_byte_offset) (struct format *))
+{
+ /* in case these are internal meta data, we need to
+ make sure that there is no v08 superblock at the end
+ of the meta data area. */
+
+ unsigned char zero_sector[512];
+ struct format cfg_f;
+ u64 offset;
+ int bw;
+
+ if(cfg->md_index == DRBD_MD_INDEX_INTERNAL ||
+ cfg->md_index == DRBD_MD_INDEX_FLEX_INT ) {
+ memset(zero_sector,0,512);
+ cfg_f = *cfg;
+ cfg_f.md_index = DRBD_MD_INDEX_INTERNAL;
+ /* Need to set it to INTERNAL, to hit the superblock
+ in the front of the meta data area. */
+
+ offset = md_get_byte_offset(&cfg_f);
+ if(lseek64(cfg->md_fd, offset, SEEK_SET) == -1) {
+ PERROR("lseek64() failed");
+ exit(20);
+ }
+
+ if( (bw=write(cfg->md_fd,zero_sector,512)) != 512) {
+ PERROR("write() returned %d",bw);
+ exit(20);
+ }
+ }
+}
+
void m_get_gc(struct md_cpu *md)
{
dt_print_gc(md->gc);
@@ -1191,6 +1226,11 @@
return 0;
}
+void v06_md_erase_others(struct format *cfg __attribute((unused)))
+{
+ /* nothing to do */
+}
+
/******************************************
}}} end of v06
******************************************/
@@ -1303,7 +1343,7 @@
begin of v07 {{{
******************************************/
-int v07_md_get_byte_offset(struct format *cfg)
+u64 v07_md_get_byte_offset(struct format *cfg)
{
u64 offset;
@@ -1325,8 +1365,8 @@
offset = 0;
break;
}
- cfg->md_offset = offset;
- return 0;
+
+ return offset;
}
int v07_md_disk_to_cpu(struct format *cfg)
@@ -1391,7 +1431,9 @@
int v07_md_open(struct format *cfg)
{
- return v07_style_md_open(cfg, sizeof(struct md_on_disk_07));
+ return v07_style_md_open(cfg,
+ &v07_md_get_byte_offset,
+ sizeof(struct md_on_disk_07));
}
int v07_md_close(struct format *cfg)
@@ -1430,6 +1472,11 @@
return md_initialize_common(cfg);
}
+void v07_md_erase_others(struct format *cfg)
+{
+ md_erase_sb(cfg,&v08_md_get_byte_offset);
+}
+
/******************************************
}}} end of v07
******************************************/
@@ -1437,7 +1484,7 @@
begin of v08 {{{
******************************************/
-int v08_md_get_byte_offset(struct format *cfg)
+u64 v08_md_get_byte_offset(struct format *cfg)
{
u64 offset;
@@ -1456,8 +1503,8 @@
offset = 0;
break;
}
- cfg->md_offset = offset;
- return 0;
+
+ return offset;
}
int v08_md_disk_to_cpu(struct format *cfg)
@@ -1487,7 +1534,9 @@
int v08_md_open(struct format *cfg)
{
- return v07_style_md_open(cfg, sizeof(struct md_on_disk_08));
+ return v07_style_md_open(cfg,
+ &v08_md_get_byte_offset,
+ sizeof(struct md_on_disk_08));
}
int v08_md_initialize(struct format *cfg)
@@ -1506,6 +1555,11 @@
return md_initialize_common(cfg);
}
+void v08_md_erase_others(struct format *cfg)
+{
+ md_erase_sb(cfg,&v07_md_get_byte_offset);
+}
+
/******************************************
}}} end of v08
******************************************/
@@ -2036,6 +2090,7 @@
}
}
+ cfg->ops->md_erase_other_sbs(cfg);
printf("Creating meta data...\n");
MEMSET(&cfg->md, 0, sizeof(cfg->md));
err = cfg->ops->md_initialize(cfg);
More information about the drbd-cvs
mailing list