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