From 265e0f17317e6d23864263c04ae581b35f946b5e Mon Sep 17 00:00:00 2001 From: Neil Brown Date: Mon, 12 Sep 2005 04:57:52 +0000 Subject: Fix assembling of raid10 in the face of missing devices. We now check if enough devices are present properly, so --force can be used to good effect. Signed-off-by: Neil Brown --- util.c | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) (limited to 'util.c') diff --git a/util.c b/util.c index db4fbf3..e702b8d 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; -- cgit