From: NeilBrown Date: Mon, 21 Oct 2013 22:55:04 +0000 (+1100) Subject: Assembe: fix bug in force_array - it wasn't forcing properly. X-Git-Tag: mdadm-3.3.1~100 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=f81a2b56c4b437f66aaf5582a9c6b7f5ab2103c4;p=thirdparty%2Fmdadm.git 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 Signed-off-by: NeilBrown --- 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