aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--mkfs.ubifs/mkfs.ubifs.c34
-rw-r--r--mkfs.ubifs/ubifs.h4
2 files changed, 31 insertions, 7 deletions
diff --git a/mkfs.ubifs/mkfs.ubifs.c b/mkfs.ubifs/mkfs.ubifs.c
index 46f8058..8394df9 100644
--- a/mkfs.ubifs/mkfs.ubifs.c
+++ b/mkfs.ubifs/mkfs.ubifs.c
@@ -128,7 +128,7 @@ static struct inum_mapping **hash_table;
/* Inode creation sequence number */
static unsigned long long creat_sqnum;
-static const char *optstring = "d:r:m:o:D:h?vVe:c:g:f:P:k:x:j:l:j:U";
+static const char *optstring = "d:r:m:o:D:h?vVe:c:g:f:P:k:x:X:j:l:j:U";
static const struct option longopts[] = {
{"root", 1, NULL, 'r'},
@@ -143,6 +143,7 @@ static const struct option longopts[] = {
{"debug-level", 1, NULL, 'g'},
{"jrn-size", 1, NULL, 'j'},
{"compr", 1, NULL, 'x'},
+ {"favor-percent", 1, NULL, 'X'},
{"fanout", 1, NULL, 'f'},
{"keyhash", 1, NULL, 'k'},
{"log-lebs", 1, NULL, 'l'},
@@ -161,8 +162,11 @@ static const char *helptext =
"-c, --max-leb-cnt=COUNT maximum logical erase block count\n"
"-o, --output=FILE output to FILE\n"
"-j, --jrn-size=SIZE journal size\n"
-"-x, --compr=TYPE compression type - \"lzo\", \"zlib\" or \"none\"\n"
-" (default: \"lzo\")\n"
+"-x, --compr=TYPE compression type - \"lzo\", \"favor_lzo\", \"zlib\" or\n"
+" \"none\" (default: \"lzo\")\n"
+"-X, --favor-percent may only be used with favor LZO compression and defines\n"
+" how many percent better zlib should compress to make\n"
+" mkfs.ubifs use zlib instead of LZO (default 20%)\n"
"-f, --fanout=NUM fanout NUM (default: 8)\n"
"-k, --keyhash=TYPE key hash type - \"r5\" or \"test\" (default: \"r5\")\n"
"-p, --orph-lebs=COUNT count of erase blocks for orphans (default: 1)\n"
@@ -176,7 +180,15 @@ static const char *helptext =
" 2 - files, 3 - more details)\n"
"-h, --help display this help text\n\n"
"Note, SIZE is specified in bytes, but it may also be specified in Kilobytes,\n"
-"Megabytes, and Gigabytes if a KiB, MiB, or GiB suffix is used.\n";
+"Megabytes, and Gigabytes if a KiB, MiB, or GiB suffix is used.\n\n"
+"If you specify \"lzo\" or \"zlib\" compressors, mkfs.ubifs will use this compressor\n"
+"for all data. The \"none\" disables any data compression. The \"favor_lzo\" is not\n"
+"really a separate compressor. It is just a method of combining \"lzo\" and \"zlib\"\n"
+"compressors. Namely, mkfs.ubifs tries to compress data with both \"lzo\" and \"zlib\"\n"
+"compressors, then it compares which compressor is better. If \"zlib\" compresses 20\n"
+"or more percent better than \"lzo\", mkfs.ubifs chooses \"lzo\", otherwise it chooses\n"
+"\"zlib\". The \"--favor-percent\" may specify arbitrary threshold instead of the\n"
+"default 20%.\n";
/**
* make_path - make a path name from a directory and a name.
@@ -437,6 +449,7 @@ static int get_options(int argc, char**argv)
c->key_hash = key_r5_hash;
c->key_len = UBIFS_SK_LEN;
c->default_compr = UBIFS_COMPR_LZO;
+ c->favor_percent = 20;
c->lsave_cnt = 256;
c->leb_size = -1;
c->min_io_size = -1;
@@ -540,15 +553,22 @@ static int get_options(int argc, char**argv)
return err_msg("bad key hash");
break;
case 'x':
- if (strcmp(optarg, "lzo") == 0)
- c->default_compr = UBIFS_COMPR_LZO;
+ if (strcmp(optarg, "favor_lzo") == 0)
+ c->favor_lzo = 1;
else if (strcmp(optarg, "zlib") == 0)
c->default_compr = UBIFS_COMPR_ZLIB;
else if (strcmp(optarg, "none") == 0)
c->default_compr = UBIFS_COMPR_NONE;
- else
+ else if (strcmp(optarg, "lzo") != 0)
return err_msg("bad compressor name");
break;
+ case 'X':
+ c->favor_percent = strtol(optarg, &endp, 0);
+ if (*endp != '\0' || endp == optarg ||
+ c->favor_percent <= 0 || c->favor_percent >= 100)
+ return err_msg("bad favor LZO percent '%s'",
+ optarg);
+ break;
case 'j':
c->max_bud_bytes = get_bytes(optarg);
if (c->max_bud_bytes <= 0)
diff --git a/mkfs.ubifs/ubifs.h b/mkfs.ubifs/ubifs.h
index 0804801..fbefc53 100644
--- a/mkfs.ubifs/ubifs.h
+++ b/mkfs.ubifs/ubifs.h
@@ -272,6 +272,8 @@ struct ubifs_znode
* @main_lebs: count of LEBs in the main area
* @main_first: first LEB of the main area
* @default_compr: default compression type
+ * @favor_lzo: favor LZO compression method
+ * @favor_percent: lzo vs. zlib threshold used in case favor LZO
*
* @key_hash_type: type of the key hash
* @key_hash: direntry key hash function
@@ -342,6 +344,8 @@ struct ubifs_info
int main_lebs;
int main_first;
int default_compr;
+ int favor_lzo;
+ int favor_percent;
uint8_t key_hash_type;
uint32_t (*key_hash)(const char *str, int len);