usb/host/r8a66597: remove conditional compilation of clk code
[linux-3.10.git] / init / do_mounts_rd.c
index a015e26..6be2879 100644 (file)
@@ -1,3 +1,12 @@
+/*
+ * Many of the syscalls used in this file expect some of the arguments
+ * to be __user pointers not __kernel pointers.  To limit the sparse
+ * noise, turn off sparse checking for this file.
+ */
+#ifdef __CHECKER__
+#undef __CHECKER__
+#warning "Sparse checking disabled for this file"
+#endif
 
 #include <linux/kernel.h>
 #include <linux/fs.h>
@@ -7,6 +16,7 @@
 #include <linux/cramfs_fs.h>
 #include <linux/initrd.h>
 #include <linux/string.h>
+#include <linux/slab.h>
 
 #include "do_mounts.h"
 #include "../fs/squashfs/squashfs_fs.h"
@@ -53,20 +63,19 @@ identify_ramdisk_image(int fd, int start_block, decompress_fn *decompressor)
 {
        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 -1;
+               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;
@@ -79,9 +88,13 @@ identify_ramdisk_image(int fd, int start_block, decompress_fn *decompressor)
        sys_read(fd, buf, size);
 
        *decompressor = decompress_method(buf, size, &compress_name);
-       if (*decompressor) {
+       if (compress_name) {
                printk(KERN_NOTICE "RAMDISK: %s image found at block %d\n",
                       compress_name, start_block);
+               if (!*decompressor)
+                       printk(KERN_EMERG
+                              "RAMDISK: %s decompressor not configured!\n",
+                              compress_name);
                nblocks = 0;
                goto done;
        }
@@ -115,6 +128,20 @@ identify_ramdisk_image(int fd, int start_block, decompress_fn *decompressor)
        }
 
        /*
+        * Read 512 bytes further to check if cramfs is padded
+        */
+       sys_lseek(fd, start_block * BLOCK_SIZE + 0x200, 0);
+       sys_read(fd, buf, size);
+
+       if (cramfsb->magic == CRAMFS_MAGIC) {
+               printk(KERN_NOTICE
+                      "RAMDISK: cramfs filesystem found at block %d\n",
+                      start_block);
+               nblocks = (cramfsb->size + BLOCK_SIZE - 1) >> BLOCK_SIZE_BITS;
+               goto done;
+       }
+
+       /*
         * Read block 1 to test for minix and ext2 superblock
         */
        sys_lseek(fd, (start_block+1) * BLOCK_SIZE, 0);
@@ -131,12 +158,12 @@ identify_ramdisk_image(int fd, int start_block, decompress_fn *decompressor)
        }
 
        /* 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;
        }
 
@@ -159,7 +186,7 @@ int __init rd_load_image(char *from)
        char *buf = NULL;
        unsigned short rotate = 0;
        decompress_fn decompressor = NULL;
-#if !defined(CONFIG_S390) && !defined(CONFIG_PPC_ISERIES)
+#if !defined(CONFIG_S390)
        char rotator[4] = { '|' , '/' , '-' , '\\' };
 #endif
 
@@ -245,7 +272,7 @@ int __init rd_load_image(char *from)
                }
                sys_read(in_fd, buf, BLOCK_SIZE);
                sys_write(out_fd, buf, BLOCK_SIZE);
-#if !defined(CONFIG_S390) && !defined(CONFIG_PPC_ISERIES)
+#if !defined(CONFIG_S390)
                if (!(i % 16)) {
                        printk("%c\b", rotator[rotate & 0x3]);
                        rotate++;