From: Piergiorgio Sartor Date: Fri, 18 Feb 2011 12:51:19 +0000 (+1100) Subject: User space RAID-6 access fix X-Git-Tag: mdadm-3.2.1~108 X-Git-Url: http://git.neil.brown.name/?a=commitdiff_plain;h=c4db530180e77ecf3fe0920b0f5c563655859dc1;p=mdadm.git User space RAID-6 access fix > I have applied some patch - with some formatting changes to make it consistent > with the rest of the code. > > I don't really have time to look more deeply at it at the moment. > Maybe someone else will?... Hi Neil, thanks for including this in git. Actually I did it look at it :-) and I already found a couple of issues, below is a small fix patch. Signed-off-by: NeilBrown --- diff --git a/restripe.c b/restripe.c index 241e3a4c..a26f9e52 100644 --- a/restripe.c +++ b/restripe.c @@ -430,7 +430,8 @@ int raid6_check_disks(int data_disks, int start, int chunk_size, if((Px != 0) && (Qx != 0)) { - data_id = (raid6_gflog[Qx] - raid6_gflog[Px]) & 0xFF; + data_id = (raid6_gflog[Qx] - raid6_gflog[Px]); + if(data_id < 0) data_id += 255; diskD = geo_map(data_id, start/chunk_size, data_disks + 2, level, layout); curr_broken_disk = diskD; @@ -439,6 +440,9 @@ int raid6_check_disks(int data_disks, int start, int chunk_size, if((Px == 0) && (Qx == 0)) curr_broken_disk = curr_broken_disk; + if(curr_broken_disk >= data_disks + 2) + broken_status = 2; + switch(broken_status) { case 0: if(curr_broken_disk != -1) { @@ -450,10 +454,6 @@ int raid6_check_disks(int data_disks, int start, int chunk_size, case 1: if(curr_broken_disk != prev_broken_disk) broken_status = 2; - - if(curr_broken_disk >= data_disks + 2) - broken_status = 2; - break; case 2: