[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