summaryrefslogtreecommitdiffstats
path: root/util.c
diff options
context:
space:
mode:
authorNeil Brown <neilb@suse.de>2005-09-05 01:14:26 +0000
committerNeil Brown <neilb@suse.de>2005-09-05 01:14:26 +0000
commit6e6dc574d60f108fdc49f3b755d9baeec1335ba2 (patch)
tree770cdad9dfa89f9e00b53aa10b59fe88a9f669ad /util.c
parentbaa2cd47e56f0a387685fb923ce9663b42df9fc2 (diff)
downloadmdadm-stable-1.tar.gz
mdadm-stable-1.tar.xz
mdadm-stable-1.zip
Fix assembling of raid10 in the face of missing devices.stable-1
We now check if enough devices are present properly, so --force can be used to good effect. Signed-off-by: Neil Brown <neilb@suse.de>
Diffstat (limited to 'util.c')
-rw-r--r--util.c25
1 files changed, 23 insertions, 2 deletions
diff --git a/util.c b/util.c
index 5bac0ec..e94edc8 100644
--- a/util.c
+++ b/util.c
@@ -118,10 +118,31 @@ int get_linux_version()
return (a*1000000)+(b*1000)+c;
}
-int enough(int level, int raid_disks, int avail_disks)
+int enough(int level, int raid_disks, int layout,
+ char *avail, int avail_disks)
{
+ int copies, first;
switch (level) {
- case 10: return 1; /* a lie, but it is hard to tell */
+ case 10:
+ /* This is the tricky one - we need to check
+ * which actual disks are present.
+ */
+ copies = (layout&255)* (layout>>8);
+ first=0;
+ do {
+ /* there must be one of the 'copies' form 'first' */
+ int n = copies;
+ int cnt=0;
+ while (n--) {
+ if (avail[first])
+ cnt++;
+ first = (first+1) % raid_disks;
+ }
+ if (cnt == 0)
+ return 0;
+
+ } while (first != 0);
+ return 1;
case -4:
return avail_disks>= 1;