From eae01ef02fe3a7dd9b71129343f905ac212c6658 Mon Sep 17 00:00:00 2001 From: NeilBrown Date: Mon, 20 Jul 2015 17:15:13 +1000 Subject: [PATCH] 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 --- 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);