LKML Archive mirror
 help / color / mirror / Atom feed
* [PATCH 0/2] Fix some initramfs-related LZO decompression issues
@ 2010-04-19 19:03 Albin Tonnerre
  2010-04-19 19:03 ` [PATCH 1/2] lib: fix the use of LZO to decompress initramfs images Albin Tonnerre
  2010-04-19 19:03 ` [PATCH 2/2] Add support for in-kernel initramfs compressed with LZO Albin Tonnerre
  0 siblings, 2 replies; 3+ messages in thread
From: Albin Tonnerre @ 2010-04-19 19:03 UTC (permalink / raw
  To: linux-kernel; +Cc: akpm, hpa, Albin Tonnerre

These 2 patches fix some issues with the current LZO decompressor code.
The first one (re-)enables the use of LZO-compressed external initramfs, which
has been broken for some time. The second one enables the use of in-kernel
initramfs compressed using LZO.
If that's possible, I'd like to get at least patch 1/2 in 2.6.34, since it
is an actual bug fix.

Albin Tonnerre (2):
  lib: fix initramfs usage for the LZO decompressor
  Add support for in-kernel initramfs compressed with LZO

 lib/decompress_unlzo.c        |   22 +++++++++++++++-------
 scripts/gen_initramfs_list.sh |    1 +
 usr/Makefile                  |    5 ++++-
 usr/initramfs_data.lzo.S      |   29 +++++++++++++++++++++++++++++
 4 files changed, 49 insertions(+), 8 deletions(-)
 create mode 100644 usr/initramfs_data.lzo.S


^ permalink raw reply	[flat|nested] 3+ messages in thread

* [PATCH 1/2] lib: fix the use of LZO to decompress initramfs images
  2010-04-19 19:03 [PATCH 0/2] Fix some initramfs-related LZO decompression issues Albin Tonnerre
@ 2010-04-19 19:03 ` Albin Tonnerre
  2010-04-19 19:03 ` [PATCH 2/2] Add support for in-kernel initramfs compressed with LZO Albin Tonnerre
  1 sibling, 0 replies; 3+ messages in thread
From: Albin Tonnerre @ 2010-04-19 19:03 UTC (permalink / raw
  To: linux-kernel; +Cc: akpm, hpa, Albin Tonnerre

This patch fixes 2 issues with the LZO decompressor:
 - It doesn't handle the case where a block isn't compressed at all. In
   this case, calling lzo1x_decompress_safe will fail, so we need to
   just use memcpy() instead (the upstream LZO code does something
   similar)
 - Since commit 54291362d2a5738e1b0495df2abcb9e6b0563a3f, the
   decompressor return code is checked in the init/initramfs.c
   The LZO decompressor didn't return the expected value, causing the
   initramfs code to falsely believe a decompression error occured

Signed-off-by: Albin Tonnerre <albin.tonnerre@free-electrons.com>
Tested-By: bert schulze <spambemyguest@googlemail.com>
--
 lib/decompress_unlzo.c |   22 +++++++++++++++-------
 1 files changed, 15 insertions(+), 7 deletions(-)

diff --git a/lib/decompress_unlzo.c b/lib/decompress_unlzo.c
index db521f4..bcb3a4b 100644
--- a/lib/decompress_unlzo.c
+++ b/lib/decompress_unlzo.c
@@ -97,7 +97,7 @@ STATIC inline int INIT unlzo(u8 *input, int in_len,
 	u32 src_len, dst_len;
 	size_t tmp;
 	u8 *in_buf, *in_buf_save, *out_buf;
-	int obytes_processed = 0;
+	int ret = -1;
 
 	set_error_fn(error_fn);
 
@@ -174,15 +174,22 @@ STATIC inline int INIT unlzo(u8 *input, int in_len,
 
 		/* decompress */
 		tmp = dst_len;
-		r = lzo1x_decompress_safe((u8 *) in_buf, src_len,
+
+		/* When the input data is not compressed at all,
+		 * lzo1x_decompress_safe will fail, so call memcpy()
+		 * instead */
+		if (unlikely(dst_len == src_len))
+			memcpy(out_buf, in_buf, src_len);
+		else {
+			r = lzo1x_decompress_safe((u8 *) in_buf, src_len,
 						out_buf, &tmp);
 
-		if (r != LZO_E_OK || dst_len != tmp) {
-			error("Compressed data violation");
-			goto exit_2;
+			if (r != LZO_E_OK || dst_len != tmp) {
+				error("Compressed data violation");
+				goto exit_2;
+			}
 		}
 
-		obytes_processed += dst_len;
 		if (flush)
 			flush(out_buf, dst_len);
 		if (output)
@@ -196,6 +203,7 @@ STATIC inline int INIT unlzo(u8 *input, int in_len,
 			in_buf += src_len;
 	}
 
+	ret = 0;
 exit_2:
 	if (!input)
 		free(in_buf);
@@ -203,7 +211,7 @@ exit_1:
 	if (!output)
 		free(out_buf);
 exit:
-	return obytes_processed;
+	return ret;
 }
 
 #define decompress unlzo
-- 
1.7.0.4


^ permalink raw reply related	[flat|nested] 3+ messages in thread

* [PATCH 2/2] Add support for in-kernel initramfs compressed with LZO
  2010-04-19 19:03 [PATCH 0/2] Fix some initramfs-related LZO decompression issues Albin Tonnerre
  2010-04-19 19:03 ` [PATCH 1/2] lib: fix the use of LZO to decompress initramfs images Albin Tonnerre
@ 2010-04-19 19:03 ` Albin Tonnerre
  1 sibling, 0 replies; 3+ messages in thread
From: Albin Tonnerre @ 2010-04-19 19:03 UTC (permalink / raw
  To: linux-kernel; +Cc: akpm, hpa, Albin Tonnerre

This patch adds the necessary parts to be enable the use of
LZO-compressed initramfs build into the kernel.

Signed-off-by: Albin Tonnerre <albin.tonnerre@free-electrons.com>
---
 scripts/gen_initramfs_list.sh |    1 +
 usr/Makefile                  |    5 ++++-
 usr/initramfs_data.lzo.S      |   29 +++++++++++++++++++++++++++++
 3 files changed, 34 insertions(+), 1 deletions(-)
 create mode 100644 usr/initramfs_data.lzo.S

diff --git a/scripts/gen_initramfs_list.sh b/scripts/gen_initramfs_list.sh
index 76af5f9..a932ae5 100644
--- a/scripts/gen_initramfs_list.sh
+++ b/scripts/gen_initramfs_list.sh
@@ -242,6 +242,7 @@ case "$arg" in
 		echo "$output_file" | grep -q "\.gz$" && compr="gzip -9 -f"
 		echo "$output_file" | grep -q "\.bz2$" && compr="bzip2 -9 -f"
 		echo "$output_file" | grep -q "\.lzma$" && compr="lzma -9 -f"
+		echo "$output_file" | grep -q "\.lzo$" && compr="lzop -9 -f"
 		echo "$output_file" | grep -q "\.cpio$" && compr="cat"
 		shift
 		;;
diff --git a/usr/Makefile b/usr/Makefile
index 1e6a9e4..6b4b6da 100644
--- a/usr/Makefile
+++ b/usr/Makefile
@@ -15,6 +15,9 @@ suffix_$(CONFIG_INITRAMFS_COMPRESSION_BZIP2)  = .bz2
 # Lzma
 suffix_$(CONFIG_INITRAMFS_COMPRESSION_LZMA)   = .lzma
 
+# Lzo
+suffix_$(CONFIG_INITRAMFS_COMPRESSION_LZO)   = .lzo
+
 # Generate builtin.o based on initramfs_data.o
 obj-$(CONFIG_BLK_DEV_INITRD) := initramfs_data$(suffix_y).o
 
@@ -45,7 +48,7 @@ endif
 quiet_cmd_initfs = GEN     $@
       cmd_initfs = $(initramfs) -o $@ $(ramfs-args) $(ramfs-input)
 
-targets := initramfs_data.cpio.gz initramfs_data.cpio.bz2 initramfs_data.cpio.lzma initramfs_data.cpio
+targets := initramfs_data.cpio.gz initramfs_data.cpio.bz2 initramfs_data.cpio.lzma initramfs_data.cpio.lzo initramfs_data.cpio
 # do not try to update files included in initramfs
 $(deps_initramfs): ;
 
diff --git a/usr/initramfs_data.lzo.S b/usr/initramfs_data.lzo.S
new file mode 100644
index 0000000..5921190
--- /dev/null
+++ b/usr/initramfs_data.lzo.S
@@ -0,0 +1,29 @@
+/*
+  initramfs_data includes the compressed binary that is the
+  filesystem used for early user space.
+  Note: Older versions of "as" (prior to binutils 2.11.90.0.23
+  released on 2001-07-14) dit not support .incbin.
+  If you are forced to use older binutils than that then the
+  following trick can be applied to create the resulting binary:
+
+
+  ld -m elf_i386  --format binary --oformat elf32-i386 -r \
+  -T initramfs_data.scr initramfs_data.cpio.gz -o initramfs_data.o
+   ld -m elf_i386  -r -o built-in.o initramfs_data.o
+
+  initramfs_data.scr looks like this:
+SECTIONS
+{
+       .init.ramfs : { *(.data) }
+}
+
+  The above example is for i386 - the parameters vary from architectures.
+  Eventually look up LDFLAGS_BLOB in an older version of the
+  arch/$(ARCH)/Makefile to see the flags used before .incbin was introduced.
+
+  Using .incbin has the advantage over ld that the correct flags are set
+  in the ELF header, as required by certain architectures.
+*/
+
+.section .init.ramfs,"a"
+.incbin "usr/initramfs_data.cpio.lzo"
-- 
1.7.0.4


^ permalink raw reply related	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2010-04-19 19:13 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-04-19 19:03 [PATCH 0/2] Fix some initramfs-related LZO decompression issues Albin Tonnerre
2010-04-19 19:03 ` [PATCH 1/2] lib: fix the use of LZO to decompress initramfs images Albin Tonnerre
2010-04-19 19:03 ` [PATCH 2/2] Add support for in-kernel initramfs compressed with LZO Albin Tonnerre

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).