All of lore.kernel.org
 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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.