summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNeil Brown <neilb@suse.de>2007-08-20 14:14:25 +1000
committerNeil Brown <neilb@suse.de>2007-08-20 14:14:25 +1000
commit005debfc11b4cbe653503667423df98b64e5be0e (patch)
tree539d8b658f5d4f2ef5b23d204673209d69b3b6c6
parent85375d6de14581ca9641ceed15f1c36b65601364 (diff)
downloadmdadm-005debfc11b4cbe653503667423df98b64e5be0e.tar.gz
mdadm-005debfc11b4cbe653503667423df98b64e5be0e.tar.xz
mdadm-005debfc11b4cbe653503667423df98b64e5be0e.zip
Fix problem with add a device to a 1.x array created with older mdadm.
When adding new disk to an array, don't reserve so much bitmap space that the disk cannot store the required data. (Needed when 1.x array was created with older mdadm).
-rw-r--r--ANNOUNCE-2.6.30
-rw-r--r--ChangeLog3
-rw-r--r--crc32.c0
-rw-r--r--crc32.h0
-rw-r--r--super-ddf.c0
-rw-r--r--super1.c4
6 files changed, 7 insertions, 0 deletions
diff --git a/ANNOUNCE-2.6.3 b/ANNOUNCE-2.6.3
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/ANNOUNCE-2.6.3
diff --git a/ChangeLog b/ChangeLog
index 10ddcf0..71d19f4 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,8 @@
Changes Prior to this release
- allow --write-behind to be set for --grow.
+ - When adding new disk to an array, don't reserve so much bitmap
+ space that the disk cannot store the required data. (Needed when
+ 1.x array was created with older mdadm).
Changes Prior to 2.6.2 release
- --fail detached and --remove faulty can be used to fail and
diff --git a/crc32.c b/crc32.c
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/crc32.c
diff --git a/crc32.h b/crc32.h
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/crc32.h
diff --git a/super-ddf.c b/super-ddf.c
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/super-ddf.c
diff --git a/super1.c b/super1.c
index 0ff11fb..cf46a2f 100644
--- a/super1.c
+++ b/super1.c
@@ -917,12 +917,16 @@ static int write_init_super1(struct supertype *st, void *sbv,
break;
case 1:
sb->super_offset = __cpu_to_le64(0);
+ if (4*2 + bm_space + __le64_to_cpu(sb->size) > dsize)
+ bm_space = dsize - __le64_to_cpu(sb->size) - 4*2;
sb->data_offset = __cpu_to_le64(bm_space + 4*2);
sb->data_size = __cpu_to_le64(dsize - bm_space - 4*2);
break;
case 2:
sb_offset = 4*2;
sb->super_offset = __cpu_to_le64(4*2);
+ if (4*2 + 4*2 + bm_space + __le64_to_cpu(sb->size) > dsize)
+ bm_space = dsize - __le64_to_cpu(sb->size) - 4*2 - 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 );
break;