Blame SOURCES/0088-grub-core-fs-ext2.c-grub_ext2_read_block-Use-shifts-.patch

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