[DRBD-cvs] r1599 - in trunk: drbd testing user
svn at svn.drbd.org
svn at svn.drbd.org
Tue Oct 19 10:09:04 CEST 2004
Author: phil
Date: 2004-10-19 10:09:02 +0200 (Tue, 19 Oct 2004)
New Revision: 1599
Removed:
trunk/testing/read_gc.pl
trunk/testing/write_gc.pl
Modified:
trunk/drbd/drbd_fs.c
trunk/drbd/drbd_int.h
trunk/drbd/drbd_main.c
trunk/user/drbdmeta.c
Log:
Created meta data version 08.
Only difference so far ist that la_size is now
stored in units of sectors. Was KB in 07.
Modified: trunk/drbd/drbd_fs.c
===================================================================
--- trunk/drbd/drbd_fs.c 2004-10-19 07:32:21 UTC (rev 1598)
+++ trunk/drbd/drbd_fs.c 2004-10-19 08:09:02 UTC (rev 1599)
@@ -85,11 +85,8 @@
/* Returns 1 if there is a disk-less node, 0 if both nodes have a disk. */
/*
- * THINK do we want the size to be KB or sectors ?
- * note, *_capacity operates in 512 byte sectors!!
+ * *_size is in sectors.
*
- * currently *_size is in KB.
- *
* FIXME
* since this is done by drbd receiver as well as from drbdsetup,
* this actually needs proper locking!
@@ -99,19 +96,19 @@
*/
STATIC int do_determin_dev_size(struct Drbd_Conf* mdev)
{
- sector_t p_size = mdev->p_size; // partner's disk size.
+ sector_t p_size = mdev->p_size <<1; // partner's disk size.
sector_t la_size = mdev->la_size; // last agreed size.
sector_t m_size; // my size
- sector_t u_size = mdev->lo_usize; // size requested by user.
+ sector_t u_size = mdev->lo_usize <<1; // size requested by user.
sector_t size=0;
int rv;
char ppb[10];
- m_size = drbd_get_capacity(mdev->backing_bdev)>>1;
+ m_size = drbd_get_capacity(mdev->backing_bdev);
if (mdev->md_index == -1 && m_size) {// internal metadata
D_ASSERT(m_size > MD_RESERVED_SIZE);
- m_size = drbd_md_ss(mdev)>>1;
+ m_size = drbd_md_ss(mdev);
}
if(p_size && m_size) {
@@ -142,18 +139,18 @@
}
}
- if( (drbd_get_capacity(mdev->this_bdev)>>1) != size ) {
+ if( drbd_get_capacity(mdev->this_bdev) != size ) {
int err;
- err = drbd_bm_resize(mdev,size<<1); // wants sectors
+ err = drbd_bm_resize(mdev,size);
if (unlikely(err)) {
ERR("BM resizing failed. "
- "Leaving size unchanged at size = %lu KB\n",
- (unsigned long)size);
+ "Size unchanged = %s (%lu sect)\n",
+ ppsize(ppb,size>>1),(unsigned long)size);
} else {
// racy, see comments above.
drbd_set_my_capacity(mdev,size<<1);
mdev->la_size = size;
- INFO("size = %s (%lu KB)\n",ppsize(ppb,size),
+ INFO("size = %s (%lu sect)\n",ppsize(ppb,size>>1),
(unsigned long)size);
}
}
Modified: trunk/drbd/drbd_int.h
===================================================================
--- trunk/drbd/drbd_int.h 2004-10-19 07:32:21 UTC (rev 1598)
+++ trunk/drbd/drbd_int.h 2004-10-19 08:09:02 UTC (rev 1599)
@@ -265,7 +265,7 @@
GEN_CNT_SIZE // MUST BE LAST! (and Flags must stay first...)
};
-#define DRBD_MD_MAGIC (DRBD_MAGIC+3) // 3nd incarnation of the file format.
+#define DRBD_MD_MAGIC (DRBD_MAGIC+4) // 4th incarnation of the disk layout.
#define DRBD_PANIC 2
/* do_panic alternatives:
@@ -685,7 +685,7 @@
volatile Drbd_CState cstate;
wait_queue_head_t cstate_wait; // TODO Rename into "misc_wait".
Drbd_State o_state;
- sector_t la_size; // last agreed disk size
+ sector_t la_size; // last agreed disk size in sectors.
unsigned int send_cnt;
unsigned int recv_cnt;
unsigned int read_cnt;
Modified: trunk/drbd/drbd_main.c
===================================================================
--- trunk/drbd/drbd_main.c 2004-10-19 07:32:21 UTC (rev 1598)
+++ trunk/drbd/drbd_main.c 2004-10-19 08:09:02 UTC (rev 1599)
@@ -1843,7 +1843,7 @@
for (i = Flags; i < GEN_CNT_SIZE; i++)
buffer->gc[i]=cpu_to_be32(mdev->gen_cnt[i]);
- buffer->la_size=cpu_to_be64(drbd_get_capacity(mdev->this_bdev)>>1);
+ buffer->la_size=cpu_to_be64(drbd_get_capacity(mdev->this_bdev));
buffer->magic=cpu_to_be32(DRBD_MD_MAGIC);
buffer->md_size = __constant_cpu_to_be32(MD_RESERVED_SIZE);
@@ -1878,8 +1878,8 @@
}
}
- // why is this here?? please EXPLAIN.
- mdev->la_size = drbd_get_capacity(mdev->this_bdev)>>1;
+ // Update mdev->la_size, since we updated it on metadata.
+ mdev->la_size = drbd_get_capacity(mdev->this_bdev);
up(&mdev->md_io_mutex);
dec_local(mdev);
Deleted: trunk/testing/read_gc.pl
===================================================================
--- trunk/testing/read_gc.pl 2004-10-19 07:32:21 UTC (rev 1598)
+++ trunk/testing/read_gc.pl 2004-10-19 08:09:02 UTC (rev 1599)
@@ -1,89 +0,0 @@
-#!/usr/bin/perl -w
-
-use strict;
-use Fcntl;
-use Fcntl ":seek";
-
-use constant F_SIZE => 32;
-use constant DRBD_MD_MAGIC => 0x83740267+3;
-use constant BLKFLSBUF => 0x1261; # 0x1261 is BLKFLSBUF on intel.
-
-sub read_print_gc_file($$$)
- {
- my ($md_dev,$md_index,$resource)=@_;
- my ($rr,$buffer,$pos,$md_start,$sector);
-
- sysopen (GCF,$md_dev,O_RDONLY)
- or die "can not open GC file";
-
- ioctl(GCF,BLKFLSBUF,0);
- # DRBD uses its private buffer for writing meta data, therefore
- # we flush all the buffer cache's buffers of the device. Without
- # this we would simply the same values at subsequent calls, that
- # we saw at the first call.
-
- if ($md_index == -1) {
- $pos = sysseek(GCF, 0, SEEK_END);
- $md_start = (int($pos / (4*1024)) * (4*1024)) - 128 *1024*1024;
- } else {
- $md_start = 128*1024*1024*$md_index;
- }
-
- $rr=sysseek(GCF, $md_start, SEEK_SET);
- die "2nd seek failed rr=$rr md_start=$md_start" if ($rr != $md_start) ;
-
- $rr=sysread(GCF,$buffer,F_SIZE);
- die "can not read " if( $rr != F_SIZE );
-
- my ($size_u,$size,$Flags,$HumanCnt,$TimeoutCnt,$ConnectedCnt,$ArbitraryCnt,
- $MagicNr) =
- unpack("N8",$buffer);
- $size = $size + 4294967296 * $size_u;
-
- die "state file corrupt" if($MagicNr != DRBD_MD_MAGIC);
-
- printf(" %6s | %3s | %3d | %3d | %3d | %3d | %3s | %3s | %3s | %6d KB\n",
- $resource,
- $Flags & 0x01 ? "1/c" : "0/i", # is consistent
- # (may become sync source)
- $HumanCnt, $TimeoutCnt, $ConnectedCnt, $ArbitraryCnt,
- $Flags & 0x02 ? "1/p" : "0/s", # last state
- $Flags & 0x04 ? "1/c" : "0/n", # was connected
- $Flags & 0x08 ? "yes" : " no", # wants full sync
- $size);
-
- ioctl(GCF,BLKFLSBUF,0); # Ask the buffer cache to forget this buffer.
-
- close(GCF);
- }
-
-
-sub main()
-{
-
- my (@resources,$res,$disk,$index);
-
- @resources = sort(split(' ',`drbdadm sh-resources`));
-
- print <<EOS;
- WantFullSync |
- ConnectedInd | |
- lastState | | |
- ArbitraryCnt | | | |
- ConnectedCnt | | | | |
- TimeoutCnt | | | | | |
- HumanCnt | | | | | | |
- Consistent | | | | | | | |
-resource| | | | | | | | | Size
---------+-----+-----+-----+-----+-----+-----+-----+-----+----------+
-EOS
-
- for $res (@resources) {
- chomp($disk = `drbdadm sh-md-dev $res`);
- chomp($index = `drbdadm sh-md-idx $res`);
- read_print_gc_file($disk,$index,$res);
- }
-}
-
-main();
-
Deleted: trunk/testing/write_gc.pl
===================================================================
--- trunk/testing/write_gc.pl 2004-10-19 07:32:21 UTC (rev 1598)
+++ trunk/testing/write_gc.pl 2004-10-19 08:09:02 UTC (rev 1599)
@@ -1,120 +0,0 @@
-#!/usr/bin/perl -w
-
-use strict;
-use Fcntl;
-use Fcntl ":seek";
-
-use constant F_SIZE => 32;
-use constant DRBD_MD_MAGIC => 0x83740267+3;
-use constant BLKFLSBUF => 0x1261; # 0x1261 is BLKFLSBUF on intel.
-use constant MD_AL_OFFSET => 8 * 512;
-use constant MD_AL_MAX_SIZE => 64 * 512;
-
-sub ensure_default
-{
- my($ref,$text,$default) = @_;
-
- if(!defined($$ref)) {
- print "Assuming $text = $default\n";
- $$ref = $default;
- }
-}
-
-sub write_gc_file
-{
- my ($md_dev,$md_index,$del_al,$Consistent,$HumanCnt,$TimeoutCnt,
- $ConnectedCnt,$ArbitraryCnt,$lastState,$ConnectedInd,
- $WantFullSync) = @_;
- my ($Flags,$rr,$pos,$md_start,$out);
-
- ensure_default(\$Consistent,"Consistent",1);
- ensure_default(\$HumanCnt,"HumanCnt",1);
- ensure_default(\$TimeoutCnt,"TimeoutCnt",1);
- ensure_default(\$ConnectedCnt,"ConnectedCnt",1);
- ensure_default(\$ArbitraryCnt,"ArbitraryCnt",1);
- ensure_default(\$lastState,"lastState",0);
- ensure_default(\$ConnectedInd,"ConnectedInd",0);
- ensure_default(\$WantFullSync,"WantFullSync",0);
-
- sysopen (GCF,$md_dev,O_WRONLY)
- or die "can not open GC file";
-
- ioctl(GCF,BLKFLSBUF,0);
- # DRBD uses its private buffer for writing meta data, therefore
- # we flush all the buffer cache's buffers of the device. Without
- # this we would simply the same values at subsequent calls, that
- # we saw at the first call.
-
- if ($md_index == -1) {
- $pos = sysseek(GCF, 0, SEEK_END);
- $md_start = (int($pos / (4*1024)) * (4*1024)) - 128 *1024*1024;
- } else {
- $md_start = 128*1024*1024*$md_index;
- }
-
- $rr=sysseek(GCF, $md_start+8, SEEK_SET);
- die "2nd seek failed rr=$rr md_start=$md_start" if ($rr != $md_start+8) ;
-
- $Flags = 0;
- if($Consistent) { $Flags |= 0x01; }
- if($lastState) { $Flags |= 0x02; }
- if($ConnectedInd) { $Flags |= 0x04; }
- if($WantFullSync) { $Flags |= 0x08; }
-
- $out = pack("N6", $Flags,$HumanCnt,$TimeoutCnt,$ConnectedCnt,
- $ArbitraryCnt, DRBD_MD_MAGIC);
-
- $rr = syswrite(GCF, $out, length($out));
- die "syswrite failed: $!\n" unless $rr == length($out);
-
- if($del_al) {
- $rr=sysseek(GCF, $md_start + MD_AL_OFFSET, SEEK_SET);
- if ($rr != $md_start+MD_AL_OFFSET) {
- die "seek failed rr=$rr md_start=$md_start"
- }
-
- $out = "\0" x 4096;
- my($todo, $size);
- $todo = MD_AL_MAX_SIZE;
- while( $todo > 0 ) {
- $size = $todo < 4096 ? $todo : 4096;
- $rr = syswrite(GCF, $out, $size);
- if( $rr != $size ) {
- print "syswrite failed $rr\n";
- last;
- }
- $todo -= $size;
- }
- }
-
- ioctl(GCF,BLKFLSBUF,0); # Ask the buffer cache to forget this buffer.
-
- close(GCF);
-}
-
-sub main
-{
- my ($res, $opt, @other_args) = @_;
- my ($disk,$index,$del_al);
-
- if(!defined($res)) {
- print "USAGE: write_gc.pl resource-name [--del-al] counter-values...\n";
- exit 10;
- }
-
- if($opt eq "--del-al") {
- $del_al=1;
- } else {
- unshift @other_args,$opt;
- $del_al=0;
- }
-
- chomp($disk = `drbdadm sh-md-dev $res`);
- chomp($index = `drbdadm sh-md-idx $res`);
-
- write_gc_file($disk,$index,$del_al, at other_args);
-
-}
-
-
-main(@ARGV);
Modified: trunk/user/drbdmeta.c
===================================================================
--- trunk/user/drbdmeta.c 2004-10-19 07:32:21 UTC (rev 1598)
+++ trunk/user/drbdmeta.c 2004-10-19 08:09:02 UTC (rev 1599)
@@ -90,6 +90,8 @@
#define MD_RESERVED_SIZE_07 ( (__u64)128 * (1<<20) )
#define MD_BM_MAX_SIZE_07 ( MD_RESERVED_SIZE_07 - MD_BM_OFFSET_07*512 )
+#define DRBD_MD_MAGIC_08 (DRBD_MAGIC+4)
+
#define DRBD_MD_MAGIC_06 (DRBD_MAGIC+2)
enum MetaDataFlags {
@@ -118,13 +120,13 @@
struct meta_data {
__u32 gc[GEN_CNT_SIZE]; /* v06 */
- __u64 la_size; /* v07 */
- int bm_size; /* v07 */
- unsigned long *bitmap; /* v07 */
- int al_size; /* v07 */
- unsigned int *act_log; /* not yet implemented... */
+ __u64 la_size; /* v07 [ units of KB ] */
+ int bm_size; /* v07 */
+ unsigned long *bitmap; /* v07 */
+ int al_size; /* v07 */
+ unsigned int *act_log; /* not yet implemented... */
- unsigned long bits_set; /* additional info, set by fopts->read() */
+ unsigned long bits_set; /* additional info, set by fopts->read() */
};
/*
@@ -473,6 +475,125 @@
******************************************/
/******************************************
+ begin of v08 {
+ ******************************************/
+
+int v08_read(struct format * config, struct meta_data *);
+int v08_write(struct format * config, struct meta_data *, int init_al);
+
+int v08_read(struct format * config, struct meta_data * m)
+{
+ struct format_07* cfg = &config->d.f07;
+ struct meta_data_on_disk_07 buffer;
+ int rr,i,bmw;
+ __u64 offset = v07_offset(cfg);
+
+ if(lseek64(cfg->fd,offset,SEEK_SET) == -1) {
+ PERROR("lseek() failed");
+ return 0;
+ }
+
+ rr = read(cfg->fd, &buffer, sizeof(struct meta_data_on_disk_07));
+ if( rr != sizeof(struct meta_data_on_disk_07)) {
+ PERROR("read failed");
+ return 0;
+ }
+
+ if( __be32_to_cpu(buffer.magic) != DRBD_MD_MAGIC_08 ) {
+ fprintf(stderr,"Magic number not found\n");
+ return 0;
+ }
+
+ if( __be32_to_cpu(buffer.al_offset) != MD_AL_OFFSET_07 ) {
+ fprintf(stderr,"Magic number (al_offset) not found\n");
+ return 0;
+ }
+
+ if( __be32_to_cpu(buffer.bm_offset) != MD_BM_OFFSET_07 ) {
+ fprintf(stderr,"Magic number (bm_offset) not found\n");
+ return 0;
+ }
+
+ for (i = Flags; i < GEN_CNT_SIZE; i++)
+ m->gc[i] = __be32_to_cpu(buffer.gc[i]);
+
+ m->la_size = __be64_to_cpu(buffer.la_size) / 2 ;
+
+ if(m->bitmap) {
+ bmw = bm_words(m->la_size);
+
+ offset = offset + 512 * MD_BM_OFFSET_07;
+ if(lseek64(cfg->fd, offset, SEEK_SET) == -1) {
+ PERROR("lseek() failed");
+ return 0;
+ }
+
+ rr = read(cfg->fd, m->bitmap, bmw*sizeof(long));
+ if( rr != bmw*sizeof(long) ) {
+ PERROR("read failed");
+ return 0;
+ }
+
+ m->bm_size = bmw*sizeof(long);
+ m->bits_set = from_lel(m->bitmap,bmw);
+ }
+
+ return 1;
+}
+
+int v08_write(struct format * config, struct meta_data * m, int init_al)
+{
+ struct format_07* cfg = &config->d.f07;
+ struct meta_data_on_disk_07 buffer;
+ int rr,i;
+ __u64 offset = v07_offset(cfg);
+
+ buffer.magic = __cpu_to_be32( DRBD_MD_MAGIC_08 );
+ buffer.al_offset = __cpu_to_be32( MD_AL_OFFSET_07 );
+ buffer.bm_offset = __cpu_to_be32( MD_BM_OFFSET_07 );
+
+ for (i = Flags; i < GEN_CNT_SIZE; i++)
+ buffer.gc[i] = __cpu_to_be32(m->gc[i]);
+
+ buffer.la_size = __cpu_to_be64(m->la_size * 2);
+
+ if(lseek64(cfg->fd,offset,SEEK_SET) == -1) {
+ PERROR("lseek() failed");
+ return 0;
+ }
+
+ rr = write(cfg->fd, &buffer, sizeof(struct meta_data_on_disk_07));
+ if( rr != sizeof(struct meta_data_on_disk_07)) {
+ PERROR("write failed");
+ return 0;
+ }
+
+ if(lseek64(cfg->fd,offset + 512 * MD_BM_OFFSET_07 ,SEEK_SET) == -1) {
+ PERROR("lseek() failed");
+ return 0;
+ }
+
+ to_lel(m->bitmap, m->bm_size/sizeof(long) );
+
+ rr = write(cfg->fd, m->bitmap, m->bm_size);
+ if( rr != m->bm_size) {
+ PERROR("write failed");
+ return 0;
+ }
+
+ from_lel(m->bitmap, m->bm_size/sizeof(long) );
+
+ if( init_al ) {
+ /* TODO; */
+ }
+
+ return 1;
+}
+/******************************************
+ } end of v08
+ ******************************************/
+
+/******************************************
begin of v06 {
******************************************/
struct __attribute__((packed)) meta_data_on_disk_06 {
@@ -619,7 +740,18 @@
v07_md_alloc,
v07_read,
v07_write
+ },
+ { "v08",
+ (char *[]) { "device","index",0 },
+ sizeof(struct format_07),
+ v07_parse,
+ v07_open,
+ v07_close,
+ v07_md_alloc,
+ v08_read,
+ v08_write
}
+
};
struct meta_cmd {
More information about the drbd-cvs
mailing list