File 0094-restripe-fix-data-block-order-in-raid6_2_data_recov.patch of Package mdadm.5365

From eae01ef02fe3a7dd9b71129343f905ac212c6658 Mon Sep 17 00:00:00 2001
From: NeilBrown <neilb@suse.de>
Date: Mon, 20 Jul 2015 17:15:13 +1000
Subject: [PATCH 137/359] restripe: fix data block order in raid6_2_data_recov
References: bsc#1081910

... rather than relying on the caller getting them in the
correct order.
This is better engineering and fixes a bug, but because the
failed_slotX numbers are used later with assumption that
they weren't swapped

Signed-off-by: NeilBrown <neilb@suse.de>
Signed-off-by: Coly Li <colyli@suse.de>

---
 raid6check.c |  5 -----
 restripe.c   | 11 ++++++-----
 2 files changed, 6 insertions(+), 10 deletions(-)

diff --git a/raid6check.c b/raid6check.c
index f019440..b2e1732 100644
--- a/raid6check.c
+++ b/raid6check.c
@@ -271,11 +271,6 @@ int manual_repair(int chunk_size, int syndrome_disks,
 					  failed_data, (uint8_t**)blocks, 1);
 		} else {
 			printf("Repairing D and D\n");
-			if (failed_slot1 > failed_slot2) {
-				int t = failed_slot1;
-				failed_slot1 = failed_slot2;
-				failed_slot2 = t;
-			}
 			raid6_2data_recov(syndrome_disks+2, chunk_size,
 					  failed_slot1, failed_slot2,
 					  (uint8_t**)blocks, 1);
diff --git a/restripe.c b/restripe.c
index 1c859a3..4d92190 100644
--- a/restripe.c
+++ b/restripe.c
@@ -354,6 +354,12 @@ void raid6_2data_recov(int disks, size_t bytes, int faila, int failb,
 	const uint8_t *pbmul;	/* P multiplier table for B data */
 	const uint8_t *qmul;		/* Q multiplier table (for both) */
 
+	if (faila > failb) {
+		int t = faila;
+		faila = failb;
+		failb = t;
+	}
+
 	if (neg_offset) {
 		p = ptrs[-1];
 		q = ptrs[-2];
@@ -651,11 +657,6 @@ int save_stripes(int *source, unsigned long long *offsets,
 				raid6_datap_recov(syndrome_disks+2, chunk_size,
 						  fdisk[0], bufs, 0);
 			else {
-				if (fdisk[0] > fdisk[1]) {
-					int t = fdisk[0];
-					fdisk[0] = fdisk[1];
-					fdisk[1] = t;
-				}
 				/* Two data blocks failed, P,Q OK */
 				raid6_2data_recov(syndrome_disks+2, chunk_size,
 						  fdisk[0], fdisk[1], bufs, 0);
-- 
2.16.1

openSUSE Build Service is sponsored by