Re: [PATCH 2/2 ] Add support LZO in mkcramfs tool

From: vince kim
Date: Mon Oct 29 2007 - 14:54:24 EST


I have found out that Evolution word-wrapped the patch.

This must be clean.


diff -Naur cramfs-1.1/GNUmakefile cramfs-1.1_lzo/GNUmakefile
--- cramfs-1.1/GNUmakefile 2002-02-22 16:52:41.000000000 -0800
+++ cramfs-1.1_lzo/GNUmakefile 2007-10-26 13:38:01.000000000 -0700
@@ -1,12 +1,15 @@
CC = gcc
CFLAGS = -W -Wall -O2 -g
CPPFLAGS = -I.
-LDLIBS = -lz
+LDLIBS = -lz -llzo2
PROGS = mkcramfs cramfsck

all: $(PROGS)

+mkcramfs: lzo_compress.o
+
+
distclean clean:
- rm -f $(PROGS)
+ rm -f $(PROGS) *.o

.PHONY: all clean
diff -Naur cramfs-1.1/linux/cramfs_fs.h cramfs-1.1_lzo/linux/cramfs_fs.h
--- cramfs-1.1/linux/cramfs_fs.h 2002-02-20 00:03:32.000000000 -0800
+++ cramfs-1.1_lzo/linux/cramfs_fs.h 2007-10-26 13:38:01.000000000 -0700
@@ -79,6 +79,7 @@
#define CRAMFS_FLAG_HOLES 0x00000100 /* support for holes */
#define CRAMFS_FLAG_WRONG_SIGNATURE 0x00000200 /* reserved */
#define CRAMFS_FLAG_SHIFTED_ROOT_OFFSET 0x00000400 /* shifted root fs */
+#define CRAMFS_FLAG_LZO_COMPRESSION 0x00000800 /* LZO compression is used */

/*
* Valid values in super.flags. Currently we refuse to mount
@@ -88,11 +89,17 @@
#define CRAMFS_SUPPORTED_FLAGS ( 0x000000ff \
| CRAMFS_FLAG_HOLES \
| CRAMFS_FLAG_WRONG_SIGNATURE \
- | CRAMFS_FLAG_SHIFTED_ROOT_OFFSET )
+ | CRAMFS_FLAG_SHIFTED_ROOT_OFFSET \
+ | CRAMFS_FLAG_LZO_COMPRESSION )
+
+/* function pointer for uncompress function */
+int (* cramfs_uncompress_block) ();

/* Uncompression interfaces to the underlying zlib */
-int cramfs_uncompress_block(void *dst, int dstlen, void *src, int srclen);
+int cramfs_uncompress_block_zlib(void *dst, int dstlen, void *src, int srclen);
int cramfs_uncompress_init(void);
int cramfs_uncompress_exit(void);

+/* Uncompression interfaces to the underlying lzo */
+int cramfs_uncompress_block_lzo(void *dst, int dstlen, void *src, int srclen);
#endif
diff -Naur cramfs-1.1/lzo_compress.c cramfs-1.1_lzo/lzo_compress.c
--- cramfs-1.1/lzo_compress.c 1969-12-31 16:00:00.000000000 -0800
+++ cramfs-1.1_lzo/lzo_compress.c 2007-10-26 13:58:38.000000000 -0700
@@ -0,0 +1,54 @@
+#include <stdio.h>
+#include <stdint.h>
+#include <asm/types.h>
+#include <lzo/lzo1x.h>
+
+
+extern void *lzo_mem;
+extern void *lzo_compress_buf;
+extern int page_size;
+
+int cramfs_lzo_cmpr(unsigned char *data_in, unsigned char *cpage_out,
+ uint32_t sourcelen, uint32_t *dstlen)
+{
+ uint32_t compress_size;
+ int ret;
+
+
+ ret = lzo1x_999_compress(data_in, sourcelen, (void *)lzo_compress_buf, &compress_size, (void *)lzo_mem);
+
+ if (ret != LZO_E_OK || compress_size > *dstlen )
+ return -1;
+
+ memcpy(cpage_out, (void *)lzo_compress_buf, compress_size);
+ *dstlen = compress_size;
+
+ return 0;
+
+}
+
+int cramfs_lzo_init(void)
+{
+ lzo_mem = malloc(LZO1X_999_MEM_COMPRESS);
+ if (!lzo_mem)
+ return -1;
+
+ /* Worst case LZO compression size from their FAQ */
+
+ lzo_compress_buf = malloc(page_size + (page_size / 64) + 16 + 3);
+ if (!lzo_compress_buf) {
+ free(lzo_mem);
+ lzo_mem = NULL;
+ return -1;
+ }
+
+ return 0;
+}
+
+void cramfs_lzo_exit(void)
+{
+ free(lzo_compress_buf);
+ free(lzo_mem);
+}
+
+
diff -Naur cramfs-1.1/mkcramfs.c cramfs-1.1_lzo/mkcramfs.c
--- cramfs-1.1/mkcramfs.c 2002-02-20 00:03:32.000000000 -0800
+++ cramfs-1.1_lzo/mkcramfs.c 2007-10-26 13:57:15.000000000 -0700
@@ -76,6 +76,11 @@
static long total_blocks = 0, total_nodes = 1; /* pre-count the root node */
static int image_length = 0;

+/* For LZO compression */
+void *lzo_mem = NULL;
+void *lzo_compress_buf = NULL;
+int page_size = PAGE_CACHE_SIZE;
+
/*
* If opt_holes is set, then mkcramfs can create explicit holes in the
* data, which saves 26 bytes per hole (which is a lot smaller a
@@ -91,6 +96,7 @@
static int opt_holes = 0;
static int opt_pad = 0;
static int opt_verbose = 0;
+static int opt_lzo = 0;
static char *opt_image = NULL;
static char *opt_name = NULL;

@@ -128,6 +134,7 @@
" -E make all warnings errors (non-zero exit status)\n"
" -e edition set edition number (part of fsid)\n"
" -i file insert a file image into the filesystem (requires >= 2.4.0)\n"
+ " -l use LZO compression instead of ZLIB\n"
" -n name set name of cramfs filesystem\n"
" -p pad by %d bytes for boot code\n"
" -s sort directory entries (old option, ignored)\n"
@@ -153,6 +160,10 @@
}
fprintf(stderr, "\n");
va_end(arg_ptr);
+ if (lzo_compress_buf)
+ free(lzo_compress_buf);
+ if (lzo_mem)
+ free(lzo_mem);
exit(status);
}

@@ -386,6 +397,8 @@
super->flags |= CRAMFS_FLAG_HOLES;
if (image_length > 0)
super->flags |= CRAMFS_FLAG_SHIFTED_ROOT_OFFSET;
+ if (opt_lzo)
+ super->flags |= CRAMFS_FLAG_LZO_COMPRESSION;
super->size = size;
memcpy(super->signature, CRAMFS_SIGNATURE, sizeof(super->signature));

@@ -595,9 +608,18 @@
input = blksize;
size -= input;
if (!(opt_holes && is_zero (uncompressed, input))) {
- err = compress2(base + curr, &len, uncompressed, input, Z_BEST_COMPRESSION);
- if (err != Z_OK) {
- die(MKFS_ERROR, 0, "compression error: %s", zError(err));
+ if (opt_lzo) {
+ /* Use LZO compression */
+ err= cramfs_lzo_cmpr(uncompressed,base + curr,input, &len);
+ if (err < 0)
+ die(MKFS_ERROR, 0, "LZO compression error: %s");
+ }
+ else {
+ /* Use default ZLIB compression */
+ err = compress2(base + curr, &len, uncompressed, input, Z_BEST_COMPRESSION);
+ if (err != Z_OK) {
+ die(MKFS_ERROR, 0, "compression error: %s", zError(err));
+ }
}
curr += len;
}
@@ -699,7 +721,7 @@
progname = argv[0];

