]> www.infradead.org Git - mtd-utils.git/commitdiff
ubinize: add sequence number support
authorArtem Bityutskiy <Artem.Bityutskiy@nokia.com>
Sun, 26 Jul 2009 15:06:58 +0000 (18:06 +0300)
committerArtem Bityutskiy <Artem.Bityutskiy@nokia.com>
Sun, 26 Jul 2009 15:45:03 +0000 (18:45 +0300)
UBI now supports the image sequence number feature which
prevents UBI from mistakingly accepting half-written images,
if the image was written on top of an older image. Support
this feature in ubinize and make it pick a random
number for the UBI image sequence number.

Signed-off-by: Artem Bityutskiy <Artem.Bityutskiy@nokia.com>
ubi-utils/include/libscan.h
ubi-utils/include/libubigen.h
ubi-utils/src/common.c
ubi-utils/src/common.h
ubi-utils/src/libubigen.c
ubi-utils/src/mtdinfo.c
ubi-utils/src/ubiformat.c
ubi-utils/src/ubinize.c

index 3ba291fa1e748eb348a224b80760979807d3cf11..a2b8657b0fcf3173ae56173a2352b8ed2662ce4b 100644 (file)
@@ -111,4 +111,3 @@ void ubi_scan_free(struct ubi_scan_info *si);
 #endif
 
 #endif /* __LIBSCAN_H__ */
