]> git.ipfire.org Git - thirdparty/mdadm.git/commitdiff
Add test for --update=metadata and fix bug it found.
authorNeilBrown <neilb@suse.de>
Wed, 19 Jun 2013 06:28:05 +0000 (16:28 +1000)
committerNeilBrown <neilb@suse.de>
Wed, 19 Jun 2013 06:28:05 +0000 (16:28 +1000)
We were not setting device size correctly for raid0.

Signed-off-by: NeilBrown <neilb@suse.de>
super1.c
tests/04update-metadata [new file with mode: 0644]

index 918357cea82d3339b121c58baefc19db94af7e75..16dfd389e09ca13bb370422b0094f98ce7fcda1f 100644 (file)
--- a/super1.c
+++ b/super1.c
@@ -2320,7 +2320,10 @@ void *super1_make_v0(struct supertype *st, struct mdinfo *info, mdp_super_t *sb0
        sb->size = __cpu_to_le64(info->component_size);
        sb->chunksize = __cpu_to_le32(info->array.chunk_size/512);
        sb->raid_disks = __cpu_to_le32(info->array.raid_disks);
-       sb->data_size = sb->size;
+       if (info->array.level > 0)
+               sb->data_size = sb->size;
+       else
+               sb->data_size = st->ss->avail_size(st, st->devsize/512, 0);
        sb->resync_offset = MaxSector;
        sb->max_dev = __cpu_to_le32(MD_SB_DISKS);
        sb->dev_number = __cpu_to_le32(info->disk.number);
diff --git a/tests/04update-metadata b/tests/04update-metadata
new file mode 100644 (file)
index 0000000..10bb70f
--- /dev/null
@@ -0,0 +1,48 @@
+set -xe
+
+# test converting v0.90 to v1.0
+# check for different levels
+# check it fails for non-v0.90
+# check it fails during reshape or recovery
+# check it fails when bitmap is present
+
+dlist="$dev0 $dev1 $dev2 $dev3"
+
+for ls in raid0/4 linear/4 raid1/1 raid5/3 raid6/2
+do
+  s=${ls#*/} l=${ls%/*}
+  mdadm -CR --assume-clean -e 0.90 $md0 --level $l -n 4 -c 64 $dlist
+  testdev $md0 $s 19904 64
+  mdadm -S $md0
+  mdadm -A $md0 --update=metadata $dlist
+  testdev $md0 $s 19904 64 check
+  mdadm -S $md0
+done
+
+if mdadm -A $md0 --update=metadata $dlist
+then echo >&2 should fail with v1.0 metadata
+     exit 1
+fi
+
+mdadm -CR -e 0.90 $md0 --level=6 -n4 -c32 $dlist
+mdadm -S $md0
+
+if mdadm -A $md0 --update=metadata $dlist
+then echo >&2 should fail during resync
+     exit 1
+fi
+mdadm -A $md0 $dlist
+mdadm --wait $md0
+mdadm -S $md0
+
+# should succeed now
+mdadm -A $md0 --update=metadata $dlist
+
+mdadm -S /dev/md0
+mdadm -CR --assume-clean -e 0.90 $md0 --level=6 -n4 -c32 $dlist --bitmap=internal
+mdadm -S $md0
+
+if mdadm -A $md0 --update=metadata $dlist
+then echo >&2 should fail when bitmap present
+     exit 1
+fi