summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNeil Brown <neilb@suse.de>2007-05-08 17:15:33 +1000
committerNeil Brown <neilb@suse.de>2007-05-08 17:15:33 +1000
commit2fb749d1b7588985b1834e43de4ec5685d0b8d26 (patch)
treefbc2ecc4bf39372bb93e066a590ddfdf1a3fbb8b
parent0047d254e73dfb3a2074f16ce44994974162d9ce (diff)
downloadmdadm-2fb749d1b7588985b1834e43de4ec5685d0b8d26.tar.gz
mdadm-2fb749d1b7588985b1834e43de4ec5685d0b8d26.tar.xz
mdadm-2fb749d1b7588985b1834e43de4ec5685d0b8d26.zip
Fix up calculation of bitmap space when creating v1 metadata.
We have the same calculation in multiple places with subtle differences. So unite it all. Also fix up and endian problem in --examine.
-rw-r--r--super1.c51
1 files changed, 20 insertions, 31 deletions
diff --git a/super1.c b/super1.c
index 7de9b41..effed54 100644
--- a/super1.c
+++ b/super1.c
@@ -175,8 +175,8 @@ static void examine_super1(void *sbv, char *homehost)
printf(" Raid Devices : %d\n", __le32_to_cpu(sb->raid_disks));
printf("\n");
printf(" Used Dev Size : %llu%s\n",
- (unsigned long long)sb->data_size,
- human_size(sb->data_size<<9));
+ (unsigned long long)__le64_to_cpu(sb->data_size),
+ human_size(__le64_to_cpu(sb->data_size)<<9));
if (__le32_to_cpu(sb->level) >= 0) {
int ddsks=0;
switch(__le32_to_cpu(sb->level)) {
@@ -759,6 +759,18 @@ static int store_super1(struct supertype *st, int fd, void *sbv)
static int load_super1(struct supertype *st, int fd, void **sbp, char *devname);
+static unsigned long choose_bm_space(unsigned long devsize)
+{
+ /* if the device is bigger than 8Gig, save 64k for bitmap usage,
+ * if bigger than 200Gig, save 128k
+ */
+ if (devsize - 64*2 >= 200*1024*1024*2)
+ return 128*2;
+ if (devsize - 4*2 > 8*1024*1024*2)
+ return 64*2;
+ return 4*2;
+}
+
static int write_init_super1(struct supertype *st, void *sbv,
mdu_disk_info_t *dinfo, char *devname)
{
@@ -769,7 +781,6 @@ static int write_init_super1(struct supertype *st, void *sbv,
int rv;
int bm_space;
- unsigned long space;
unsigned long long dsize, array_size;
long long sb_offset;
@@ -832,12 +843,7 @@ static int write_init_super1(struct supertype *st, void *sbv,
*/
array_size = __le64_to_cpu(sb->size);
/* work out how much space we left of a bitmap */
- if (array_size >= 200*1024*1024*2)
- bm_space = 128*2;
- else if (array_size > 8*1024*1024*2)
- bm_space = 64*2;
- else
- bm_space = 0;
+ bm_space = choose_bm_space(array_size);
switch(st->minor_version) {
case 0:
@@ -855,10 +861,6 @@ static int write_init_super1(struct supertype *st, void *sbv,
break;
case 2:
sb_offset = 4*2;
- if (dsize - 4*2 - 64*2 >= array_size && array_size > 8*1024*1024*2)
- space = 64*2;
- else
- space = 4*2;
sb->super_offset = __cpu_to_le64(4*2);
sb->data_offset = __cpu_to_le64(4*2 + 4*2 + bm_space);
sb->data_size = __cpu_to_le64(dsize - 4*2 - 4*2 - bm_space );
@@ -1103,13 +1105,7 @@ static __u64 avail_size1(struct supertype *st, __u64 devsize)
if (devsize < 24)
return 0;
- /* if the device is bigger than 8Gig, save 64k for bitmap usage,
- * if bigger than 200Gig, save 128k
- */
- if (devsize-64*2 >= 200*1024*1024*2)
- devsize -= 128*2;
- else if (devsize >= 8*1024*1024*2)
- devsize -= 64*2;
+ devsize -= choose_bm_space(devsize);
switch(st->minor_version) {
case 0:
@@ -1161,11 +1157,9 @@ add_internal_bitmap1(struct supertype *st, void *sbv,
* been left.
*/
offset = 0;
- if (__le64_to_cpu(sb->size) >= 200*1024*1024*2)
- room = 128*2;
- else if (__le64_to_cpu(sb->size) > 8*1024*1024*2)
- room = 64*2;
- else {
+ room = choose_bm_space(__le64_to_cpu(sb->size));
+ if (room == 4*2) {
+ /* make it 3K after the superblock */
room = 3*2;
offset = 2;
}
@@ -1187,12 +1181,7 @@ add_internal_bitmap1(struct supertype *st, void *sbv,
case 2: /* between superblock and data */
if (may_change) {
offset = 4*2;
- if (__le64_to_cpu(sb->size) >= 200*1024*1024*2)
- room = 128*2;
- else if (__le64_to_cpu(sb->size) > 8*1024*1024*2)
- room = 64*2;
- else
- room = 3*2;
+ room = choose_bm_space(__le64_to_cpu(sb->size));
} else {
room = __le64_to_cpu(sb->data_offset)
- __le64_to_cpu(sb->super_offset);