Commit 39429c5e authored by Al Viro's avatar Al Viro

new helper: ext2_image_size()

... implemented that way since the next commit will leave it
almost alone in ext2_fs.h - most of the file (including
struct ext2_super_block) is going to move to fs/ext2/ext2.h.
Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent 2f99c369
...@@ -550,6 +550,7 @@ static __init void memory_setup(void) ...@@ -550,6 +550,7 @@ static __init void memory_setup(void)
{ {
#ifdef CONFIG_MTD_UCLINUX #ifdef CONFIG_MTD_UCLINUX
unsigned long mtd_phys = 0; unsigned long mtd_phys = 0;
unsigned long n;
#endif #endif
unsigned long max_mem; unsigned long max_mem;
...@@ -593,9 +594,9 @@ static __init void memory_setup(void) ...@@ -593,9 +594,9 @@ static __init void memory_setup(void)
mtd_size = PAGE_ALIGN(*((unsigned long *)(mtd_phys + 8))); mtd_size = PAGE_ALIGN(*((unsigned long *)(mtd_phys + 8)));
# if defined(CONFIG_EXT2_FS) || defined(CONFIG_EXT3_FS) # if defined(CONFIG_EXT2_FS) || defined(CONFIG_EXT3_FS)
if (*((unsigned short *)(mtd_phys + 0x438)) == EXT2_SUPER_MAGIC) n = ext2_image_size((void *)(mtd_phys + 0x400));
mtd_size = if (n)
PAGE_ALIGN(*((unsigned long *)(mtd_phys + 0x404)) << 10); mtd_size = PAGE_ALIGN(n * 1024);
# endif # endif
# if defined(CONFIG_CRAMFS) # if defined(CONFIG_CRAMFS)
......
...@@ -536,4 +536,26 @@ enum { ...@@ -536,4 +536,26 @@ enum {
~EXT2_DIR_ROUND) ~EXT2_DIR_ROUND)
#define EXT2_MAX_REC_LEN ((1<<16)-1) #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 */ #endif /* _LINUX_EXT2_FS_H */
...@@ -54,20 +54,19 @@ identify_ramdisk_image(int fd, int start_block, decompress_fn *decompressor) ...@@ -54,20 +54,19 @@ identify_ramdisk_image(int fd, int start_block, decompress_fn *decompressor)
{ {
const int size = 512; const int size = 512;
struct minix_super_block *minixsb; struct minix_super_block *minixsb;
struct ext2_super_block *ext2sb;
struct romfs_super_block *romfsb; struct romfs_super_block *romfsb;
struct cramfs_super *cramfsb; struct cramfs_super *cramfsb;
struct squashfs_super_block *squashfsb; struct squashfs_super_block *squashfsb;
int nblocks = -1; int nblocks = -1;
unsigned char *buf; unsigned char *buf;
const char *compress_name; const char *compress_name;
unsigned long n;
buf = kmalloc(size, GFP_KERNEL); buf = kmalloc(size, GFP_KERNEL);
if (!buf) if (!buf)
return -ENOMEM; return -ENOMEM;
minixsb = (struct minix_super_block *) buf; minixsb = (struct minix_super_block *) buf;
ext2sb = (struct ext2_super_block *) buf;
romfsb = (struct romfs_super_block *) buf; romfsb = (struct romfs_super_block *) buf;
cramfsb = (struct cramfs_super *) buf; cramfsb = (struct cramfs_super *) buf;
squashfsb = (struct squashfs_super_block *) buf; squashfsb = (struct squashfs_super_block *) buf;
...@@ -150,12 +149,12 @@ identify_ramdisk_image(int fd, int start_block, decompress_fn *decompressor) ...@@ -150,12 +149,12 @@ identify_ramdisk_image(int fd, int start_block, decompress_fn *decompressor)
} }
/* Try ext2 */ /* Try ext2 */
if (ext2sb->s_magic == cpu_to_le16(EXT2_SUPER_MAGIC)) { n = ext2_image_size(buf);
if (n) {
printk(KERN_NOTICE printk(KERN_NOTICE
"RAMDISK: ext2 filesystem found at block %d\n", "RAMDISK: ext2 filesystem found at block %d\n",
start_block); start_block);
nblocks = le32_to_cpu(ext2sb->s_blocks_count) << nblocks = n;
le32_to_cpu(ext2sb->s_log_block_size);
goto done; goto done;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment