[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