summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNeilBrown <neilb@suse.de>2012-09-27 16:58:44 +1000
committerNeilBrown <neilb@suse.de>2012-09-27 16:58:44 +1000
commit2117ad1dd1b79cf6d02a065d9e38076aa9f4788d (patch)
treecfe84fd1a905bf51178265cb0768777e20d7cdae
parentaec89f63e98322a141d146a84c67b0cc2d1cd1a4 (diff)
downloadmdadm-2117ad1dd1b79cf6d02a065d9e38076aa9f4788d.tar.gz
Fix 'enough' function for RAID10.
The 'enough' function is written to work with 'near' arrays only in that is implicitly assumes that the offset from one 'group' of devices to the next is the same as the number of copies. In reality it is the number of 'near' copies. So change it to make this number explicit. Reported-by: Jakub Husák <jakub@gooseman.cz> Signed-off-by: NeilBrown <neilb@suse.de>
-rw-r--r--util.c7
1 files changed, 4 insertions, 3 deletions
diff --git a/util.c b/util.c
index 83f3187..eef0d6f 100644
--- a/util.c
+++ b/util.c
@@ -332,14 +332,15 @@ int enough(int level, int raid_disks, int layout, int clean, char *avail)
/* there must be one of the 'copies' form 'first' */
int n = copies;
int cnt=0;
+ int this = first;
while (n--) {
- if (avail[first])
+ if (avail[this])
cnt++;
- first = (first+1) % raid_disks;
+ this = (this+1) % raid_disks;
}
if (cnt == 0)
return 0;
-
+ first = (first+(layout&255)) % raid_disks;
} while (first != 0);
return 1;