[PATCH] U-Boot: Update for reading inodes on ext2fs revision 1
Rask Ingemann Lambertsen
rask at sygehus.dk
Thu Apr 23 21:18:38 CEST 2009
[based on Grub2 trunk revisions 1236 and 1237]
The code to read ext2fs inodes was assuming a revision 0 file system.
This patch fixes a miscalculation of inode position on revision 1 file
systems, where the inodes might not be 128 bytes in size.
Signed-off-by: Rask Ingemann Lambertsen <rask at sygehus.dk>
---
diff --git a/fs/ext2/ext2fs.c b/fs/ext2/ext2fs.c
index a2f245c..1ccb272 100644
--- a/fs/ext2/ext2fs.c
+++ b/fs/ext2/ext2fs.c
@@ -42,6 +42,10 @@ extern int ext2fs_devread (int sector, int byte_offset, int byte_len,
/* Maximum nesting of symlinks, used to prevent a loop. */
#define EXT2_MAX_SYMLINKCNT 8
+/* The good old revision and the default inode size. */
+#define EXT2_GOOD_OLD_REVISION 0
+#define EXT2_GOOD_OLD_INODE_SIZE 128
+
/* Filetype used in directory entry. */
#define FILETYPE_UNKNOWN 0
#define FILETYPE_REG 1
@@ -66,6 +70,15 @@ extern int ext2fs_devread (int sector, int byte_offset, int byte_len,
/* The size of an ext2 block in bytes. */
#define EXT2_BLOCK_SIZE(data) (1 << LOG2_BLOCK_SIZE(data))
+/* The revision level. */
+#define EXT2_REVISION(data) __le32_to_cpu (data->sblock.revision_level)
+
+/* The inode size. */
+#define EXT2_INODE_SIZE(data) \
+ (EXT2_REVISION (data) == EXT2_GOOD_OLD_REVISION \
+ ? EXT2_GOOD_OLD_INODE_SIZE \
+ : __le16_to_cpu (data->sblock.inode_size))
+
/* The ext2 superblock. */
struct ext2_sblock {
uint32_t total_inodes;
@@ -217,7 +230,7 @@ static int ext2fs_read_inode
if (status == 0) {
return (0);
}
- inodes_per_block = EXT2_BLOCK_SIZE (data) / 128;
+ inodes_per_block = EXT2_BLOCK_SIZE (data) / EXT2_INODE_SIZE (data);
blkno = (ino % __le32_to_cpu (sblock->inodes_per_group)) /
inodes_per_block;
blkoff = (ino % __le32_to_cpu (sblock->inodes_per_group)) %
@@ -228,7 +241,7 @@ static int ext2fs_read_inode
/* Read the inode. */
status = ext2fs_devread (((__le32_to_cpu (blkgrp.inode_table_id) +
blkno) << LOG2_EXT2_BLOCK_SIZE (data)),
- sizeof (struct ext2_inode) * blkoff,
+ EXT2_INODE_SIZE (data) * blkoff,
sizeof (struct ext2_inode), (char *) inode);
if (status == 0) {
return (0);
--
Rask Ingemann Lambertsen
Danish law requires addresses in e-mail to be logged and stored for a year
More information about the openmoko-kernel
mailing list