{
 #ifdef CONFIG_MTD_UCLINUX
        unsigned long mtd_phys = 0;
+       unsigned long n;
 #endif
        unsigned long max_mem;
 
        mtd_size = PAGE_ALIGN(*((unsigned long *)(mtd_phys + 8)));
 
 # if defined(CONFIG_EXT2_FS) || defined(CONFIG_EXT3_FS)
-       if (*((unsigned short *)(mtd_phys + 0x438)) == EXT2_SUPER_MAGIC)
-               mtd_size =
-                   PAGE_ALIGN(*((unsigned long *)(mtd_phys + 0x404)) << 10);
+       n = ext2_image_size((void *)(mtd_phys + 0x400));
+       if (n)
+               mtd_size = PAGE_ALIGN(n * 1024);
 # endif
 
 # if defined(CONFIG_CRAMFS)
 
                                         ~EXT2_DIR_ROUND)
 #define EXT2_MAX_REC_LEN               ((1<<16)-1)
 
+#define EXT2_SB_MAGIC_OFFSET   0x38
+#define EXT2_SB_BLOCKS_OFFSET  0x04
+#define EXT2_SB_BSIZE_OFFSET   0x18
+
+static inline u64 ext2_image_size(void *ext2_sb)
+{
+       __u8 *p = ext2_sb;
+       if (*(__le16 *)(p + EXT2_SB_MAGIC_OFFSET) != cpu_to_le16(EXT2_SUPER_MAGIC))
+               return 0;
+       return (u64)le32_to_cpup((__le32 *)(p + EXT2_SB_BLOCKS_OFFSET)) <<
+               le32_to_cpup((__le32 *)(p + EXT2_SB_BSIZE_OFFSET));
+}
+
+static inline void verify_offsets(void)
+{
+#define A(x,y) BUILD_BUG_ON(x != offsetof(struct ext2_super_block, y));
+       A(EXT2_SB_MAGIC_OFFSET, s_magic);
+       A(EXT2_SB_BLOCKS_OFFSET, s_blocks_count);
+       A(EXT2_SB_BSIZE_OFFSET, s_log_block_size);
+#undef A
+}
+
 #endif /* _LINUX_EXT2_FS_H */
 
 {
        const int size = 512;
        struct minix_super_block *minixsb;
-       struct ext2_super_block *ext2sb;
        struct romfs_super_block *romfsb;
        struct cramfs_super *cramfsb;
        struct squashfs_super_block *squashfsb;
        int nblocks = -1;
        unsigned char *buf;
        const char *compress_name;
+       unsigned long n;
 
        buf = kmalloc(size, GFP_KERNEL);
        if (!buf)
                return -ENOMEM;
 
        minixsb = (struct minix_super_block *) buf;
-       ext2sb = (struct ext2_super_block *) buf;
        romfsb = (struct romfs_super_block *) buf;
        cramfsb = (struct cramfs_super *) buf;
        squashfsb = (struct squashfs_super_block *) buf;
        }
 
        /* Try ext2 */
-       if (ext2sb->s_magic == cpu_to_le16(EXT2_SUPER_MAGIC)) {
+       n = ext2_image_size(buf);
+       if (n) {
                printk(KERN_NOTICE
                       "RAMDISK: ext2 filesystem found at block %d\n",
                       start_block);
-               nblocks = le32_to_cpu(ext2sb->s_blocks_count) <<
-                       le32_to_cpu(ext2sb->s_log_block_size);
+               nblocks = n;
                goto done;
        }