summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNeilBrown <neilb@suse.de>2015-07-20 17:15:13 +1000
committerNeilBrown <neilb@suse.de>2015-07-20 17:15:13 +1000
commiteae01ef02fe3a7dd9b71129343f905ac212c6658 (patch)
tree40503f4280c23a0a2366c9063022105f932b39b9
parent50786d4731bd1768f02348435c6f654f566c581b (diff)
downloadmdadm-eae01ef02fe3a7dd9b71129343f905ac212c6658.tar.gz
restripe: fix data block order in raid6_2_data_recov
... 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>
-rw-r--r--raid6check.c5
-rw-r--r--restripe.c11
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);