diff options
Diffstat (limited to 'init/initramfs.c')
| -rw-r--r-- | init/initramfs.c | 35 | 
1 files changed, 26 insertions, 9 deletions
diff --git a/init/initramfs.c b/init/initramfs.c index 2531811d42c..a8497fab1c3 100644 --- a/init/initramfs.c +++ b/init/initramfs.c @@ -1,3 +1,13 @@ +/* + * 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/init.h>  #include <linux/fs.h>  #include <linux/slab.h> @@ -22,7 +32,7 @@ static void __init error(char *x)  static __initdata struct hash {  	int ino, minor, major; -	mode_t mode; +	umode_t mode;  	struct hash *next;  	char name[N_ALIGN(PATH_MAX)];  } *head[32]; @@ -35,7 +45,7 @@ static inline int hash(int major, int minor, int ino)  }  static char __init *find_link(int major, int minor, int ino, -			      mode_t mode, char *name) +			      umode_t mode, char *name)  {  	struct hash **p, *q;  	for (p = head + hash(major, minor, ino); *p; p = &(*p)->next) { @@ -74,7 +84,7 @@ static void __init free_hash(void)  	}  } -static long __init do_utime(char __user *filename, time_t mtime) +static long __init do_utime(char *filename, time_t mtime)  {  	struct timespec t[2]; @@ -120,7 +130,7 @@ static __initdata time_t mtime;  /* cpio header parsing */  static __initdata unsigned long ino, major, minor, nlink; -static __initdata mode_t mode; +static __initdata umode_t mode;  static __initdata unsigned long body_len, name_len;  static __initdata uid_t uid;  static __initdata gid_t gid; @@ -276,7 +286,7 @@ static int __init maybe_link(void)  	return 0;  } -static void __init clean_path(char *path, mode_t mode) +static void __init clean_path(char *path, umode_t mode)  {  	struct stat st; @@ -445,6 +455,7 @@ static char * __init unpack_to_rootfs(char *buf, unsigned len)  		}  		this_header = 0;  		decompress = decompress_method(buf, len, &compress_name); +		pr_debug("Detected %s compressed data\n", compress_name);  		if (decompress) {  			res = decompress(buf, len, NULL, flush_buffer, NULL,  				   &my_inptr, error); @@ -529,7 +540,7 @@ static void __init clean_rootfs(void)  	struct linux_dirent64 *dirp;  	int num; -	fd = sys_open((const char __user __force *) "/", O_RDONLY, 0); +	fd = sys_open("/", O_RDONLY, 0);  	WARN_ON(fd < 0);  	if (fd < 0)  		return; @@ -573,7 +584,7 @@ static int __init populate_rootfs(void)  {  	char *err = unpack_to_rootfs(__initramfs_start, __initramfs_size);  	if (err) -		panic(err);	/* Failed to decompress INTERNAL initramfs */ +		panic("%s", err); /* Failed to decompress INTERNAL initramfs */  	if (initrd_start) {  #ifdef CONFIG_BLK_DEV_RAM  		int fd; @@ -582,14 +593,14 @@ static int __init populate_rootfs(void)  			initrd_end - initrd_start);  		if (!err) {  			free_initrd(); -			return 0; +			goto done;  		} else {  			clean_rootfs();  			unpack_to_rootfs(__initramfs_start, __initramfs_size);  		}  		printk(KERN_INFO "rootfs image is not initramfs (%s)"  				"; looks like an initrd\n", err); -		fd = sys_open((const char __user __force *) "/initrd.image", +		fd = sys_open("/initrd.image",  			      O_WRONLY|O_CREAT, 0700);  		if (fd >= 0) {  			sys_write(fd, (char *)initrd_start, @@ -597,6 +608,7 @@ static int __init populate_rootfs(void)  			sys_close(fd);  			free_initrd();  		} +	done:  #else  		printk(KERN_INFO "Unpacking initramfs...\n");  		err = unpack_to_rootfs((char *)initrd_start, @@ -605,6 +617,11 @@ static int __init populate_rootfs(void)  			printk(KERN_EMERG "Initramfs unpacking failed: %s\n", err);  		free_initrd();  #endif +		/* +		 * Try loading default modules from initramfs.  This gives +		 * us a chance to load before device_initcalls. +		 */ +		load_default_modules();  	}  	return 0;  }  | 