-
index 34cd91a5a5755e67af070562fab166350c0c7dd9..2b567d3a04995f894cc15d4b41cf45b9c7e3dda8 100644 (file)
@@ -42,6 +42,7 @@ extern "C" {
  * @ubi_ver: UBI version
  * @vtbl_size: volume table size
  * @max_volumes: maximum amount of volumes
+ * @image_seq: UBI image sequence number
  */
 struct ubigen_info
 {
@@ -53,6 +54,7 @@ struct ubigen_info
        int ubi_ver;
        int vtbl_size;
        int max_volumes;
+       uint32_t image_seq;
 };
 
 /**
@@ -89,7 +91,8 @@ struct ubigen_vol_info
 };
 
 void ubigen_info_init(struct ubigen_info *ui, int peb_size, int min_io_size,
-                     int subpage_size, int vid_hdr_offs, int ubi_ver);
+                     int subpage_size, int vid_hdr_offs, int ubi_ver,
+                     uint32_t image_seq);
 struct ubi_vtbl_record *ubigen_create_empty_vtbl(const struct ubigen_info *ui);
 void ubigen_init_ec_hdr(const struct ubigen_info *ui,
                        struct ubi_ec_hdr *hdr, long long ec);
index 50a07abc29574291fbb77283494a144ba1de7512..3fd470b6c011adf3279db5b9b75f492f8f4370cb 100644 (file)
@@ -27,6 +27,7 @@
 #include <string.h>
 #include <ctype.h>
 #include <stdlib.h>
+#include "common.h"
 
 /**
  * get_multiplier - convert size specifier to an integer multiplier.
index 56fa020d0225de234a34f5e93648eb89ac5ffdc1..955c50fba8f305af85b66b27f4a0fa6b3743015e 100644 (file)
@@ -20,6 +20,7 @@
 #define __UBI_UTILS_COMMON_H__
 
 #include <stdio.h>
+#include <ctype.h>
 #include <string.h>
 #include <errno.h>
 
index a34963e1a4b5c0c82f02b06694bb151678a2154d..db58cae4a0aaa107b52204f03956d8dbe44465ee 100644 (file)
  *                @min_io_size if does not exist)
  * @vid_hdr_offs: offset of the VID header
  * @ubi_ver: UBI version
+ * @image_seq: UBI image sequence number
  */
 void ubigen_info_init(struct ubigen_info *ui, int peb_size, int min_io_size,
-                     int subpage_size, int vid_hdr_offs, int ubi_ver)
+                     int subpage_size, int vid_hdr_offs, int ubi_ver,
+                     uint32_t image_seq)
 {
        if (!vid_hdr_offs) {
                vid_hdr_offs = UBI_EC_HDR_SIZE + subpage_size - 1;
@@ -64,6 +66,7 @@ void ubigen_info_init(struct ubigen_info *ui, int peb_size, int min_io_size,
        ui->data_offs *= min_io_size;
        ui->leb_size = peb_size - ui->data_offs;
        ui->ubi_ver = ubi_ver;
+       ui->image_seq = image_seq;
 
        ui->max_volumes = ui->leb_size / UBI_VTBL_RECORD_SIZE;
        if (ui->max_volumes > UBI_MAX_VOLUMES)
@@ -157,8 +160,8 @@ void ubigen_init_ec_hdr(const struct ubigen_info *ui,
        hdr->version = ui->ubi_ver;
        hdr->ec = cpu_to_be64(ec);
        hdr->vid_hdr_offset = cpu_to_be32(ui->vid_hdr_offs);
-
        hdr->data_offset = cpu_to_be32(ui->data_offs);
+       hdr->image_seq = cpu_to_be32(ui->image_seq);
 
        crc = crc32(UBI_CRC32_INIT, hdr, UBI_EC_HDR_SIZE_CRC);
        hdr->hdr_crc = cpu_to_be32(crc);
index a7ce8346a550bf843eb09e67cdfc03e8b1d69494..be8b1ff1256cda28928e4f4d03992309787dbb23 100644 (file)
@@ -215,7 +215,7 @@ static int print_dev_info(libmtd_t libmtd, const struct mtd_info *mtd_info, int
        }
 
        ubigen_info_init(&ui, mtd.eb_size, mtd.min_io_size, mtd.subpage_size,
-                        0, 1);
+                        0, 1, 0);
        printf("Default UBI VID header offset:  %d\n", ui.vid_hdr_offs);
        printf("Default UBI data offset:        %d\n", ui.data_offs);
        printf("Default UBI LEB size:           ");
index 55ce7aa81f827590712b1e8dd21408f9487d483a..a2ca57231bb9f38a6522259dd63cbb7f3b7fe1e3 100644 (file)
@@ -875,7 +875,7 @@ int main(int argc, char * const argv[])
                normsg("use erase counter %lld for all eraseblocks", args.ec);
 
        ubigen_info_init(&ui, mtd.eb_size, mtd.min_io_size, mtd.subpage_size,
-                        args.vid_hdr_offs, args.ubi_ver);
+                        args.vid_hdr_offs, args.ubi_ver, 0);
 
        if (si->vid_hdr_offs != -1 && ui.vid_hdr_offs != si->vid_hdr_offs) {
                /*
@@ -895,7 +895,7 @@ int main(int argc, char * const argv[])
                                printf("yes\n");
                } else
                        ubigen_info_init(&ui, mtd.eb_size, mtd.min_io_size, 0,
-                                        si->vid_hdr_offs, args.ubi_ver);
+                                        si->vid_hdr_offs, args.ubi_ver, 0);
                normsg("use offsets %d and %d",  ui.vid_hdr_offs, ui.data_offs);
        }
 
index 0762aa8b40a45083404778e037c4d7cac3c5b0a1..8d623624bad64e2c0d0ab4c56809cb359cd06885 100644 (file)
@@ -38,7 +38,7 @@
 #include <libiniparser.h>
 #include "common.h"
 
-#define PROGRAM_VERSION "1.1"
+#define PROGRAM_VERSION "1.2"
 #define PROGRAM_NAME    "ubinize"
 
 static const char *doc = PROGRAM_NAME " version " PROGRAM_VERSION
@@ -70,12 +70,17 @@ static const char *optionsstr =
 "                             (default is 0)\n"
 "-x, --ubi-ver=<num>          UBI version number to put to EC headers\n"
 "                             (default is 1)\n"
+"-Q, --image-seq=<num>        32-bit UBI image sequence number to use\n"
+"                             (by default a random number is picked)\n"
 "-v, --verbose                be verbose\n"
 "-h, --help                   print help message\n"
 "-V, --version                print program version";
 
 static const char *usage =
-"Usage: " PROGRAM_NAME " [-o filename] [-h] [-V] [--output=<filename>] [--help]\n"
+"Usage: " PROGRAM_NAME " [-o filename] [-p <bytes>] [-m <bytes>] [-s <bytes>] [-O <num>] [-e <num>]\n"
+"\t\t[-x <num>] [-Q <num>] [-v] [-h] [-V] [--output=<filename>] [--peb-size=<bytes>]\n"
+"\t\t[--min-io-size=<bytes>] [--sub-page-size=<bytes>] [--vid-hdr-offset=<num>]\n"
+"\t\t[--erase-counter=<num>] [--ubi-ver=<num>] [--image-seq=<num>] [--verbose] [--help]\n"
 "\t\t[--version] ini-file\n"
 "Example: " PROGRAM_NAME " -o ubi.img -p 16KiB -m 512 -s 256 cfg.ini - create UBI image\n"
 "         'ubi.img' as described by configuration file 'cfg.ini'";
@@ -121,6 +126,7 @@ struct option long_options[] = {
        { .name = "vid-hdr-offset", .has_arg = 1, .flag = NULL, .val = 'O' },
        { .name = "erase-counter",  .has_arg = 1, .flag = NULL, .val = 'e' },
        { .name = "ubi-ver",        .has_arg = 1, .flag = NULL, .val = 'x' },
+       { .name = "image-seq",      .has_arg = 1, .flag = NULL, .val = 'Q' },
        { .name = "verbose",        .has_arg = 0, .flag = NULL, .val = 'v' },
        { .name = "help",           .has_arg = 0, .flag = NULL, .val = 'h' },
        { .name = "version",        .has_arg = 0, .flag = NULL, .val = 'V' },
@@ -137,6 +143,7 @@ struct args {
        int vid_hdr_offs;
        int ec;
        int ubi_ver;
+       long long image_seq;
        int verbose;
        dictionary *dict;
 };
@@ -146,6 +153,7 @@ static struct args args = {
        .min_io_size  = -1,
        .subpage_size = -1,
        .ubi_ver      = 1,
+       .image_seq    = -1,
 };
 
 static int parse_opt(int argc, char * const argv[])
@@ -154,7 +162,7 @@ static int parse_opt(int argc, char * const argv[])
                int key;
                char *endp;
 
-               key = getopt_long(argc, argv, "o:p:m:s:O:e:x:vhV", long_options, NULL);
+               key = getopt_long(argc, argv, "o:p:m:s:O:e:x:Q:vhV", long_options, NULL);
                if (key == -1)
                        break;
 
@@ -207,6 +215,12 @@ static int parse_opt(int argc, char * const argv[])
                                return errmsg("bad UBI version: \"%s\"", optarg);
                        break;
 
+               case 'Q':
+                       args.image_seq = strtoul(optarg, &endp, 0);
+                       if (*endp != '\0'  || endp == optarg || args.image_seq > 0xFFFFFFFF)
+                               return errmsg("bad UBI image sequence number: \"%s\"", optarg);
+                       break;
+
                case 'v':
                        args.verbose = 1;
                        break;
@@ -267,6 +281,10 @@ static int parse_opt(int argc, char * const argv[])
                        return errmsg("VID header offset has to be multiple of min. I/O unit size");
        }
 
+       if (!args.image_seq == -1) {
+               srand(getpid());
+               args.image_seq = random();
+       }
        return 0;
 }
 
@@ -449,14 +467,15 @@ int main(int argc, char * const argv[])
 
        ubigen_info_init(&ui, args.peb_size, args.min_io_size,
                         args.subpage_size, args.vid_hdr_offs,
-                        args.ubi_ver);
-
-       verbose(args.verbose, "LEB size:      %d", ui.leb_size);
-       verbose(args.verbose, "PEB size:      %d", ui.peb_size);
-       verbose(args.verbose, "min. I/O size: %d", ui.min_io_size);
-       verbose(args.verbose, "sub-page size: %d", args.subpage_size);
-       verbose(args.verbose, "VID offset:    %d", ui.vid_hdr_offs);
-       verbose(args.verbose, "data offset:   %d", ui.data_offs);
+                        args.ubi_ver, args.image_seq);
+
+       verbose(args.verbose, "LEB size:                  %d", ui.leb_size);
+       verbose(args.verbose, "PEB size:                  %d", ui.peb_size);
+       verbose(args.verbose, "min. I/O size:             %d", ui.min_io_size);
+       verbose(args.verbose, "sub-page size:             %d", args.subpage_size);
+       verbose(args.verbose, "VID offset:                %d", ui.vid_hdr_offs);
+       verbose(args.verbose, "data offset:               %d", ui.data_offs);
+       verbose(args.verbose, "UBI image sequence number: %u", ui.image_seq);
 
        vtbl = ubigen_create_empty_vtbl(&ui);
        if (!vtbl)