summaryrefslogtreecommitdiff
path: root/Assemble.c
diff options
context:
space:
mode:
authorNeilBrown <neilb@suse.de>2013-10-22 09:55:04 +1100
committerNeilBrown <neilb@suse.de>2013-10-22 09:55:04 +1100
commitf81a2b56c4b437f66aaf5582a9c6b7f5ab2103c4 (patch)
treecb784ba4c97ccf8f24f9f0441a58346657243158 /Assemble.c
parenta4921f30ec2ecc2d685573899cb86064b0cd78e9 (diff)
Assembe: fix bug in force_array - it wasn't forcing properly.
Since 'best' was expanded to hold replacement devices, we might need to go up to raid_disks*2 to find devices to force. Also fix another place when considering replacement drives would be wrong (the 'chosen' device should never be a replacement). Reported-by: John Yates <jyates65@gmail.com> Signed-off-by: NeilBrown <neilb@suse.de>
Diffstat (limited to 'Assemble.c')
-rw-r--r--Assemble.c10
1 files changed, 7 insertions, 3 deletions
diff --git a/Assemble.c b/Assemble.c
index 86b4c894..4d5ceeac 100644
--- a/Assemble.c
+++ b/Assemble.c
@@ -803,7 +803,9 @@ static int force_array(struct mdinfo *content,
int chosen_drive = -1;
int i;
- for (i = 0; i < content->array.raid_disks && i < bestcnt; i++) {
+ for (i = 0;
+ i < content->array.raid_disks * 2 && i < bestcnt;
+ i += 2) {
int j = best[i];
if (j>=0 &&
!devices[j].uptodate &&
@@ -863,7 +865,9 @@ static int force_array(struct mdinfo *content,
/* If there are any other drives of the same vintage,
* add them in as well. We can't lose and we might gain
*/
- for (i = 0; i < content->array.raid_disks && i < bestcnt ; i++) {
+ for (i = 0;
+ i < content->array.raid_disks * 2 && i < bestcnt ;
+ i += 2) {
int j = best[i];
if (j >= 0 &&
!devices[j].uptodate &&
@@ -1528,7 +1532,7 @@ try_again:
*/
chosen_drive = -1;
st->ss->free_super(st);
- for (i=0; chosen_drive < 0 && i<bestcnt; i++) {
+ for (i=0; chosen_drive < 0 && i<bestcnt; i+=2) {
int j = best[i];
int fd;