]> git.ipfire.org Git - thirdparty/mdadm.git/commitdiff
User space RAID-6 access fix
authorPiergiorgio Sartor <piergiorgio.sartor@nexgo.de>
Fri, 18 Feb 2011 12:51:19 +0000 (23:51 +1100)
committerNeilBrown <neilb@suse.de>
Fri, 18 Feb 2011 12:51:19 +0000 (23:51 +1100)
> 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 <neilb@suse.de>
restripe.c

index 241e3a4ca438c11a5c2a595a78604a807827e986..a26f9e52f134a0e87daf1f77f5562329f6fd173e 100644 (file)
@@ -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: