aboutsummaryrefslogtreecommitdiffstats
path: root/init
diff options
context:
space:
mode:
authorIngo Molnar <mingo@elte.hu>2009-04-06 03:02:57 -0400
committerIngo Molnar <mingo@elte.hu>2009-04-06 03:02:57 -0400
commitf541ae326fa120fa5c57433e4d9a133df212ce41 (patch)
treebdbd94ec72cfc601118051cb35e8617d55510177 /init
parente255357764f92afcafafbd4879b222b8c752065a (diff)
parent0221c81b1b8eb0cbb6b30a0ced52ead32d2b4e4c (diff)
Merge branch 'linus' into perfcounters/core-v2
Merge reason: we have gathered quite a few conflicts, need to merge upstream Conflicts: arch/powerpc/kernel/Makefile arch/x86/ia32/ia32entry.S arch/x86/include/asm/hardirq.h arch/x86/include/asm/unistd_32.h arch/x86/include/asm/unistd_64.h arch/x86/kernel/cpu/common.c arch/x86/kernel/irq.c arch/x86/kernel/syscall_table_32.S arch/x86/mm/iomap_32.c include/linux/sched.h kernel/Makefile Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'init')
-rw-r--r--init/Kconfig115
-rw-r--r--init/do_mounts.c1
-rw-r--r--init/do_mounts.h1
-rw-r--r--init/do_mounts_md.c5
-rw-r--r--init/do_mounts_rd.c178
-rw-r--r--init/initramfs.c200
-rw-r--r--init/main.c11
7 files changed, 248 insertions, 263 deletions
diff --git a/init/Kconfig b/init/Kconfig
index 5a3ad5c20e2b..38a2ecd47c37 100644
--- a/init/Kconfig
+++ b/init/Kconfig
@@ -101,6 +101,66 @@ config LOCALVERSION_AUTO
101 101
102 which is done within the script "scripts/setlocalversion".) 102 which is done within the script "scripts/setlocalversion".)
103 103
104config HAVE_KERNEL_GZIP
105 bool
106
107config HAVE_KERNEL_BZIP2
108 bool
109
110config HAVE_KERNEL_LZMA
111 bool
112
113choice
114 prompt "Kernel compression mode"
115 default KERNEL_GZIP
116 depends on HAVE_KERNEL_GZIP || HAVE_KERNEL_BZIP2 || HAVE_KERNEL_LZMA
117 help
118 The linux kernel is a kind of self-extracting executable.
119 Several compression algorithms are available, which differ
120 in efficiency, compression and decompression speed.
121 Compression speed is only relevant when building a kernel.
122 Decompression speed is relevant at each boot.
123
124 If you have any problems with bzip2 or lzma compressed
125 kernels, mail me (Alain Knaff) <alain@knaff.lu>. (An older
126 version of this functionality (bzip2 only), for 2.4, was
127 supplied by Christian Ludwig)
128
129 High compression options are mostly useful for users, who
130 are low on disk space (embedded systems), but for whom ram
131 size matters less.
132
133 If in doubt, select 'gzip'
134
135config KERNEL_GZIP
136 bool "Gzip"
137 depends on HAVE_KERNEL_GZIP
138 help
139 The old and tried gzip compression. Its compression ratio is
140 the poorest among the 3 choices; however its speed (both
141 compression and decompression) is the fastest.
142
143config KERNEL_BZIP2
144 bool "Bzip2"
145 depends on HAVE_KERNEL_BZIP2
146 help
147 Its compression ratio and speed is intermediate.
148 Decompression speed is slowest among the three. The kernel
149 size is about 10% smaller with bzip2, in comparison to gzip.
150 Bzip2 uses a large amount of memory. For modern kernels you
151 will need at least 8MB RAM or more for booting.
152
153config KERNEL_LZMA
154 bool "LZMA"
155 depends on HAVE_KERNEL_LZMA
156 help
157 The most recent compression algorithm.
158 Its ratio is best, decompression speed is between the other
159 two. Compression is slowest. The kernel size is about 33%
160 smaller with LZMA in comparison to gzip.
161
162endchoice
163
104config SWAP 164config SWAP
105 bool "Support for paging of anonymous memory (swap)" 165 bool "Support for paging of anonymous memory (swap)"
106 depends on MMU && BLOCK 166 depends on MMU && BLOCK
@@ -471,7 +531,7 @@ config CGROUP_DEVICE
471 531
472config CPUSETS 532config CPUSETS
473 bool "Cpuset support" 533 bool "Cpuset support"
474 depends on SMP && CGROUPS 534 depends on CGROUPS
475 help 535 help
476 This option will let you create and manage CPUSETs which 536 This option will let you create and manage CPUSETs which
477 allow dynamically partitioning a system into sets of CPUs and 537 allow dynamically partitioning a system into sets of CPUs and
@@ -505,7 +565,7 @@ config CGROUP_MEM_RES_CTLR
505 select MM_OWNER 565 select MM_OWNER
506 help 566 help
507 Provides a memory resource controller that manages both anonymous 567 Provides a memory resource controller that manages both anonymous
508 memory and page cache. (See Documentation/controllers/memory.txt) 568 memory and page cache. (See Documentation/cgroups/memory.txt)
509 569
510 Note that setting this option increases fixed memory overhead 570 Note that setting this option increases fixed memory overhead
511 associated with each page of memory in the system. By this, 571 associated with each page of memory in the system. By this,
@@ -537,6 +597,8 @@ config CGROUP_MEM_RES_CTLR_SWAP
537 is disabled by boot option, this will be automatically disabled and 597 is disabled by boot option, this will be automatically disabled and
538 there will be no overhead from this. Even when you set this config=y, 598 there will be no overhead from this. Even when you set this config=y,
539 if boot option "noswapaccount" is set, swap will not be accounted. 599 if boot option "noswapaccount" is set, swap will not be accounted.
600 Now, memory usage of swap_cgroup is 2 bytes per entry. If swap page
601 size is 4096bytes, 512k per 1Gbytes of swap.
540 602
541endif # CGROUPS 603endif # CGROUPS
542 604
@@ -627,7 +689,7 @@ config PID_NS
627 depends on NAMESPACES && EXPERIMENTAL 689 depends on NAMESPACES && EXPERIMENTAL
628 help 690 help
629 Support process id namespaces. This allows having multiple 691 Support process id namespaces. This allows having multiple
630 process with the same pid as long as they are in different 692 processes with the same pid as long as they are in different
631 pid namespaces. This is a building block of containers. 693 pid namespaces. This is a building block of containers.
632 694
633 Unless you want to work with an experimental feature 695 Unless you want to work with an experimental feature
@@ -675,6 +737,9 @@ config CC_OPTIMIZE_FOR_SIZE
675config SYSCTL 737config SYSCTL
676 bool 738 bool
677 739
740config ANON_INODES
741 bool
742
678menuconfig EMBEDDED 743menuconfig EMBEDDED
679 bool "Configure standard kernel features (for small systems)" 744 bool "Configure standard kernel features (for small systems)"
680 help 745 help
@@ -780,18 +845,6 @@ config PCSPKR_PLATFORM
780 This option allows to disable the internal PC-Speaker 845 This option allows to disable the internal PC-Speaker
781 support, saving some memory. 846 support, saving some memory.
782 847
783config COMPAT_BRK
784 bool "Disable heap randomization"
785 default y
786 help
787 Randomizing heap placement makes heap exploits harder, but it
788 also breaks ancient binaries (including anything libc5 based).
789 This option changes the bootup default to heap randomization
790 disabled, and can be overriden runtime by setting
791 /proc/sys/kernel/randomize_va_space to 2.
792
793 On non-ancient distros (post-2000 ones) N is usually a safe choice.
794
795config BASE_FULL 848config BASE_FULL
796 default y 849 default y
797 bool "Enable full-sized data structures for core" if EMBEDDED 850 bool "Enable full-sized data structures for core" if EMBEDDED
@@ -809,9 +862,6 @@ config FUTEX
809 support for "fast userspace mutexes". The resulting kernel may not 862 support for "fast userspace mutexes". The resulting kernel may not
810 run glibc-based applications correctly. 863 run glibc-based applications correctly.
811 864
812config ANON_INODES
813 bool
814
815config EPOLL 865config EPOLL
816 bool "Enable eventpoll support" if EMBEDDED 866 bool "Enable eventpoll support" if EMBEDDED
817 default y 867 default y
@@ -927,6 +977,18 @@ config SLUB_DEBUG
927 SLUB sysfs support. /sys/slab will not exist and there will be 977 SLUB sysfs support. /sys/slab will not exist and there will be
928 no support for cache validation etc. 978 no support for cache validation etc.
929 979
980config COMPAT_BRK
981 bool "Disable heap randomization"
982 default y
983 help
984 Randomizing heap placement makes heap exploits harder, but it
985 also breaks ancient binaries (including anything libc5 based).
986 This option changes the bootup default to heap randomization
987 disabled, and can be overridden at runtime by setting
988 /proc/sys/kernel/randomize_va_space to 2.
989
990 On non-ancient distros (post-2000 ones) N is usually a safe choice.
991
930choice 992choice
931 prompt "Choose SLAB allocator" 993 prompt "Choose SLAB allocator"
932 default SLUB 994 default SLUB
@@ -975,13 +1037,25 @@ config TRACEPOINTS
975 1037
976config MARKERS 1038config MARKERS
977 bool "Activate markers" 1039 bool "Activate markers"
978 depends on TRACEPOINTS 1040 select TRACEPOINTS
979 help 1041 help
980 Place an empty function call at each marker site. Can be 1042 Place an empty function call at each marker site. Can be
981 dynamically changed for a probe function. 1043 dynamically changed for a probe function.
982 1044
983source "arch/Kconfig" 1045source "arch/Kconfig"
984 1046
1047config SLOW_WORK
1048 default n
1049 bool "Enable slow work thread pool"
1050 help
1051 The slow work thread pool provides a number of dynamically allocated
1052 threads that can be used by the kernel to perform operations that
1053 take a relatively long time.
1054
1055 An example of this would be CacheFiles doing a path lookup followed
1056 by a series of mkdirs and a create call, all of which have to touch
1057 disk.
1058
985endmenu # General setup 1059endmenu # General setup
986 1060
987config HAVE_GENERIC_DMA_COHERENT 1061config HAVE_GENERIC_DMA_COHERENT
@@ -996,7 +1070,6 @@ config SLABINFO
996 1070
997config RT_MUTEXES 1071config RT_MUTEXES
998 boolean 1072 boolean
999 select PLIST
1000 1073
1001config BASE_SMALL 1074config BASE_SMALL
1002 int 1075 int
@@ -1081,7 +1154,7 @@ config INIT_ALL_POSSIBLE
1081 cpu_possible_map, some of them chose to initialize cpu_possible_map 1154 cpu_possible_map, some of them chose to initialize cpu_possible_map
1082 with all 1s, and others with all 0s. When they were centralised, 1155 with all 1s, and others with all 0s. When they were centralised,
1083 it was better to provide this option than to break all the archs 1156 it was better to provide this option than to break all the archs
1084 and have several arch maintainers persuing me down dark alleys. 1157 and have several arch maintainers pursuing me down dark alleys.
1085 1158
1086config STOP_MACHINE 1159config STOP_MACHINE
1087 bool 1160 bool
diff --git a/init/do_mounts.c b/init/do_mounts.c
index 8d4ff5afc1d8..dd7ee5f203f3 100644
--- a/init/do_mounts.c
+++ b/init/do_mounts.c
@@ -14,6 +14,7 @@
14#include <linux/fs.h> 14#include <linux/fs.h>
15#include <linux/initrd.h> 15#include <linux/initrd.h>
16#include <linux/async.h> 16#include <linux/async.h>
17#include <linux/fs_struct.h>
17 18
18#include <linux/nfs_fs.h> 19#include <linux/nfs_fs.h>
19#include <linux/nfs_fs_sb.h> 20#include <linux/nfs_fs_sb.h>
diff --git a/init/do_mounts.h b/init/do_mounts.h
index 9aa968d54329..f5b978a9bb92 100644
--- a/init/do_mounts.h
+++ b/init/do_mounts.h
@@ -1,4 +1,5 @@
1#include <linux/kernel.h> 1#include <linux/kernel.h>
2#include <linux/blkdev.h>
2#include <linux/init.h> 3#include <linux/init.h>
3#include <linux/syscalls.h> 4#include <linux/syscalls.h>
4#include <linux/unistd.h> 5#include <linux/unistd.h>
diff --git a/init/do_mounts_md.c b/init/do_mounts_md.c
index 9bdddbcb3d6a..69aebbf8fd2d 100644
--- a/init/do_mounts_md.c
+++ b/init/do_mounts_md.c
@@ -1,5 +1,6 @@
1#include <linux/delay.h> 1#include <linux/delay.h>
2#include <linux/raid/md.h> 2#include <linux/raid/md_u.h>
3#include <linux/raid/md_p.h>
3 4
4#include "do_mounts.h" 5#include "do_mounts.h"
5 6
@@ -112,8 +113,6 @@ static int __init md_setup(char *str)
112 return 1; 113 return 1;
113} 114}
114 115
115#define MdpMinorShift 6
116
117static void __init md_setup_drive(void) 116static void __init md_setup_drive(void)
118{ 117{
119 int minor, i, ent, partitioned; 118 int minor, i, ent, partitioned;
diff --git a/init/do_mounts_rd.c b/init/do_mounts_rd.c
index 0f0f0cf3ba9a..027a402708de 100644
--- a/init/do_mounts_rd.c
+++ b/init/do_mounts_rd.c
@@ -11,6 +11,9 @@
11#include "do_mounts.h" 11#include "do_mounts.h"
12#include "../fs/squashfs/squashfs_fs.h" 12#include "../fs/squashfs/squashfs_fs.h"
13 13
14#include <linux/decompress/generic.h>
15
16
14int __initdata rd_prompt = 1;/* 1 = prompt for RAM disk, 0 = don't prompt */ 17int __initdata rd_prompt = 1;/* 1 = prompt for RAM disk, 0 = don't prompt */
15 18
16static int __init prompt_ramdisk(char *str) 19static int __init prompt_ramdisk(char *str)
@@ -29,7 +32,7 @@ static int __init ramdisk_start_setup(char *str)
29} 32}
30__setup("ramdisk_start=", ramdisk_start_setup); 33__setup("ramdisk_start=", ramdisk_start_setup);
31 34
32static int __init crd_load(int in_fd, int out_fd); 35static int __init crd_load(int in_fd, int out_fd, decompress_fn deco);
33 36
34/* 37/*
35 * This routine tries to find a RAM disk image to load, and returns the 38 * This routine tries to find a RAM disk image to load, and returns the
@@ -38,15 +41,15 @@ static int __init crd_load(int in_fd, int out_fd);
38 * numbers could not be found. 41 * numbers could not be found.
39 * 42 *
40 * We currently check for the following magic numbers: 43 * We currently check for the following magic numbers:
41 * minix 44 * minix
42 * ext2 45 * ext2
43 * romfs 46 * romfs
44 * cramfs 47 * cramfs
45 * squashfs 48 * squashfs
46 * gzip 49 * gzip
47 */ 50 */
48static int __init 51static int __init
49identify_ramdisk_image(int fd, int start_block) 52identify_ramdisk_image(int fd, int start_block, decompress_fn *decompressor)
50{ 53{
51 const int size = 512; 54 const int size = 512;
52 struct minix_super_block *minixsb; 55 struct minix_super_block *minixsb;
@@ -56,6 +59,7 @@ identify_ramdisk_image(int fd, int start_block)
56 struct squashfs_super_block *squashfsb; 59 struct squashfs_super_block *squashfsb;
57 int nblocks = -1; 60 int nblocks = -1;
58 unsigned char *buf; 61 unsigned char *buf;
62 const char *compress_name;
59 63
60 buf = kmalloc(size, GFP_KERNEL); 64 buf = kmalloc(size, GFP_KERNEL);
61 if (!buf) 65 if (!buf)
@@ -69,18 +73,19 @@ identify_ramdisk_image(int fd, int start_block)
69 memset(buf, 0xe5, size); 73 memset(buf, 0xe5, size);
70 74
71 /* 75 /*
72 * Read block 0 to test for gzipped kernel 76 * Read block 0 to test for compressed kernel
73 */ 77 */
74 sys_lseek(fd, start_block * BLOCK_SIZE, 0); 78 sys_lseek(fd, start_block * BLOCK_SIZE, 0);
75 sys_read(fd, buf, size); 79 sys_read(fd, buf, size);
76 80
77 /* 81 *decompressor = decompress_method(buf, size, &compress_name);
78 * If it matches the gzip magic numbers, return 0 82 if (compress_name) {
79 */ 83 printk(KERN_NOTICE "RAMDISK: %s image found at block %d\n",
80 if (buf[0] == 037 && ((buf[1] == 0213) || (buf[1] == 0236))) { 84 compress_name, start_block);
81 printk(KERN_NOTICE 85 if (!*decompressor)
82 "RAMDISK: Compressed image found at block %d\n", 86 printk(KERN_EMERG
83 start_block); 87 "RAMDISK: %s decompressor not configured!\n",
88 compress_name);
84 nblocks = 0; 89 nblocks = 0;
85 goto done; 90 goto done;
86 } 91 }
@@ -142,7 +147,7 @@ identify_ramdisk_image(int fd, int start_block)
142 printk(KERN_NOTICE 147 printk(KERN_NOTICE
143 "RAMDISK: Couldn't find valid RAM disk image starting at %d.\n", 148 "RAMDISK: Couldn't find valid RAM disk image starting at %d.\n",
144 start_block); 149 start_block);
145 150
146done: 151done:
147 sys_lseek(fd, start_block * BLOCK_SIZE, 0); 152 sys_lseek(fd, start_block * BLOCK_SIZE, 0);
148 kfree(buf); 153 kfree(buf);
@@ -157,6 +162,7 @@ int __init rd_load_image(char *from)
157 int nblocks, i, disk; 162 int nblocks, i, disk;
158 char *buf = NULL; 163 char *buf = NULL;
159 unsigned short rotate = 0; 164 unsigned short rotate = 0;
165 decompress_fn decompressor = NULL;
160#if !defined(CONFIG_S390) && !defined(CONFIG_PPC_ISERIES) 166#if !defined(CONFIG_S390) && !defined(CONFIG_PPC_ISERIES)
161 char rotator[4] = { '|' , '/' , '-' , '\\' }; 167 char rotator[4] = { '|' , '/' , '-' , '\\' };
162#endif 168#endif
@@ -169,12 +175,12 @@ int __init rd_load_image(char *from)
169 if (in_fd < 0) 175 if (in_fd < 0)
170 goto noclose_input; 176 goto noclose_input;
171 177
172 nblocks = identify_ramdisk_image(in_fd, rd_image_start); 178 nblocks = identify_ramdisk_image(in_fd, rd_image_start, &decompressor);
173 if (nblocks < 0) 179 if (nblocks < 0)
174 goto done; 180 goto done;
175 181
176 if (nblocks == 0) { 182 if (nblocks == 0) {
177 if (crd_load(in_fd, out_fd) == 0) 183 if (crd_load(in_fd, out_fd, decompressor) == 0)
178 goto successful_load; 184 goto successful_load;
179 goto done; 185 goto done;
180 } 186 }
@@ -200,7 +206,7 @@ int __init rd_load_image(char *from)
200 nblocks, rd_blocks); 206 nblocks, rd_blocks);
201 goto done; 207 goto done;
202 } 208 }
203 209
204 /* 210 /*
205 * OK, time to copy in the data 211 * OK, time to copy in the data
206 */ 212 */
@@ -273,138 +279,48 @@ int __init rd_load_disk(int n)
273 return rd_load_image("/dev/root"); 279 return rd_load_image("/dev/root");
274} 280}
275 281
276/*
277 * gzip declarations
278 */
279
280#define OF(args) args
281
282#ifndef memzero
283#define memzero(s, n) memset ((s), 0, (n))
284#endif
285
286typedef unsigned char uch;
287typedef unsigned short ush;
288typedef unsigned long ulg;
289
290#define INBUFSIZ 4096
291#define WSIZE 0x8000 /* window size--must be a power of two, and */
292 /* at least 32K for zip's deflate method */
293
294static uch *inbuf;
295static uch *window;
296
297static unsigned insize; /* valid bytes in inbuf */
298static unsigned inptr; /* index of next byte to be processed in inbuf */
299static unsigned outcnt; /* bytes in output buffer */
300static int exit_code; 282static int exit_code;
301static int unzip_error; 283static int decompress_error;
302static long bytes_out;
303static int crd_infd, crd_outfd; 284static int crd_infd, crd_outfd;
304 285
305#define get_byte() (inptr < insize ? inbuf[inptr++] : fill_inbuf()) 286static int __init compr_fill(void *buf, unsigned int len)
306
307/* Diagnostic functions (stubbed out) */
308#define Assert(cond,msg)
309#define Trace(x)
310#define Tracev(x)
311#define Tracevv(x)
312#define Tracec(c,x)
313#define Tracecv(c,x)
314
315#define STATIC static
316#define INIT __init
317
318static int __init fill_inbuf(void);
319static void __init flush_window(void);
320static void __init error(char *m);
321
322#define NO_INFLATE_MALLOC
323
324#include "../lib/inflate.c"
325
326/* ===========================================================================
327 * Fill the input buffer. This is called only when the buffer is empty
328 * and at least one byte is really needed.
329 * Returning -1 does not guarantee that gunzip() will ever return.
330 */
331static int __init fill_inbuf(void)
332{ 287{
333 if (exit_code) return -1; 288 int r = sys_read(crd_infd, buf, len);
334 289 if (r < 0)
335 insize = sys_read(crd_infd, inbuf, INBUFSIZ); 290 printk(KERN_ERR "RAMDISK: error while reading compressed data");
336 if (insize == 0) { 291 else if (r == 0)
337 error("RAMDISK: ran out of compressed data"); 292 printk(KERN_ERR "RAMDISK: EOF while reading compressed data");
338 return -1; 293 return r;
339 }
340
341 inptr = 1;
342
343 return inbuf[0];
344} 294}
345 295
346/* =========================================================================== 296static int __init compr_flush(void *window, unsigned int outcnt)
347 * Write the output window window[0..outcnt-1] and update crc and bytes_out.
348 * (Used for the decompressed data only.)
349 */
350static void __init flush_window(void)
351{ 297{
352 ulg c = crc; /* temporary variable */ 298 int written = sys_write(crd_outfd, window, outcnt);
353 unsigned n, written; 299 if (written != outcnt) {
354 uch *in, ch; 300 if (decompress_error == 0)
355 301 printk(KERN_ERR
356 written = sys_write(crd_outfd, window, outcnt); 302 "RAMDISK: incomplete write (%d != %d)\n",
357 if (written != outcnt && unzip_error == 0) { 303 written, outcnt);
358 printk(KERN_ERR "RAMDISK: incomplete write (%d != %d) %ld\n", 304 decompress_error = 1;
359 written, outcnt, bytes_out); 305 return -1;
360 unzip_error = 1; 306 }
361 } 307 return outcnt;
362 in = window;
363 for (n = 0; n < outcnt; n++) {
364 ch = *in++;
365 c = crc_32_tab[((int)c ^ ch) & 0xff] ^ (c >> 8);
366 }
367 crc = c;
368 bytes_out += (ulg)outcnt;
369 outcnt = 0;
370} 308}
371 309
372static void __init error(char *x) 310static void __init error(char *x)
373{ 311{
374 printk(KERN_ERR "%s\n", x); 312 printk(KERN_ERR "%s\n", x);
375 exit_code = 1; 313 exit_code = 1;
376 unzip_error = 1; 314 decompress_error = 1;
377} 315}
378 316
379static int __init crd_load(int in_fd, int out_fd) 317static int __init crd_load(int in_fd, int out_fd, decompress_fn deco)
380{ 318{
381 int result; 319 int result;
382
383 insize = 0; /* valid bytes in inbuf */
384 inptr = 0; /* index of next byte to be processed in inbuf */
385 outcnt = 0; /* bytes in output buffer */
386 exit_code = 0;
387 bytes_out = 0;
388 crc = (ulg)0xffffffffL; /* shift register contents */
389
390 crd_infd = in_fd; 320 crd_infd = in_fd;
391 crd_outfd = out_fd; 321 crd_outfd = out_fd;
392 inbuf = kmalloc(INBUFSIZ, GFP_KERNEL); 322 result = deco(NULL, 0, compr_fill, compr_flush, NULL, NULL, error);
393 if (!inbuf) { 323 if (decompress_error)
394 printk(KERN_ERR "RAMDISK: Couldn't allocate gzip buffer\n");
395 return -1;
396 }
397 window = kmalloc(WSIZE, GFP_KERNEL);
398 if (!window) {
399 printk(KERN_ERR "RAMDISK: Couldn't allocate gzip window\n");
400 kfree(inbuf);
401 return -1;
402 }
403 makecrc();
404 result = gunzip();
405 if (unzip_error)
406 result = 1; 324 result = 1;
407 kfree(inbuf);
408 kfree(window);
409 return result; 325 return result;
410} 326}
diff --git a/init/initramfs.c b/init/initramfs.c
index d9c941c0c3ca..80cd713f6cc5 100644
--- a/init/initramfs.c
+++ b/init/initramfs.c
@@ -5,6 +5,7 @@
5#include <linux/fcntl.h> 5#include <linux/fcntl.h>
6#include <linux/delay.h> 6#include <linux/delay.h>
7#include <linux/string.h> 7#include <linux/string.h>
8#include <linux/dirent.h>
8#include <linux/syscalls.h> 9#include <linux/syscalls.h>
9#include <linux/utime.h> 10#include <linux/utime.h>
10 11
@@ -166,8 +167,6 @@ static __initdata char *victim;
166static __initdata unsigned count; 167static __initdata unsigned count;
167static __initdata loff_t this_header, next_header; 168static __initdata loff_t this_header, next_header;
168 169
169static __initdata int dry_run;
170
171static inline void __init eat(unsigned n) 170static inline void __init eat(unsigned n)
172{ 171{
173 victim += n; 172 victim += n;
@@ -229,10 +228,6 @@ static int __init do_header(void)
229 parse_header(collected); 228 parse_header(collected);
230 next_header = this_header + N_ALIGN(name_len) + body_len; 229 next_header = this_header + N_ALIGN(name_len) + body_len;
231 next_header = (next_header + 3) & ~3; 230 next_header = (next_header + 3) & ~3;
232 if (dry_run) {
233 read_into(name_buf, N_ALIGN(name_len), GotName);
234 return 0;
235 }
236 state = SkipIt; 231 state = SkipIt;
237 if (name_len <= 0 || name_len > PATH_MAX) 232 if (name_len <= 0 || name_len > PATH_MAX)
238 return 0; 233 return 0;
@@ -303,8 +298,6 @@ static int __init do_name(void)
303 free_hash(); 298 free_hash();
304 return 0; 299 return 0;
305 } 300 }
306 if (dry_run)
307 return 0;
308 clean_path(collected, mode); 301 clean_path(collected, mode);
309 if (S_ISREG(mode)) { 302 if (S_ISREG(mode)) {
310 int ml = maybe_link(); 303 int ml = maybe_link();
@@ -390,11 +383,13 @@ static int __init write_buffer(char *buf, unsigned len)
390 return len - count; 383 return len - count;
391} 384}
392 385
393static void __init flush_buffer(char *buf, unsigned len) 386static int __init flush_buffer(void *bufv, unsigned len)
394{ 387{
388 char *buf = (char *) bufv;
395 int written; 389 int written;
390 int origLen = len;
396 if (message) 391 if (message)
397 return; 392 return -1;
398 while ((written = write_buffer(buf, len)) < len && !message) { 393 while ((written = write_buffer(buf, len)) < len && !message) {
399 char c = buf[written]; 394 char c = buf[written];
400 if (c == '0') { 395 if (c == '0') {
@@ -408,84 +403,27 @@ static void __init flush_buffer(char *buf, unsigned len)
408 } else 403 } else
409 error("junk in compressed archive"); 404 error("junk in compressed archive");
410 } 405 }
406 return origLen;
411} 407}
412 408
413/* 409static unsigned my_inptr; /* index of next byte to be processed in inbuf */
414 * gzip declarations
415 */
416
417#define OF(args) args
418
419#ifndef memzero
420#define memzero(s, n) memset ((s), 0, (n))
421#endif
422
423typedef unsigned char uch;
424typedef unsigned short ush;
425typedef unsigned long ulg;
426 410
427#define WSIZE 0x8000 /* window size--must be a power of two, and */ 411#include <linux/decompress/generic.h>
428 /* at least 32K for zip's deflate method */
429
430static uch *inbuf;
431static uch *window;
432
433static unsigned insize; /* valid bytes in inbuf */
434static unsigned inptr; /* index of next byte to be processed in inbuf */
435static unsigned outcnt; /* bytes in output buffer */
436static long bytes_out;
437
438#define get_byte() (inptr < insize ? inbuf[inptr++] : -1)
439
440/* Diagnostic functions (stubbed out) */
441#define Assert(cond,msg)
442#define Trace(x)
443#define Tracev(x)
444#define Tracevv(x)
445#define Tracec(c,x)
446#define Tracecv(c,x)
447
448#define STATIC static
449#define INIT __init
450
451static void __init flush_window(void);
452static void __init error(char *m);
453
454#define NO_INFLATE_MALLOC
455
456#include "../lib/inflate.c"
457
458/* ===========================================================================
459 * Write the output window window[0..outcnt-1] and update crc and bytes_out.
460 * (Used for the decompressed data only.)
461 */
462static void __init flush_window(void)
463{
464 ulg c = crc; /* temporary variable */
465 unsigned n;
466 uch *in, ch;
467
468 flush_buffer(window, outcnt);
469 in = window;
470 for (n = 0; n < outcnt; n++) {
471 ch = *in++;
472 c = crc_32_tab[((int)c ^ ch) & 0xff] ^ (c >> 8);
473 }
474 crc = c;
475 bytes_out += (ulg)outcnt;
476 outcnt = 0;
477}
478 412
479static char * __init unpack_to_rootfs(char *buf, unsigned len, int check_only) 413static char * __init unpack_to_rootfs(char *buf, unsigned len)
480{ 414{
481 int written; 415 int written;
482 dry_run = check_only; 416 decompress_fn decompress;
417 const char *compress_name;
418 static __initdata char msg_buf[64];
419
483 header_buf = kmalloc(110, GFP_KERNEL); 420 header_buf = kmalloc(110, GFP_KERNEL);
484 symlink_buf = kmalloc(PATH_MAX + N_ALIGN(PATH_MAX) + 1, GFP_KERNEL); 421 symlink_buf = kmalloc(PATH_MAX + N_ALIGN(PATH_MAX) + 1, GFP_KERNEL);
485 name_buf = kmalloc(N_ALIGN(PATH_MAX), GFP_KERNEL); 422 name_buf = kmalloc(N_ALIGN(PATH_MAX), GFP_KERNEL);
486 window = kmalloc(WSIZE, GFP_KERNEL); 423
487 if (!window || !header_buf || !symlink_buf || !name_buf) 424 if (!header_buf || !symlink_buf || !name_buf)
488 panic("can't allocate buffers"); 425 panic("can't allocate buffers");
426
489 state = Start; 427 state = Start;
490 this_header = 0; 428 this_header = 0;
491 message = NULL; 429 message = NULL;
@@ -505,22 +443,25 @@ static char * __init unpack_to_rootfs(char *buf, unsigned len, int check_only)
505 continue; 443 continue;
506 } 444 }
507 this_header = 0; 445 this_header = 0;
508 insize = len; 446 decompress = decompress_method(buf, len, &compress_name);
509 inbuf = buf; 447 if (decompress)
510 inptr = 0; 448 decompress(buf, len, NULL, flush_buffer, NULL,
511 outcnt = 0; /* bytes in output buffer */ 449 &my_inptr, error);
512 bytes_out = 0; 450 else if (compress_name) {
513 crc = (ulg)0xffffffffL; /* shift register contents */ 451 if (!message) {
514 makecrc(); 452 snprintf(msg_buf, sizeof msg_buf,
515 gunzip(); 453 "compression method %s not configured",
454 compress_name);
455 message = msg_buf;
456 }
457 }
516 if (state != Reset) 458 if (state != Reset)
517 error("junk in gzipped archive"); 459 error("junk in compressed archive");
518 this_header = saved_offset + inptr; 460 this_header = saved_offset + my_inptr;
519 buf += inptr; 461 buf += my_inptr;
520 len -= inptr; 462 len -= my_inptr;
521 } 463 }
522 dir_utime(); 464 dir_utime();
523 kfree(window);
524 kfree(name_buf); 465 kfree(name_buf);
525 kfree(symlink_buf); 466 kfree(symlink_buf);
526 kfree(header_buf); 467 kfree(header_buf);
@@ -574,26 +515,76 @@ skip:
574 initrd_end = 0; 515 initrd_end = 0;
575} 516}
576 517
518#define BUF_SIZE 1024
519static void __init clean_rootfs(void)
520{
521 int fd;
522 void *buf;
523 struct linux_dirent64 *dirp;
524 int count;
525
526 fd = sys_open("/", O_RDONLY, 0);
527 WARN_ON(fd < 0);
528 if (fd < 0)
529 return;
530 buf = kzalloc(BUF_SIZE, GFP_KERNEL);
531 WARN_ON(!buf);
532 if (!buf) {
533 sys_close(fd);
534 return;
535 }
536
537 dirp = buf;
538 count = sys_getdents64(fd, dirp, BUF_SIZE);
539 while (count > 0) {
540 while (count > 0) {
541 struct stat st;
542 int ret;
543
544 ret = sys_newlstat(dirp->d_name, &st);
545 WARN_ON_ONCE(ret);
546 if (!ret) {
547 if (S_ISDIR(st.st_mode))
548 sys_rmdir(dirp->d_name);
549 else
550 sys_unlink(dirp->d_name);
551 }
552
553 count -= dirp->d_reclen;
554 dirp = (void *)dirp + dirp->d_reclen;
555 }
556 dirp = buf;
557 memset(buf, 0, BUF_SIZE);
558 count = sys_getdents64(fd, dirp, BUF_SIZE);
559 }
560
561 sys_close(fd);
562 kfree(buf);
563}
564
577static int __init populate_rootfs(void) 565static int __init populate_rootfs(void)
578{ 566{
579 char *err = unpack_to_rootfs(__initramfs_start, 567 char *err = unpack_to_rootfs(__initramfs_start,
580 __initramfs_end - __initramfs_start, 0); 568 __initramfs_end - __initramfs_start);
581 if (err) 569 if (err)
582 panic(err); 570 panic(err); /* Failed to decompress INTERNAL initramfs */
583 if (initrd_start) { 571 if (initrd_start) {
584#ifdef CONFIG_BLK_DEV_RAM 572#ifdef CONFIG_BLK_DEV_RAM
585 int fd; 573 int fd;
586 printk(KERN_INFO "checking if image is initramfs..."); 574 printk(KERN_INFO "checking if image is initramfs...\n");
587 err = unpack_to_rootfs((char *)initrd_start, 575 err = unpack_to_rootfs((char *)initrd_start,
588 initrd_end - initrd_start, 1); 576 initrd_end - initrd_start);
589 if (!err) { 577 if (!err) {
590 printk(" it is\n"); 578 printk(KERN_INFO "rootfs image is initramfs; unpacking...\n");
591 unpack_to_rootfs((char *)initrd_start,
592 initrd_end - initrd_start, 0);
593 free_initrd(); 579 free_initrd();
594 return 0; 580 return 0;
581 } else {
582 clean_rootfs();
583 unpack_to_rootfs(__initramfs_start,
584 __initramfs_end - __initramfs_start);
595 } 585 }
596 printk("it isn't (%s); looks like an initrd\n", err); 586 printk(KERN_INFO "rootfs image is not initramfs (%s)"
587 "; looks like an initrd\n", err);
597 fd = sys_open("/initrd.image", O_WRONLY|O_CREAT, 0700); 588 fd = sys_open("/initrd.image", O_WRONLY|O_CREAT, 0700);
598 if (fd >= 0) { 589 if (fd >= 0) {
599 sys_write(fd, (char *)initrd_start, 590 sys_write(fd, (char *)initrd_start,
@@ -604,10 +595,13 @@ static int __init populate_rootfs(void)
604#else 595#else
605 printk(KERN_INFO "Unpacking initramfs..."); 596 printk(KERN_INFO "Unpacking initramfs...");
606 err = unpack_to_rootfs((char *)initrd_start, 597 err = unpack_to_rootfs((char *)initrd_start,
607 initrd_end - initrd_start, 0); 598 initrd_end - initrd_start);
608 if (err) 599 if (err) {
609 panic(err); 600 printk(" failed!\n");
610 printk(" done\n"); 601 printk(KERN_EMERG "%s\n", err);
602 } else {
603 printk(" done\n");
604 }
611 free_initrd(); 605 free_initrd();
612#endif 606#endif
613 } 607 }
diff --git a/init/main.c b/init/main.c
index 6bf83afd654d..3585f073d636 100644
--- a/init/main.c
+++ b/init/main.c
@@ -71,6 +71,7 @@
71#include <asm/setup.h> 71#include <asm/setup.h>
72#include <asm/sections.h> 72#include <asm/sections.h>
73#include <asm/cacheflush.h> 73#include <asm/cacheflush.h>
74#include <trace/kmemtrace.h>
74 75
75#ifdef CONFIG_X86_LOCAL_APIC 76#ifdef CONFIG_X86_LOCAL_APIC
76#include <asm/smp.h> 77#include <asm/smp.h>
@@ -407,8 +408,7 @@ static void __init smp_init(void)
407 * Set up the current CPU as possible to migrate to. 408 * Set up the current CPU as possible to migrate to.
408 * The other ones will be done by cpu_up/cpu_down() 409 * The other ones will be done by cpu_up/cpu_down()
409 */ 410 */
410 cpu = smp_processor_id(); 411 set_cpu_active(smp_processor_id(), true);
411 cpu_set(cpu, cpu_active_map);
412 412
413 /* FIXME: This should be done in userspace --RR */ 413 /* FIXME: This should be done in userspace --RR */
414 for_each_present_cpu(cpu) { 414 for_each_present_cpu(cpu) {
@@ -649,6 +649,7 @@ asmlinkage void __init start_kernel(void)
649 enable_debug_pagealloc(); 649 enable_debug_pagealloc();
650 cpu_hotplug_init(); 650 cpu_hotplug_init();
651 kmem_cache_init(); 651 kmem_cache_init();
652 kmemtrace_init();
652 debug_objects_mem_init(); 653 debug_objects_mem_init();
653 idr_init_cache(); 654 idr_init_cache();
654 setup_per_cpu_pageset(); 655 setup_per_cpu_pageset();
@@ -770,6 +771,7 @@ static void __init do_basic_setup(void)
770{ 771{
771 rcu_init_sched(); /* needed by module_init stage. */ 772 rcu_init_sched(); /* needed by module_init stage. */
772 init_workqueues(); 773 init_workqueues();
774 cpuset_init_smp();
773 usermodehelper_init(); 775 usermodehelper_init();
774 driver_init(); 776 driver_init();
775 init_irq_proc(); 777 init_irq_proc();
@@ -794,6 +796,7 @@ static void run_init_process(char *init_filename)
794 * makes it inline to init() and it becomes part of init.text section 796 * makes it inline to init() and it becomes part of init.text section
795 */ 797 */
796static noinline int init_post(void) 798static noinline int init_post(void)
799 __releases(kernel_lock)
797{ 800{
798 /* need to finish all async __init code before freeing the memory */ 801 /* need to finish all async __init code before freeing the memory */
799 async_synchronize_full(); 802 async_synchronize_full();
@@ -842,7 +845,7 @@ static int __init kernel_init(void * unused)
842 /* 845 /*
843 * init can run on any cpu. 846 * init can run on any cpu.
844 */ 847 */
845 set_cpus_allowed_ptr(current, CPU_MASK_ALL_PTR); 848 set_cpus_allowed_ptr(current, cpu_all_mask);
846 /* 849 /*
847 * Tell the world that we're going to be the grim 850 * Tell the world that we're going to be the grim
848 * reaper of innocent orphaned children. 851 * reaper of innocent orphaned children.
@@ -863,8 +866,6 @@ static int __init kernel_init(void * unused)
863 smp_init(); 866 smp_init();
864 sched_init_smp(); 867 sched_init_smp();
865 868
866 cpuset_init_smp();
867
868 do_basic_setup(); 869 do_basic_setup();
869 870
870 /* 871 /*