File Assembe-fix-bug-in-force_array-it-wasn-t-forcing-pro.patch of Package mdadm.2874

From f81a2b56c4b437f66aaf5582a9c6b7f5ab2103c4 Mon Sep 17 00:00:00 2001
From: NeilBrown <neilb@suse.de>
Date: Tue, 22 Oct 2013 09:55:04 +1100
Subject: [PATCH] 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>
---
 Assemble.c | 10 +++++++---
 1 file changed, 7 insertions(+), 3 deletions(-)

diff --git a/Assemble.c b/Assemble.c
index 86b4c894b260..4d5ceeac8674 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;
 
-- 
1.8.3.1.487.g3e7a5b4

openSUSE Build Service is sponsored by