diff options
author | Neil Brown <neilb@suse.de> | 2005-09-05 01:14:26 +0000 |
---|---|---|
committer | Neil Brown <neilb@suse.de> | 2005-09-05 01:14:26 +0000 |
commit | 6e6dc574d60f108fdc49f3b755d9baeec1335ba2 (patch) | |
tree | 770cdad9dfa89f9e00b53aa10b59fe88a9f669ad /util.c | |
parent | baa2cd47e56f0a387685fb923ce9663b42df9fc2 (diff) | |
download | mdadm-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.c | 25 |
1 files changed, 23 insertions, 2 deletions
@@ -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; |