[DRBD-cvs] svn commit by phil - r2151 - trunk/user - Two minor fixes. * la_size_sect might be 10 digits. * i

drbd-cvs at lists.linbit.com drbd-cvs at lists.linbit.com
Tue Apr 18 21:43:25 CEST 2006


Author: phil
Date: 2006-04-18 21:43:24 +0200 (Tue, 18 Apr 2006)
New Revision: 2151

Modified:
   trunk/user/drbdmeta.c
   trunk/user/drbdmeta_scanner.fl
Log:
Two minor fixes.
 * la_size_sect might be 10 digits.
 * in case la_size_sect is change by hand, we need to mmap() big enough.


Modified: trunk/user/drbdmeta.c
===================================================================
--- trunk/user/drbdmeta.c	2006-04-18 17:02:51 UTC (rev 2150)
+++ trunk/user/drbdmeta.c	2006-04-18 19:43:24 UTC (rev 2151)
@@ -799,12 +799,24 @@
 	return ok;
 }
 
-unsigned long bm_words(u64 sectors)
+int int_ln2(int v)
 {
+	int r=0;
+
+	while((v = v>>1)) r++;
+
+	return r;
+}
+
+unsigned long bm_words(u64 sectors, int bytes_per_bit)
+{
 	unsigned long long bits;
 	unsigned long long words;
+	int shift;
 
-	bits = ALIGN(sectors, 8) >> 3;
+	shift = 9 - int_ln2(bytes_per_bit);
+
+	bits = ALIGN(sectors, 8) >> shift;
 	words = ALIGN(bits, 64) >> LN2_BPL;
 
 	return words;
@@ -902,8 +914,13 @@
 
 	cfg->al_offset = cfg->md_offset + cfg->md.al_offset * 512;
 	cfg->bm_offset = cfg->md_offset + cfg->md.bm_offset * 512;
-	cfg->bm_mmaped_length = (u64)(cfg->md.md_size_sect - MD_BM_OFFSET_07)*512;
 
+#define max(x,y) ((x) > (y) ? (x) : (y))
+	// For the case that someone modified la_sect by hand..
+	cfg->bm_mmaped_length = 
+		max((u64)(cfg->md.md_size_sect - MD_BM_OFFSET_07)*512,
+		    (u64)bm_words(cfg->md.la_sect, cfg->md.bm_bytes_per_bit)<<(LN2_BPL-3));
+
 	//fprintf(stderr,"al_offset: "U64" (%d)\n", cfg->al_offset, cfg->md.al_offset);
 	//fprintf(stderr,"bm_offset: "U64" (%d)\n", cfg->bm_offset, cfg->md.bm_offset);
 	//fprintf(stderr,"bm_mmaped_length: %lu\n",(unsigned long)cfg->bm_mmaped_length);
@@ -916,7 +933,7 @@
 	cfg->on_disk.bm = MMAP(cfg->on_disk.bm, cfg->bm_mmaped_length, PROT_READ | PROT_WRITE,
 			       MAP_SHARED, cfg->md_fd, cfg->bm_offset);
 
-	words = bm_words(cfg->md.la_sect);
+	words = bm_words(cfg->md.la_sect, cfg->md.bm_bytes_per_bit);
 	cfg->bm_bytes = words * sizeof(long);
 	cfg->bits_set =
 	    count_bits((const unsigned long *)cfg->on_disk.bm, words);

Modified: trunk/user/drbdmeta_scanner.fl
===================================================================
--- trunk/user/drbdmeta_scanner.fl	2006-04-18 17:02:51 UTC (rev 2150)
+++ trunk/user/drbdmeta_scanner.fl	2006-04-18 19:43:24 UTC (rev 2151)
@@ -16,7 +16,7 @@
 
 WS		[ \t\n]
 COMMENT		\#[^\n]*
-NUM		[0-9]{1,9}
+NUM		[0-9]{1,10}
 U64		0x[0-9A-Fa-f]{16}
 U32		0x[0-9A-Fa-f]{8}
 OP		[{};]



More information about the drbd-cvs mailing list