summaryrefslogtreecommitdiffstats
path: root/super1.c
diff options
context:
space:
mode:
Diffstat (limited to 'super1.c')
-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);