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>
This commit is contained in:
NeilBrown 2013-10-22 09:55:04 +11:00
parent a4921f30ec
commit f81a2b56c4
1 changed files with 7 additions and 3 deletions

View File

@ -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;