/* command line options */
- while ((c = getopt(argc, argv, "hEe:i:n:psvz")) != EOF) {
+ while ((c = getopt(argc, argv, "hEe:i:ln:psvz")) != EOF) {
switch (c) {
case 'h':
usage(MKFS_OK);
@@ -720,6 +742,10 @@
image_length = st.st_size; /* may be padded later */
fslen_ub += (image_length + 3); /* 3 is for padding */
break;
+ case 'l':
+ opt_lzo = 1;
+ printf("LZO compression is used istead of ZLIB\n");
+ break;
case 'n':
opt_name = optarg;
break;
@@ -751,7 +777,11 @@
if (fd < 0) {
die(MKFS_USAGE, 1, "open failed: %s", outfile);
}
-
+ if (opt_lzo) {
+
+ if ( cramfs_lzo_init() < 0 )
+ die(MKFS_ERROR, 1, "cramfs_lzo_init failed");
+ }
root_entry = calloc(1, sizeof(struct entry));
if (!root_entry) {
die(MKFS_ERROR, 1, "calloc failed");
@@ -867,7 +897,8 @@
if (opt_errors &&
(warn_namelen||warn_skip||warn_size||warn_uid||warn_gid||warn_dev))
exit(MKFS_ERROR);
-
+ if (opt_lzo)
+ cramfs_lzo_exit();
exit(MKFS_OK);
}



On Fri, 2007-10-26 at 16:26 -0700, vince kim wrote:
> This patch adds support LZO compression in mkcramfs tool, so it can
> generate a cramfs image compress with LZO.
> To compile mkcramfs with this patch, liblzo2-dev package must be
> installed.
>
> The patch is created against mkcramfs tool ver 1.1 which can be found
> at:
> http://sourceforge.net/projects/cramfs/
>
> I added command line option "-l" , so to create a cramfs image with LZO
> compression, "-l" must be specified at the command line.
>
> Of course, separate kernel patch is required to mount cramfs image
> compressed with LZO
> .
> Thanks,
>
> Vince Kyong-jin Kim
>
> diff -Naur cramfs-1.1/GNUmakefile cramfs-1.1_lzo/GNUmakefile
> --- cramfs-1.1 /GNUmakefile 2002-02-22 16:52:41.000000000 -0800
> +++ cramfs-1.1_lzo/GNUmakefile 2007-10-26 13:38:01.000000000 -0700
> @@ -1,12 +1,15 @@
> CC = gcc
> CFLAGS = -W -Wall -O2 -g
> CPPFLAGS = -I.
> -LDLIBS = -lz
> +LDLIBS = -lz -llzo2
> PROGS = mkcramfs cramfsck
>
> all: $(PROGS)
>
> +mkcramfs: lzo_compress.o
> +
> +
> distclean clean:
> - rm -f $(PROGS)
> + rm -f $(PROGS) *.o
>
> .PHONY: all clean
> diff -Naur cramfs-1.1/linux/cramfs_fs.h cramfs-1.1_lzo/linux/cramfs_fs.h
> --- cramfs-1.1/linux/cramfs_fs.h 2002-02-20 00:03:32.000000000
> -0800
> +++ cramfs-1.1_lzo/linux/cramfs_fs.h 2007-10-26 13:38:01.000000000
> -0700
> @@ -79,6 +79,7 @@
> #define CRAMFS_FLAG_HOLES 0x00000100 /* support for
> holes */
> #define CRAMFS_FLAG_WRONG_SIGNATURE 0x00000200 /* reserved */
> #define CRAMFS_FLAG_SHIFTED_ROOT_OFFSET 0x00000400 /*
> shifted root fs */
> +#define CRAMFS_FLAG_LZO_COMPRESSION 0x00000800 /* LZO
> compression is used */
>
> /*
> * Valid values in super.flags. Currently we refuse to mount
> @@ -88,11 +89,17 @@
> #define CRAMFS_SUPPORTED_FLAGS ( 0x000000ff \
> | CRAMFS_FLAG_HOLES \
> | CRAMFS_FLAG_WRONG_SIGNATURE \
> - | CRAMFS_FLAG_SHIFTED_ROOT_OFFSET )
> + | CRAMFS_FLAG_SHIFTED_ROOT_OFFSET \
> + | CRAMFS_FLAG_LZO_COMPRESSION )
> +
> +/* function pointer for uncompress function */
> +int (* cramfs_uncompress_block) ();
>
> /* Uncompression interfaces to the underlying zlib */
> -int cramfs_uncompress_block(void *dst, int dstlen, void *src, int
> srclen);
> +int cramfs_uncompress_block_zlib(void *dst, int dstlen, void *src, int
> srclen);
> int cramfs_uncompress_init(void);
> int cramfs_uncompress_exit(void);
>
> +/* Uncompression interfaces to the underlying lzo */
> +int cramfs_uncompress_block_lzo(void *dst, int dstlen, void *src, int
> srclen);
> #endif
> diff -Naur cramfs-1.1/lzo_compress.c cramfs-1.1_lzo/lzo_compress.c
> --- cramfs-1.1/lzo_compress.c 1969-12-31 16:00:00.000000000 -0800
> +++ cramfs-1.1_lzo/lzo_compress.c 2007-10-26 13:58:38.000000000
> -0700
> @@ -0,0 +1,54 @@
> +#include <stdio.h>
> +#include <stdint.h >
> +#include <asm/types.h>
> +#include <lzo/lzo1x.h>
> +
> +
> +extern void *lzo_mem;
> +extern void *lzo_compress_buf;
> +extern int page_size;
> +
> +int cramfs_lzo_cmpr(unsigned char *data_in, unsigned char *cpage_out,
> + uint32_t sourcelen, uint32_t *dstlen)
> +{
> + uint32_t compress_size;
> + int ret;
> +
> +
> + ret = lzo1x_999_compress(data_in, sourcelen, (void
> *)lzo_compress_buf, &compress_size, (void *)lzo_mem);
> +
> + if (ret != LZO_E_OK || compress_size > *dstlen )
> + return -1;
> +
> + memcpy(cpage_out, (void *)lzo_compress_buf, compress_size);
> + *dstlen = compress_size;
> +
> + return 0;
> +
> +}
> +
> +int cramfs_lzo_init(void)
> +{
> + lzo_mem = malloc(LZO1X_999_MEM_COMPRESS);
> + if (!lzo_mem)
> + return -1;
> +
> + /* Worst case LZO compression size from their FAQ */
> +
> + lzo_compress_buf = malloc(page_size + (page_size / 64) + 16 +
> 3);
> + if (!lzo_compress_buf) {
> + free(lzo_mem);
> + lzo_mem = NULL;
> + return -1;
> + }
> +
> + return 0;
> +}
> +
> +void cramfs_lzo_exit(void)
> +{
> + free(lzo_compress_buf);
> + free(lzo_mem);
> +}
> +
> +
> diff -Naur cramfs-1.1/mkcramfs.c cramfs-1.1_lzo/mkcramfs.c
> --- cramfs-1.1/mkcramfs.c 2002-02-20 00:03:32.000000000 -0800
> +++ cramfs-1.1_lzo/mkcramfs.c 2007-10-26 13:57:15.000000000 -0700
> @@ -76,6 +76,11 @@
> static long total_blocks = 0, total_nodes = 1; /* pre-count the root
> node */
> static int image_length = 0;
>
> +/* For LZO compression */
> +void *lzo_mem = NULL;
> +void *lzo_compress_buf = NULL;
> +int page_size = PAGE_CACHE_SIZE;
> +
> /*
> * If opt_holes is set, then mkcramfs can create explicit holes in the
> * data, which saves 26 bytes per hole (which is a lot smaller a
> @@ -91,6 +96,7 @@
> static int opt_holes = 0;
> static int opt_pad = 0;
> static int opt_verbose = 0;
> +static int opt_lzo = 0;
> static char *opt_image = NULL;
> static char *opt_name = NULL;
>
> @@ -128,6 +134,7 @@
> " -E make all warnings errors (non-zero exit
> status)\n"
> " -e edition set edition number (part of fsid)\n"
> " -i file insert a file image into the filesystem
> (requires >= 2.4.0)\n"
> + " -l use LZO compression instead of ZLIB\n"
> " -n name set name of cramfs filesystem\n"
> " -p pad by %d bytes for boot code\n"
> " -s sort directory entries (old option,
> ignored)\n"
> @@ -153,6 +160,10 @@
> }
> fprintf(stderr, "\n");
> va_end(arg_ptr);
> + if (lzo_compress_buf)
> + free(lzo_compress_buf);
> + if (lzo_mem)
> + free(lzo_mem);
> exit(status);
> }
>
> @@ -386,6 +397,8 @@
> super->flags |= CRAMFS_FLAG_HOLES;
> if (image_length > 0)
> super->flags |= CRAMFS_FLAG_SHIFTED_ROOT_OFFSET;
> + if (opt_lzo)
> + super->flags |= CRAMFS_FLAG_LZO_COMPRESSION;
> super->size = size;
> memcpy(super->signature, CRAMFS_SIGNATURE,
> sizeof(super->signature));
>
> @@ -595,9 +608,18 @@
> input = blksize;
> size -= input;
> if (!(opt_holes && is_zero (uncompressed, input))) {
> - err = compress2(base + curr, &len, uncompressed,
> input, Z_BEST_COMPRESSION);
> - if (err != Z_OK) {
> - die(MKFS_ERROR, 0, "compression error: %
> s", zError(err));
> + if (opt_lzo) {
> + /* Use LZO compression */
> + err= cramfs_lzo_cmpr(uncompressed,base +
> curr,input, &len);
> + if (err < 0)
> + die(MKFS_ERROR, 0, "LZO
> compression error: %s");
> + }
> + else {
> + /* Use default ZLIB compression */
> + err = compress2(base + curr, &len,
> uncompressed, input, Z_BEST_COMPRESSION);
> + if (err != Z_OK) {
> + die(MKFS_ERROR, 0, "compression
> error: %s", zError(err));
> + }
> }
> curr += len;
> }
> @@ -699,7 +721,7 @@
> progname = argv[0];
>
> /* command line options */
> - while ((c = getopt(argc, argv, "hEe:i:n:psvz")) != EOF) {
> + while ((c = getopt(argc, argv, "hEe:i:ln:psvz")) != EOF) {
> switch (c) {
> case 'h':
> usage(MKFS_OK);
> @@ -720,6 +742,10 @@
> image_length = st.st_size; /* may be padded
> later */
> fslen_ub += (image_length + 3); /* 3 is for
> padding */
> break;
> + case 'l':
> + opt_lzo = 1;
> + printf("LZO compression is used istead of ZLIB
> \n");
> + break;
> case 'n':
> opt_name = optarg;
> break;
> @@ -751,7 +777,11 @@
> if (fd < 0) {
> die(MKFS_USAGE, 1, "open failed: %s", outfile);
> }
> -
> + if (opt_lzo) {
> +
> + if ( cramfs_lzo_init() < 0 )
> + die(MKFS_ERROR, 1, "cramfs_lzo_init failed");
> + }
> root_entry = calloc(1, sizeof(struct entry));
> if (!root_entry) {
> die(MKFS_ERROR, 1, "calloc failed");
> @@ -867,7 +897,8 @@
> if (opt_errors &&
> (warn_namelen||warn_skip||warn_size||warn_uid||warn_gid||
> warn_dev))
> exit(MKFS_ERROR);
> -
> + if (opt_lzo)
> + cramfs_lzo_exit();
> exit(MKFS_OK);
> }
>
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/