diff options
author | Ingo Molnar <mingo@elte.hu> | 2009-04-06 03:02:57 -0400 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2009-04-06 03:02:57 -0400 |
commit | f541ae326fa120fa5c57433e4d9a133df212ce41 (patch) | |
tree | bdbd94ec72cfc601118051cb35e8617d55510177 /init | |
parent | e255357764f92afcafafbd4879b222b8c752065a (diff) | |
parent | 0221c81b1b8eb0cbb6b30a0ced52ead32d2b4e4c (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/Kconfig | 115 | ||||
-rw-r--r-- | init/do_mounts.c | 1 | ||||
-rw-r--r-- | init/do_mounts.h | 1 | ||||
-rw-r--r-- | init/do_mounts_md.c | 5 | ||||
-rw-r--r-- | init/do_mounts_rd.c | 178 | ||||
-rw-r--r-- | init/initramfs.c | 200 | ||||
-rw-r--r-- | init/main.c | 11 |
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 | ||
104 | config HAVE_KERNEL_GZIP | ||
105 | bool | ||
106 | |||
107 | config HAVE_KERNEL_BZIP2 | ||
108 | bool | ||
109 | |||
110 | config HAVE_KERNEL_LZMA | ||
111 | bool | ||
112 | |||
113 | choice | ||
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 | |||
135 | config 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 | |||
143 | config 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 | |||
153 | config 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 | |||
162 | endchoice | ||
163 | |||
104 | config SWAP | 164 | config 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 | ||
472 | config CPUSETS | 532 | config 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 | ||
541 | endif # CGROUPS | 603 | endif # 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 | |||
675 | config SYSCTL | 737 | config SYSCTL |
676 | bool | 738 | bool |
677 | 739 | ||
740 | config ANON_INODES | ||
741 | bool | ||
742 | |||
678 | menuconfig EMBEDDED | 743 | menuconfig 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 | ||
783 | config 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 | |||
795 | config BASE_FULL | 848 | config 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 | ||
812 | config ANON_INODES | ||
813 | bool | ||
814 | |||
815 | config EPOLL | 865 | config 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 | ||
980 | config 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 | |||
930 | choice | 992 | choice |
931 | prompt "Choose SLAB allocator" | 993 | prompt "Choose SLAB allocator" |
932 | default SLUB | 994 | default SLUB |
@@ -975,13 +1037,25 @@ config TRACEPOINTS | |||
975 | 1037 | ||
976 | config MARKERS | 1038 | config 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 | ||
983 | source "arch/Kconfig" | 1045 | source "arch/Kconfig" |
984 | 1046 | ||
1047 | config 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 | |||
985 | endmenu # General setup | 1059 | endmenu # General setup |
986 | 1060 | ||
987 | config HAVE_GENERIC_DMA_COHERENT | 1061 | config HAVE_GENERIC_DMA_COHERENT |
@@ -996,7 +1070,6 @@ config SLABINFO | |||
996 | 1070 | ||
997 | config RT_MUTEXES | 1071 | config RT_MUTEXES |
998 | boolean | 1072 | boolean |
999 | select PLIST | ||
1000 | 1073 | ||
1001 | config BASE_SMALL | 1074 | config 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 | ||
1086 | config STOP_MACHINE | 1159 | config 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 | |||
117 | static void __init md_setup_drive(void) | 116 | static 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 | |||
14 | int __initdata rd_prompt = 1;/* 1 = prompt for RAM disk, 0 = don't prompt */ | 17 | int __initdata rd_prompt = 1;/* 1 = prompt for RAM disk, 0 = don't prompt */ |
15 | 18 | ||
16 | static int __init prompt_ramdisk(char *str) | 19 | static 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 | ||
32 | static int __init crd_load(int in_fd, int out_fd); | 35 | static 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 | */ |
48 | static int __init | 51 | static int __init |
49 | identify_ramdisk_image(int fd, int start_block) | 52 | identify_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 | ||
146 | done: | 151 | done: |
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 | |||
286 | typedef unsigned char uch; | ||
287 | typedef unsigned short ush; | ||
288 | typedef 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 | |||
294 | static uch *inbuf; | ||
295 | static uch *window; | ||
296 | |||
297 | static unsigned insize; /* valid bytes in inbuf */ | ||
298 | static unsigned inptr; /* index of next byte to be processed in inbuf */ | ||
299 | static unsigned outcnt; /* bytes in output buffer */ | ||
300 | static int exit_code; | 282 | static int exit_code; |
301 | static int unzip_error; | 283 | static int decompress_error; |
302 | static long bytes_out; | ||
303 | static int crd_infd, crd_outfd; | 284 | static int crd_infd, crd_outfd; |
304 | 285 | ||
305 | #define get_byte() (inptr < insize ? inbuf[inptr++] : fill_inbuf()) | 286 | static 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 | |||
318 | static int __init fill_inbuf(void); | ||
319 | static void __init flush_window(void); | ||
320 | static 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 | */ | ||
331 | static 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 | /* =========================================================================== | 296 | static 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 | */ | ||
350 | static 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 | ||
372 | static void __init error(char *x) | 310 | static 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 | ||
379 | static int __init crd_load(int in_fd, int out_fd) | 317 | static 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; | |||
166 | static __initdata unsigned count; | 167 | static __initdata unsigned count; |
167 | static __initdata loff_t this_header, next_header; | 168 | static __initdata loff_t this_header, next_header; |
168 | 169 | ||
169 | static __initdata int dry_run; | ||
170 | |||
171 | static inline void __init eat(unsigned n) | 170 | static 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 | ||
393 | static void __init flush_buffer(char *buf, unsigned len) | 386 | static 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 | /* | 409 | static 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 | |||
423 | typedef unsigned char uch; | ||
424 | typedef unsigned short ush; | ||
425 | typedef 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 | |||
430 | static uch *inbuf; | ||
431 | static uch *window; | ||
432 | |||
433 | static unsigned insize; /* valid bytes in inbuf */ | ||
434 | static unsigned inptr; /* index of next byte to be processed in inbuf */ | ||
435 | static unsigned outcnt; /* bytes in output buffer */ | ||
436 | static 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 | |||
451 | static void __init flush_window(void); | ||
452 | static 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 | */ | ||
462 | static 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 | ||
479 | static char * __init unpack_to_rootfs(char *buf, unsigned len, int check_only) | 413 | static 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 | ||
519 | static 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 | |||
577 | static int __init populate_rootfs(void) | 565 | static 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 | */ |
796 | static noinline int init_post(void) | 798 | static 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 | /* |