]> git.ipfire.org Git - thirdparty/grub.git/commitdiff
raid6: Optimize by removing division.
authorVladimir Serbinenko <phcoder@gmail.com>
Thu, 26 Feb 2015 21:07:22 +0000 (22:07 +0100)
committerVladimir Serbinenko <phcoder@gmail.com>
Thu, 26 Feb 2015 21:07:22 +0000 (22:07 +0100)
grub-core/disk/raid6_recover.c

index f9ec632fb23de952c972577465868febfda8a67a..aa674f6ca4db56c987794679975a68535a3131ba 100644 (file)
@@ -63,6 +63,16 @@ grub_raid6_init_table (void)
     }
 }
 
+static unsigned
+mod_255 (unsigned x)
+{
+  while (x > 0xff)
+    x = (x >> 8) + (x & 0xff);
+  if (x == 0xff)
+    return 0;
+  return x;
+}
+
 static grub_err_t
 grub_raid6_recover (struct grub_diskfilter_segment *array, int disknr, int p,
                     char *buf, grub_disk_addr_t sector, grub_size_t size)
@@ -162,11 +172,11 @@ grub_raid6_recover (struct grub_diskfilter_segment *array, int disknr, int p,
 
       grub_crypto_xor (qbuf, qbuf, buf, size);
 
-      c = ((255 ^ bad1)
-          + (255 ^ powx_inv[(powx[bad2 + (bad1 ^ 255)] ^ 1)])) % 255;
+      c = mod_255((255 ^ bad1)
+                 + (255 ^ powx_inv[(powx[bad2 + (bad1 ^ 255)] ^ 1)]));
       grub_raid_block_mulx (c, qbuf, size);
 
-      c = ((unsigned) bad2 + c) % 255;
+      c = mod_255((unsigned) bad2 + c);
       grub_raid_block_mulx (c, pbuf, size);
 
       grub_crypto_xor (pbuf, pbuf, qbuf, size);