tools/mtd-utils: update mkfs.ubifs XZ support
[openwrt/svn-archive/archive.git] / tools / mtd-utils / patches / 136-mkfs.ubifs-xz-support.patch
index a574d2e2fefc6a9aa5b3a6e4f466777e68357b8b..fccc0b4ded94a38948c6bf7fc6b236621a8e32d2 100644 (file)
        rm -f $(BUILDDIR)/hashtable/*.o cscope.*
 --- a/mkfs.ubifs/mkfs.ubifs.c
 +++ b/mkfs.ubifs/mkfs.ubifs.c
        rm -f $(BUILDDIR)/hashtable/*.o cscope.*
 --- a/mkfs.ubifs/mkfs.ubifs.c
 +++ b/mkfs.ubifs/mkfs.ubifs.c
-@@ -178,8 +178,8 @@ static const char *helptext =
+@@ -98,6 +98,9 @@ struct ubifs_info info_;
+ static struct ubifs_info *c = &info_;
+ static libubi_t ubi;
++static int force_compr_set;
++static int force_compr;
++
+ /* Debug levels are: 0 (none), 1 (statistics), 2 (files) ,3 (more details) */
+ int debug_level;
+ int verbose;
+@@ -132,7 +135,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:Fp:k:x:X:j:R:l:j:UQq";
++static const char *optstring = "d:r:m:o:D:h?vVe:c:g:f:Fp:k:x:X:y:j:R:l:j:UQq";
+ static const struct option longopts[] = {
+       {"root",               1, NULL, 'r'},
+@@ -149,6 +152,7 @@ static const struct option longopts[] =
+       {"reserved",           1, NULL, 'R'},
+       {"compr",              1, NULL, 'x'},
+       {"favor-percent",      1, NULL, 'X'},
++      {"force-compr",        1, NULL, 'y'},
+       {"fanout",             1, NULL, 'f'},
+       {"space-fixup",        0, NULL, 'F'},
+       {"keyhash",            1, NULL, 'k'},
+@@ -178,11 +182,13 @@ static const char *helptext =
  "-o, --output=FILE        output to FILE\n"
  "-j, --jrn-size=SIZE      journal size\n"
  "-R, --reserved=SIZE      how much space should be reserved for the super-user\n"
 -"-x, --compr=TYPE         compression type - \"lzo\", \"favor_lzo\", \"zlib\" or\n"
 -"                         \"none\" (default: \"lzo\")\n"
  "-o, --output=FILE        output to FILE\n"
  "-j, --jrn-size=SIZE      journal size\n"
  "-R, --reserved=SIZE      how much space should be reserved for the super-user\n"
 -"-x, --compr=TYPE         compression type - \"lzo\", \"favor_lzo\", \"zlib\" or\n"
 -"                         \"none\" (default: \"lzo\")\n"
-+"-x, --compr=TYPE         compression type - \"lzo\", \"favor_lzo\", \"zlib\",\n"
-+"                         \"xz\" or \"none\" (default: \"lzo\")\n"
++"-x, --compr=TYPE         default compression type - \"lzo\", \"favor_lzo\",\n"
++"                         \"zlib\" or \"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"
  "-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"
-@@ -208,7 +208,7 @@ static const char *helptext =
- "-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\n"
--"If you specify \"lzo\" or \"zlib\" compressors, mkfs.ubifs will use this compressor\n"
-+"If you specify \"lzo\", \"xz\" 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"
-@@ -653,10 +653,13 @@ static int get_options(int argc, char**a
-                               c->favor_lzo = 1;
-                       else if (strcmp(optarg, "zlib") == 0)
-                               c->default_compr = UBIFS_COMPR_ZLIB;
-+                      else if (strcmp(optarg, "xz") == 0)
-+                              c->default_compr = UBIFS_COMPR_XZ;
-                       else if (strcmp(optarg, "none") == 0)
-                               c->default_compr = UBIFS_COMPR_NONE;
-                       else if (strcmp(optarg, "lzo") != 0)
++"-y, --force-compr=TYPE   force to build the fs with different compression -\n"
++"                         \"lzo\", \"zlib\" or \"none\"\n"
+ "-f, --fanout=NUM         fanout NUM (default: 8)\n"
+ "-F, --space-fixup        file-system free space has to be fixed up on first mount\n"
+ "                         (requires kernel version 3.0 or greater)\n"
+@@ -530,6 +536,43 @@ static int open_ubi(const char *node)
+       return 0;
+ }
++static const char *get_compr_str(int compr)
++{
++      switch (compr) {
++      case UBIFS_COMPR_LZO:
++              return "lzo";
++      case UBIFS_COMPR_ZLIB:
++              return "zlib";
++      case UBIFS_COMPR_XZ:
++              return "xz";
++      case UBIFS_COMPR_NONE:
++              return "none";
++      }
++
++      return "unknown";
++}
++
++static int get_compr_option(char *opt, int *compr_type, int *favor_lzo)
++{
++      *compr_type = UBIFS_COMPR_LZO;
++
++      if (favor_lzo)
++              *favor_lzo = 0;
++
++      if (favor_lzo && strcmp(optarg, "favor_lzo") == 0)
++              *favor_lzo = 1;
++      else if (strcmp(optarg, "zlib") == 0)
++              *compr_type = UBIFS_COMPR_ZLIB;
++      else if (strcmp(optarg, "xz") == 0)
++              *compr_type = UBIFS_COMPR_XZ;
++      else if (strcmp(optarg, "none") == 0)
++              *compr_type = UBIFS_COMPR_NONE;
++      else if (strcmp(optarg, "lzo") != 0)
++              return -1;
++
++      return 0;
++}
++
+ static int get_options(int argc, char**argv)
+ {
+       int opt, i;
+@@ -649,14 +692,13 @@ static int get_options(int argc, char**a
+                               return err_msg("bad key hash");
+                       break;
+               case 'x':
+-                      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 if (strcmp(optarg, "lzo") != 0)
 -                              return err_msg("bad compressor name");
 -                              return err_msg("bad compressor name");
++                      if (get_compr_option(optarg, &c->default_compr,
++                                           &c->favor_lzo))
 +                              return err_msg("bad compressor name '%s'",
 +                              return err_msg("bad compressor name '%s'",
-+                                             optarg);
++                                              optarg);
++                      if (c->default_compr == UBIFS_COMPR_XZ)
++                              return err_msg("'%s' can't be used as default compressor",
++                                              optarg);
                        break;
                case 'X':
                        c->favor_percent = strtol(optarg, &endp, 0);
                        break;
                case 'X':
                        c->favor_percent = strtol(optarg, &endp, 0);
-@@ -765,6 +768,9 @@ static int get_options(int argc, char**a
-               case UBIFS_COMPR_ZLIB:
-                       printf("\tcompr:        zlib\n");
+@@ -665,6 +707,12 @@ static int get_options(int argc, char**a
+                               return err_msg("bad favor LZO percent '%s'",
+                                              optarg);
                        break;
                        break;
-+              case UBIFS_COMPR_XZ:
-+                      printf("\tcompr:        xz\n");
++              case 'y':
++                      if (get_compr_option(optarg, &force_compr, NULL))
++                              return err_msg("bad forced compressor name '%s'",
++                                              optarg);
++                      force_compr_set = 1;
 +                      break;
 +                      break;
-               case UBIFS_COMPR_NONE:
-                       printf("\tcompr:        none\n");
-                       break;
+               case 'j':
+                       c->max_bud_bytes = get_bytes(optarg);
+                       if (c->max_bud_bytes <= 0)
+@@ -749,6 +797,9 @@ static int get_options(int argc, char**a
+               c->min_io_size = 8;
+       c->rp_size = add_space_overhead(c->rp_size);
++      if (force_compr_set == 0)
++              force_compr = c->default_compr;
++
+       if (verbose) {
+               printf("mkfs.ubifs\n");
+               printf("\troot:         %s\n", root);
+@@ -758,17 +809,10 @@ static int get_options(int argc, char**a
+               printf("\toutput:       %s\n", output);
+               printf("\tjrn_size:     %llu\n", c->max_bud_bytes);
+               printf("\treserved:     %llu\n", c->rp_size);
+-              switch (c->default_compr) {
+-              case UBIFS_COMPR_LZO:
+-                      printf("\tcompr:        lzo\n");
+-                      break;
+-              case UBIFS_COMPR_ZLIB:
+-                      printf("\tcompr:        zlib\n");
+-                      break;
+-              case UBIFS_COMPR_NONE:
+-                      printf("\tcompr:        none\n");
+-                      break;
+-              }
++              printf("\tcompr:        %s\n", get_compr_str(c->default_compr));
++              if (forced_compr_set)
++                      printf("\tforced compr: %s\n",
++                             get_compr_str(force_compr));
+               printf("\tkeyhash:      %s\n", (c->key_hash == key_r5_hash) ?
+                                               "r5" : "test");
+               printf("\tfanout:       %d\n", c->fanout);
+@@ -1353,7 +1397,7 @@ static int add_file(const char *path_nam
+                       use_compr = UBIFS_COMPR_LZO;
+               else
+ #endif
+-                      use_compr = c->default_compr;
++                      use_compr = force_compr;
+               compr_type = compress_data(buf, bytes_read, &dn->data,
+                                          &out_len, use_compr);
+               dn->compr_type = cpu_to_le16(compr_type);
 --- a/mkfs.ubifs/mkfs.ubifs.h
 +++ b/mkfs.ubifs/mkfs.ubifs.h
 @@ -77,6 +77,9 @@
 --- a/mkfs.ubifs/mkfs.ubifs.h
 +++ b/mkfs.ubifs/mkfs.ubifs.h
 @@ -77,6 +77,9 @@