a5bd9f6
From af8a6a082c9ac9fab22f3eff9e81b5e7085debc4 Mon Sep 17 00:00:00 2001
a5bd9f6
From: Vladimir 'phcoder' Serbinenko <phcoder@gmail.com>
a5bd9f6
Date: Sat, 5 Jan 2013 18:37:34 +0100
a5bd9f6
Subject: [PATCH 087/364] 	* grub-core/fs/ext2.c (grub_ext2_read_block):
a5bd9f6
 Use shifts rather than 	divisions.
a5bd9f6
a5bd9f6
---
a5bd9f6
 ChangeLog           |  5 +++++
a5bd9f6
 grub-core/fs/ext2.c | 30 ++++++++++++++++--------------
a5bd9f6
 2 files changed, 21 insertions(+), 14 deletions(-)
a5bd9f6
a5bd9f6
diff --git a/ChangeLog b/ChangeLog
a5bd9f6
index 88fd763..af29161 100644
a5bd9f6
--- a/ChangeLog
a5bd9f6
+++ b/ChangeLog
a5bd9f6
@@ -1,5 +1,10 @@
a5bd9f6
 2013-01-05  Vladimir Serbinenko  <phcoder@gmail.com>
a5bd9f6
 
a5bd9f6
+	* grub-core/fs/ext2.c (grub_ext2_read_block): Use shifts rather than
a5bd9f6
+	divisions.
a5bd9f6
+
a5bd9f6
+2013-01-05  Vladimir Serbinenko  <phcoder@gmail.com>
a5bd9f6
+
a5bd9f6
 	* grub-core/fs/ntfs.c: Eliminate useless divisions in favor of shifts.
a5bd9f6
 	* grub-core/fs/ntfscomp.c: Likewise.
a5bd9f6
 	* include/grub/ntfs.h (grub_ntfs_data): Replace spc with log_spc.
a5bd9f6
diff --git a/grub-core/fs/ext2.c b/grub-core/fs/ext2.c
a5bd9f6
index bd1ab24..cf2e2f4 100644
a5bd9f6
--- a/grub-core/fs/ext2.c
a5bd9f6
+++ b/grub-core/fs/ext2.c
a5bd9f6
@@ -454,11 +454,12 @@ grub_ext2_read_block (grub_fshelp_node_t node, grub_disk_addr_t fileblock)
a5bd9f6
       blknr = grub_le_to_cpu32 (indir[fileblock - INDIRECT_BLOCKS]);
a5bd9f6
     }
a5bd9f6
   /* Double indirect.  */
a5bd9f6
-  else if (fileblock < INDIRECT_BLOCKS + blksz / 4 * (blksz / 4 + 1))
a5bd9f6
+  else if (fileblock < INDIRECT_BLOCKS
a5bd9f6
+	   + blksz / 4 * ((grub_disk_addr_t) blksz / 4 + 1))
a5bd9f6
     {
a5bd9f6
-      unsigned int perblock = blksz / 4;
a5bd9f6
-      unsigned int rblock = fileblock - (INDIRECT_BLOCKS
a5bd9f6
-					 + blksz / 4);
a5bd9f6
+      int log_perblock = log2_blksz + 9 - 2;
a5bd9f6
+      grub_disk_addr_t rblock = fileblock - (INDIRECT_BLOCKS
a5bd9f6
+					     + blksz / 4);
a5bd9f6
       grub_uint32_t indir[blksz / 4];
a5bd9f6
 
a5bd9f6
       if (grub_disk_read (data->disk,
a5bd9f6
@@ -470,21 +471,22 @@ grub_ext2_read_block (grub_fshelp_node_t node, grub_disk_addr_t fileblock)
a5bd9f6
 
a5bd9f6
       if (grub_disk_read (data->disk,
a5bd9f6
 			  ((grub_disk_addr_t)
a5bd9f6
-			   grub_le_to_cpu32 (indir[rblock / perblock]))
a5bd9f6
+			   grub_le_to_cpu32 (indir[rblock >> log_perblock]))
a5bd9f6
 			  << log2_blksz,
a5bd9f6
 			  0, blksz, indir))
a5bd9f6
 	return grub_errno;
a5bd9f6
 
a5bd9f6
 
a5bd9f6
-      blknr = grub_le_to_cpu32 (indir[rblock % perblock]);
a5bd9f6
+      blknr = grub_le_to_cpu32 (indir[rblock & ((1 << log_perblock) - 1)]);
a5bd9f6
     }
a5bd9f6
   /* triple indirect.  */
a5bd9f6
-  else if (fileblock < INDIRECT_BLOCKS + blksz / 4 * (blksz / 4 + 1)
a5bd9f6
-	   + (blksz / 4) * (blksz / 4) * (blksz / 4 + 1))
a5bd9f6
+  else if (fileblock < INDIRECT_BLOCKS + blksz / 4 * ((grub_disk_addr_t) blksz / 4 + 1)
a5bd9f6
+	   + ((grub_disk_addr_t) blksz / 4) * ((grub_disk_addr_t) blksz / 4)
a5bd9f6
+	   * ((grub_disk_addr_t) blksz / 4 + 1))
a5bd9f6
     {
a5bd9f6
-      unsigned int perblock = blksz / 4;
a5bd9f6
-      unsigned int rblock = fileblock - (INDIRECT_BLOCKS + blksz / 4
a5bd9f6
-					 * (blksz / 4 + 1));
a5bd9f6
+      int log_perblock = log2_blksz + 9 - 2;
a5bd9f6
+      grub_disk_addr_t rblock = fileblock - (INDIRECT_BLOCKS + blksz / 4
a5bd9f6
+					     * (blksz / 4 + 1));
a5bd9f6
       grub_uint32_t indir[blksz / 4];
a5bd9f6
 
a5bd9f6
       if (grub_disk_read (data->disk,
a5bd9f6
@@ -496,19 +498,19 @@ grub_ext2_read_block (grub_fshelp_node_t node, grub_disk_addr_t fileblock)
a5bd9f6
 
a5bd9f6
       if (grub_disk_read (data->disk,
a5bd9f6
 			  ((grub_disk_addr_t)
a5bd9f6
-			   grub_le_to_cpu32 (indir[(rblock / perblock) / perblock]))
a5bd9f6
+			   grub_le_to_cpu32 (indir[(rblock >> log_perblock) >> log_perblock]))
a5bd9f6
 			  << log2_blksz,
a5bd9f6
 			  0, blksz, indir))
a5bd9f6
 	return grub_errno;
a5bd9f6
 
a5bd9f6
       if (grub_disk_read (data->disk,
a5bd9f6
 			  ((grub_disk_addr_t)
a5bd9f6
-			   grub_le_to_cpu32 (indir[(rblock / perblock) % perblock]))
a5bd9f6
+			   grub_le_to_cpu32 (indir[(rblock >> log_perblock) & ((1 << log_perblock) - 1)]))
a5bd9f6
 			  << log2_blksz,
a5bd9f6
 			  0, blksz, indir))
a5bd9f6
 	return grub_errno;
a5bd9f6
 
a5bd9f6
-      blknr = grub_le_to_cpu32 (indir[rblock % perblock]);
a5bd9f6
+      blknr = grub_le_to_cpu32 (indir[rblock  & ((1 << log_perblock) - 1)]);
a5bd9f6
     }
a5bd9f6
   else
a5bd9f6
     {
a5bd9f6
-- 
a5bd9f6
1.8.1.4
a5bd9f6