summaryrefslogtreecommitdiff
path: root/packages/mtd/mtd-utils/favour_lzo.patch
diff options
context:
space:
mode:
Diffstat (limited to 'packages/mtd/mtd-utils/favour_lzo.patch')
-rw-r--r--packages/mtd/mtd-utils/favour_lzo.patch136
1 files changed, 136 insertions, 0 deletions
diff --git a/packages/mtd/mtd-utils/favour_lzo.patch b/packages/mtd/mtd-utils/favour_lzo.patch
new file mode 100644
index 0000000000..9e55d5f4b3
--- /dev/null
+++ b/packages/mtd/mtd-utils/favour_lzo.patch
@@ -0,0 +1,136 @@
+Add a favourlzo compression mode to mtd-utils
+
+This allows lzo compression to be used in the cases where the
+compression ratio isn't quite as good zlib. This can make sense in
+certain use cases because LZO decompression is much faster than zlib.
+
+Signed-off-by: Richard Purdie <rpurdie@openedhand.com>
+
+---
+ compr.c | 52 +++++++++++++++++++++++++++++++++++++++++++++++++---
+ compr.h | 1 +
+ 2 files changed, 50 insertions(+), 3 deletions(-)
+
+Index: git/compr.c
+===================================================================
+--- git.orig/compr.c 2007-03-01 11:58:01.000000000 +0000
++++ git/compr.c 2007-03-01 11:58:09.000000000 +0000
+@@ -16,6 +16,8 @@
+ #include <stdlib.h>
+ #include <linux/jffs2.h>
+
++#define FAVOUR_LZO_PERCENT 80
++
+ extern int page_size;
+
+ /* LIST IMPLEMENTATION (from linux/list.h) */
+@@ -166,6 +168,33 @@ static void jffs2_decompression_test(str
+ }
+ }
+
++/*
++ * Return 1 to use this compression
++ */
++static int jffs2_is_best_compression(struct jffs2_compressor *this,
++ struct jffs2_compressor *best, uint32_t size, uint32_t bestsize)
++{
++ switch (jffs2_compression_mode) {
++ case JFFS2_COMPR_MODE_SIZE:
++ if (bestsize > size)
++ return 1;
++ return 0;
++ case JFFS2_COMPR_MODE_FAVOURLZO:
++ if ((this->compr == JFFS2_COMPR_LZO) && (bestsize > size))
++ return 1;
++ if ((best->compr != JFFS2_COMPR_LZO) && (bestsize > size))
++ return 1;
++ if ((this->compr == JFFS2_COMPR_LZO) && (bestsize > (size * FAVOUR_LZO_PERCENT / 100)))
++ return 1;
++ if ((bestsize * FAVOUR_LZO_PERCENT / 100) > size)
++ return 1;
++
++ return 0;
++ }
++ /* Shouldn't happen */
++ return 0;
++}
++
+ /* jffs2_compress:
+ * @data: Pointer to uncompressed data
+ * @cdata: Pointer to returned pointer to buffer for compressed data
+@@ -231,21 +260,29 @@ uint16_t jffs2_compress( unsigned char *
+ }
+ if (ret == JFFS2_COMPR_NONE) free(output_buf);
+ break;
++ case JFFS2_COMPR_MODE_FAVOURLZO:
+ case JFFS2_COMPR_MODE_SIZE:
+ orig_slen = *datalen;
+ orig_dlen = *cdatalen;
+ list_for_each_entry(this, &jffs2_compressor_list, list) {
++ uint32_t needed_buf_size;
++
++ if (jffs2_compression_mode == JFFS2_COMPR_MODE_FAVOURLZO)
++ needed_buf_size = orig_slen+jffs2_compression_check;
++ else
++ needed_buf_size = orig_dlen+jffs2_compression_check;
++
+ /* Skip decompress-only backwards-compatibility and disabled modules */
+ if ((!this->compress)||(this->disabled))
+ continue;
+ /* Allocating memory for output buffer if necessary */
+- if ((this->compr_buf_size<orig_dlen+jffs2_compression_check)&&(this->compr_buf)) {
++ if ((this->compr_buf_size < needed_buf_size) && (this->compr_buf)) {
+ free(this->compr_buf);
+ this->compr_buf_size=0;
+ this->compr_buf=NULL;
+ }
+ if (!this->compr_buf) {
+- tmp_buf = malloc(orig_dlen+jffs2_compression_check);
++ tmp_buf = malloc(needed_buf_size);
+ if (!tmp_buf) {
+ fprintf(stderr,"mkfs.jffs2: No memory for compressor allocation. (%d bytes)\n",orig_dlen);
+ continue;
+@@ -265,7 +302,8 @@ uint16_t jffs2_compress( unsigned char *
+ if (!compr_ret) {
+ if (jffs2_compression_check)
+ jffs2_decompression_test(this, data_in, this->compr_buf, *cdatalen, *datalen, this->compr_buf_size);
+- if ((!best_dlen)||(best_dlen>*cdatalen)) {
++ if (((!best_dlen) || jffs2_is_best_compression(this, best, *cdatalen, best_dlen))
++ && (*cdatalen < *datalen)) {
+ best_dlen = *cdatalen;
+ best_slen = *datalen;
+ best = this;
+@@ -377,6 +415,9 @@ char *jffs2_stats(void)
+ case JFFS2_COMPR_MODE_SIZE:
+ act_buf += sprintf(act_buf,"size");
+ break;
++ case JFFS2_COMPR_MODE_FAVOURLZO:
++ act_buf += sprintf(act_buf,"favourlzo");
++ break;
+ default:
+ act_buf += sprintf(act_buf,"unkown");
+ break;
+@@ -413,6 +454,11 @@ int jffs2_set_compression_mode_name(cons
+ jffs2_compression_mode = JFFS2_COMPR_MODE_SIZE;
+ return 0;
+ }
++ if (!strcmp("favourlzo", name)) {
++ jffs2_compression_mode = JFFS2_COMPR_MODE_FAVOURLZO;
++ return 0;
++ }
++
+ return 1;
+ }
+
+Index: git/compr.h
+===================================================================
+--- git.orig/compr.h 2007-03-01 11:58:01.000000000 +0000
++++ git/compr.h 2007-03-01 11:58:09.000000000 +0000
+@@ -32,6 +32,7 @@
+ #define JFFS2_COMPR_MODE_NONE 0
+ #define JFFS2_COMPR_MODE_PRIORITY 1
+ #define JFFS2_COMPR_MODE_SIZE 2
++#define JFFS2_COMPR_MODE_FAVOURLZO 3
+
+ #define kmalloc(a,b) malloc(a)
+ #define kfree(a) free(a)