From: NeilBrown Date: Mon, 20 Jul 2015 07:15:13 +0000 (+1000) Subject: restripe: fix data block order in raid6_2_data_recov X-Git-Tag: mdadm-3.3.3~11 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=eae01ef02fe3a7dd9b71129343f905ac212c6658;p=thirdparty%2Fmdadm.git 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 --- diff --git a/raid6check.c b/raid6check.c index f0194405..b2e17323 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 1c859a30..4d921904 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);