Commit 889c92d21db40be0b7d22a59395060237895bb85
1 parent
6c11b12ac6
Exists in
master
and in
20 other branches
bzip2/lzma: centralize format detection
Centralize the compression format detection to a common routine in the lib directory, and use it for both initramfs and initrd. Signed-off-by: H. Peter Anvin <hpa@zytor.com>
Showing 5 changed files with 72 additions and 67 deletions Side-by-side Diff
include/linux/decompress/generic.h
init/do_mounts_rd.c
... | ... | @@ -12,9 +12,6 @@ |
12 | 12 | |
13 | 13 | #include <linux/decompress/generic.h> |
14 | 14 | |
15 | -#include <linux/decompress/bunzip2.h> | |
16 | -#include <linux/decompress/unlzma.h> | |
17 | -#include <linux/decompress/inflate.h> | |
18 | 15 | |
19 | 16 | int __initdata rd_prompt = 1;/* 1 = prompt for RAM disk, 0 = don't prompt */ |
20 | 17 | |
... | ... | @@ -49,24 +46,6 @@ |
49 | 46 | * cramfs |
50 | 47 | * gzip |
51 | 48 | */ |
52 | -static const struct compress_format { | |
53 | - unsigned char magic[2]; | |
54 | - const char *name; | |
55 | - decompress_fn decompressor; | |
56 | -} compressed_formats[] = { | |
57 | -#ifdef CONFIG_RD_GZIP | |
58 | - { {037, 0213}, "gzip", gunzip }, | |
59 | - { {037, 0236}, "gzip", gunzip }, | |
60 | -#endif | |
61 | -#ifdef CONFIG_RD_BZIP2 | |
62 | - { {0x42, 0x5a}, "bzip2", bunzip2 }, | |
63 | -#endif | |
64 | -#ifdef CONFIG_RD_LZMA | |
65 | - { {0x5d, 0x00}, "lzma", unlzma }, | |
66 | -#endif | |
67 | - { {0, 0}, NULL, NULL } | |
68 | -}; | |
69 | - | |
70 | 49 | static int __init |
71 | 50 | identify_ramdisk_image(int fd, int start_block, decompress_fn *decompressor) |
72 | 51 | { |
... | ... | @@ -77,7 +56,7 @@ |
77 | 56 | struct cramfs_super *cramfsb; |
78 | 57 | int nblocks = -1; |
79 | 58 | unsigned char *buf; |
80 | - const struct compress_format *cf; | |
59 | + const char *compress_name; | |
81 | 60 | |
82 | 61 | buf = kmalloc(size, GFP_KERNEL); |
83 | 62 | if (!buf) |
... | ... | @@ -95,15 +74,12 @@ |
95 | 74 | sys_lseek(fd, start_block * BLOCK_SIZE, 0); |
96 | 75 | sys_read(fd, buf, size); |
97 | 76 | |
98 | - for (cf = compressed_formats; cf->decompressor; cf++) { | |
99 | - if (buf[0] == cf->magic[0] && buf[1] == cf->magic[1]) { | |
100 | - printk(KERN_NOTICE | |
101 | - "RAMDISK: %s image found at block %d\n", | |
102 | - cf->name, start_block); | |
103 | - *decompressor = cf->decompressor; | |
104 | - nblocks = 0; | |
105 | - goto done; | |
106 | - } | |
77 | + *decompressor = decompress_method(buf, size, &compress_name); | |
78 | + if (*decompressor) { | |
79 | + printk(KERN_NOTICE "RAMDISK: %s image found at block %d\n", | |
80 | + compress_name, start_block); | |
81 | + nblocks = 0; | |
82 | + goto done; | |
107 | 83 | } |
108 | 84 | |
109 | 85 | /* romfs is at block zero too */ |
init/initramfs.c
... | ... | @@ -416,13 +416,13 @@ |
416 | 416 | |
417 | 417 | static unsigned my_inptr; /* index of next byte to be processed in inbuf */ |
418 | 418 | |
419 | -#include <linux/decompress/bunzip2.h> | |
420 | -#include <linux/decompress/unlzma.h> | |
421 | -#include <linux/decompress/inflate.h> | |
419 | +#include <linux/decompress/generic.h> | |
422 | 420 | |
423 | 421 | static char * __init unpack_to_rootfs(char *buf, unsigned len, int check_only) |
424 | 422 | { |
425 | 423 | int written; |
424 | + decompress_fn decompress; | |
425 | + | |
426 | 426 | dry_run = check_only; |
427 | 427 | header_buf = kmalloc(110, GFP_KERNEL); |
428 | 428 | symlink_buf = kmalloc(PATH_MAX + N_ALIGN(PATH_MAX) + 1, GFP_KERNEL); |
... | ... | @@ -450,35 +450,10 @@ |
450 | 450 | continue; |
451 | 451 | } |
452 | 452 | this_header = 0; |
453 | -#ifdef CONFIG_RD_GZIP | |
454 | - if (!gunzip(buf, len, NULL, flush_buffer, NULL, | |
455 | - &my_inptr, error) && | |
456 | - message == NULL) | |
457 | - goto ok; | |
458 | -#endif | |
459 | - | |
460 | -#ifdef CONFIG_RD_BZIP2 | |
461 | - message = NULL; /* Zero out message, or else cpio will | |
462 | - think an error has already occured */ | |
463 | - if (!bunzip2(buf, len, NULL, flush_buffer, NULL, | |
464 | - &my_inptr, error) && | |
465 | - message == NULL) { | |
466 | - goto ok; | |
467 | - } | |
468 | -#endif | |
469 | - | |
470 | -#ifdef CONFIG_RD_LZMA | |
471 | - message = NULL; /* Zero out message, or else cpio will | |
472 | - think an error has already occured */ | |
473 | - if (!unlzma(buf, len, NULL, flush_buffer, NULL, | |
474 | - &my_inptr, error) && | |
475 | - message == NULL) { | |
476 | - goto ok; | |
477 | - } | |
478 | -#endif | |
479 | -#if defined CONFIG_RD_GZIP || defined CONFIG_RD_BZIP2 || defined CONFIG_RD_LZMA | |
480 | -ok: | |
481 | -#endif | |
453 | + decompress = decompress_method(buf, len, NULL); | |
454 | + if (decompress) | |
455 | + decompress(buf, len, NULL, flush_buffer, NULL, | |
456 | + &my_inptr, error); | |
482 | 457 | if (state != Reset) |
483 | 458 | error("junk in compressed archive"); |
484 | 459 | this_header = saved_offset + my_inptr; |
lib/Makefile
... | ... | @@ -11,7 +11,8 @@ |
11 | 11 | rbtree.o radix-tree.o dump_stack.o \ |
12 | 12 | idr.o int_sqrt.o extable.o prio_tree.o \ |
13 | 13 | sha1.o irq_regs.o reciprocal_div.o argv_split.o \ |
14 | - proportions.o prio_heap.o ratelimit.o show_mem.o is_single_threaded.o | |
14 | + proportions.o prio_heap.o ratelimit.o show_mem.o \ | |
15 | + is_single_threaded.o decompress.o | |
15 | 16 | |
16 | 17 | lib-$(CONFIG_MMU) += ioremap.o |
17 | 18 | lib-$(CONFIG_SMP) += cpumask.o |
... | ... | @@ -65,9 +66,9 @@ |
65 | 66 | obj-$(CONFIG_LZO_COMPRESS) += lzo/ |
66 | 67 | obj-$(CONFIG_LZO_DECOMPRESS) += lzo/ |
67 | 68 | |
68 | -obj-$(CONFIG_DECOMPRESS_GZIP) += decompress_inflate.o | |
69 | -obj-$(CONFIG_DECOMPRESS_BZIP2) += decompress_bunzip2.o | |
70 | -obj-$(CONFIG_DECOMPRESS_LZMA) += decompress_unlzma.o | |
69 | +lib-$(CONFIG_DECOMPRESS_GZIP) += decompress_inflate.o | |
70 | +lib-$(CONFIG_DECOMPRESS_BZIP2) += decompress_bunzip2.o | |
71 | +lib-$(CONFIG_DECOMPRESS_LZMA) += decompress_unlzma.o | |
71 | 72 | |
72 | 73 | obj-$(CONFIG_TEXTSEARCH) += textsearch.o |
73 | 74 | obj-$(CONFIG_TEXTSEARCH_KMP) += ts_kmp.o |
lib/decompress.c
1 | +/* | |
2 | + * decompress.c | |
3 | + * | |
4 | + * Detect the decompression method based on magic number | |
5 | + */ | |
6 | + | |
7 | +#include <linux/decompress/generic.h> | |
8 | + | |
9 | +#include <linux/decompress/bunzip2.h> | |
10 | +#include <linux/decompress/unlzma.h> | |
11 | +#include <linux/decompress/inflate.h> | |
12 | + | |
13 | +#include <linux/types.h> | |
14 | +#include <linux/string.h> | |
15 | + | |
16 | +static const struct compress_format { | |
17 | + unsigned char magic[2]; | |
18 | + const char *name; | |
19 | + decompress_fn decompressor; | |
20 | +} compressed_formats[] = { | |
21 | +#ifdef CONFIG_DECOMPRESS_GZIP | |
22 | + { {037, 0213}, "gzip", gunzip }, | |
23 | + { {037, 0236}, "gzip", gunzip }, | |
24 | +#endif | |
25 | +#ifdef CONFIG_DECOMPRESS_BZIP2 | |
26 | + { {0x42, 0x5a}, "bzip2", bunzip2 }, | |
27 | +#endif | |
28 | +#ifdef CONFIG_DECOMPRESS_LZMA | |
29 | + { {0x5d, 0x00}, "lzma", unlzma }, | |
30 | +#endif | |
31 | + { {0, 0}, NULL, NULL } | |
32 | +}; | |
33 | + | |
34 | +decompress_fn decompress_method(const unsigned char *inbuf, int len, | |
35 | + const char **name) | |
36 | +{ | |
37 | + const struct compress_format *cf; | |
38 | + | |
39 | + if (len < 2) | |
40 | + return NULL; /* Need at least this much... */ | |
41 | + | |
42 | + for (cf = compressed_formats; cf->decompressor; cf++) { | |
43 | + if (!memcmp(inbuf, cf->magic, 2)) | |
44 | + break; | |
45 | + | |
46 | + } | |
47 | + if (name) | |
48 | + *name = cf->name; | |
49 | + return cf->decompressor; | |
50 | +} |