]> www.infradead.org Git - mtd-utils.git/commitdiff
ubiattach: introduce max_beb_per1024 in UBI_IOCATT
authorRichard Genoud <richard.genoud@gmail.com>
Wed, 22 Aug 2012 16:04:36 +0000 (18:04 +0200)
committerArtem Bityutskiy <artem.bityutskiy@linux.intel.com>
Thu, 23 Aug 2012 09:16:10 +0000 (12:16 +0300)
The ioctl UBI_IOCATT has been extended with max_beb_per1024 parameter.

This parameter is used for adjusting the "maximum expected number of
bad blocks per 1024 blocks" for each mtd device.
The number of physical erase blocks (PEB) that UBI will reserve for bad
block handling is now:
whole_flash_chipset__PEB_number * max_beb_per1024 / 1024

This means that for a 4096 PEB NAND device with 3 MTD partitions:
mtd0: 512 PEB
mtd1: 1536 PEB
mtd2: 2048 PEB

the commands:
ubiattach -m 0 -d 0 -b 20 /dev/ubi_ctrl
ubiattach -m 1 -d 1 -b 20 /dev/ubi_ctrl
ubiattach -m 2 -d 2 -b 20 /dev/ubi_ctrl
will attach mtdx to UBIx and reserve:
80 PEB for bad block handling on UBI0
80 PEB for bad block handling on UBI1
80 PEB for bad block handling on UBI2

=> for the whole device, 240 PEB will be reserved for bad block
handling.

This may seems a waste of space, but as far as the bad blocks can appear
every where on a flash device, in the worst case scenario they can
all appear in one MTD partition.
So the maximum number of expected erase blocks given by the NAND
manufacturer should be reserve on each MTD partition.

Signed-off-by: Richard Genoud <richard.genoud@gmail.com>
Signed-off-by: Artem Bityutskiy <artem.bityutskiy@linux.intel.com>
tests/fs-tests/integrity/integck.c
ubi-utils/include/libubi.h
ubi-utils/libubi.c
ubi-utils/ubiattach.c

index 30322cdac7507777c5989f3741c3151b065ecd07..f12dfac85d7924c815de1a578dd2e414dd4ee991 100644 (file)
@@ -3152,6 +3152,7 @@ static int reattach(void)
        req.mtd_num = args.mtdn;
        req.vid_hdr_offset = 0;
        req.mtd_dev_node = NULL;
+       req.max_beb_per1024 = 0;
 
        err = ubi_attach(libubi, "/dev/ubi_ctrl", &req);
        if (err)
index 62fb5dd27f8f3b27896c9f26fd162fa971a619d3..84ac84c6254f42b45b2580ec5d236008dd3081bd 100644 (file)
@@ -50,6 +50,7 @@ typedef void * libubi_t;
  * @mtd_dev_node: path to MTD device node to attach
  * @vid_hdr_offset: VID header offset (%0 means default offset and this is what
  *                  most of the users want)
+ * @max_beb_per1024: Maximum expected bad eraseblocks per 1024 eraseblocks
  */
 struct ubi_attach_request
 {
@@ -57,6 +58,7 @@ struct ubi_attach_request
        int mtd_num;
        const char *mtd_dev_node;
        int vid_hdr_offset;
+       int max_beb_per1024;
 };
 
 /**
index 14719f1e962529d758b2a7ce501fe953897b770e..8e1d3ee96bcfa2773059a3d49c3f1cd06290bcd4 100644 (file)
@@ -769,6 +769,7 @@ int ubi_attach(libubi_t desc, const char *node, struct ubi_attach_request *req)
        r.ubi_num = req->dev_num;
        r.mtd_num = req->mtd_num;
        r.vid_hdr_offset = req->vid_hdr_offset;
+       r.max_beb_per1024 = req->max_beb_per1024;
 
        ret = do_attach(node, &r);
        if (ret == 0)
index 27e7c092087ba3c75d49271c1f84feb75db75ad2..8dd0bf6692728cb1bb125fae4f940c09c2c222a3 100644 (file)
@@ -42,6 +42,7 @@ struct args {
        int vidoffs;
        const char *node;
        const char *dev;
+       int max_beb_per1024;
 };
 
 static struct args args = {
@@ -50,6 +51,7 @@ static struct args args = {
        .vidoffs = 0,
        .node = NULL,
        .dev = NULL,
+       .max_beb_per1024 = 0,
 };
 
 static const char doc[] = PROGRAM_NAME " version " VERSION
@@ -63,6 +65,9 @@ static const char optionsstr[] =
 "                      if the character device node does not exist)\n"
 "-O, --vid-hdr-offset  VID header offset (do not specify this unless you really\n"
 "                      know what you are doing, the default should be optimal)\n"
+"-b, --max-beb-per1024 maximum expected bad block number per 1024 eraseblock.\n"
+"                      The default value is correct for most NAND devices.\n"
+"                      Allowed range is 0-768, 0 means the default kernel value.\n"
 "-h, --help            print help message\n"
 "-V, --version         print program version";
 
@@ -71,19 +76,26 @@ static const char usage[] =
 "\t[-m <MTD device number>] [-d <UBI device number>] [-p <path to device>]\n"
 "\t[--mtdn=<MTD device number>] [--devn=<UBI device number>]\n"
 "\t[--dev-path=<path to device>]\n"
+"\t[--max-beb-per1024=<maximum bad block number per 1024 blocks>]\n"
 "UBI control device defaults to " DEFAULT_CTRL_DEV " if not supplied.\n"
 "Example 1: " PROGRAM_NAME " -p /dev/mtd0 - attach /dev/mtd0 to UBI\n"
 "Example 2: " PROGRAM_NAME " -m 0 - attach MTD device 0 (mtd0) to UBI\n"
 "Example 3: " PROGRAM_NAME " -m 0 -d 3 - attach MTD device 0 (mtd0) to UBI\n"
-"           and create UBI device number 3 (ubi3)";
+"           and create UBI device number 3 (ubi3)\n"
+"Example 4: " PROGRAM_NAME " -m 1 -b 25 - attach /dev/mtd1 to UBI and reserve\n"
+"           25*C/1024 eraseblocks for bad block handling, where C is the flash\n"
+"           is total flash chip eraseblocks count, that is flash chip size in\n"
+"           eraseblocks (including bad eraseblocks). E.g., if the flash chip\n"
+"           has 4096 PEBs, 100 will be reserved.";
 
 static const struct option long_options[] = {
-       { .name = "devn",           .has_arg = 1, .flag = NULL, .val = 'd' },
-       { .name = "dev-path",       .has_arg = 1, .flag = NULL, .val = 'p' },
-       { .name = "mtdn",           .has_arg = 1, .flag = NULL, .val = 'm' },
-       { .name = "vid-hdr-offset", .has_arg = 1, .flag = NULL, .val = 'O' },
-       { .name = "help",           .has_arg = 0, .flag = NULL, .val = 'h' },
-       { .name = "version",        .has_arg = 0, .flag = NULL, .val = 'V' },
+       { .name = "devn",            .has_arg = 1, .flag = NULL, .val = 'd' },
+       { .name = "dev-path",        .has_arg = 1, .flag = NULL, .val = 'p' },
+       { .name = "mtdn",            .has_arg = 1, .flag = NULL, .val = 'm' },
+       { .name = "vid-hdr-offset",  .has_arg = 1, .flag = NULL, .val = 'O' },
+       { .name = "max-beb-per1024", .has_arg = 1, .flag = NULL, .val = 'b' },
+       { .name = "help",            .has_arg = 0, .flag = NULL, .val = 'h' },
+       { .name = "version",         .has_arg = 0, .flag = NULL, .val = 'V' },
        { NULL, 0, NULL, 0},
 };
 
@@ -92,7 +104,7 @@ static int parse_opt(int argc, char * const argv[])
        while (1) {
                int key, error = 0;
 
-               key = getopt_long(argc, argv, "p:m:d:O:hV", long_options, NULL);
+               key = getopt_long(argc, argv, "p:m:d:O:b:hV", long_options, NULL);
                if (key == -1)
                        break;
 
@@ -121,6 +133,17 @@ static int parse_opt(int argc, char * const argv[])
 
                        break;
 
+               case 'b':
+                       args.max_beb_per1024 = simple_strtoul(optarg, &error);
+                       if (error || args.max_beb_per1024 < 0 ||
+                           args.max_beb_per1024 > 768)
+                               return errmsg("bad maximum of expected bad blocks (0-768): \"%s\"", optarg);
+
+                       if (args.max_beb_per1024 == 0)
+                               warnmsg("the default kernel value will be used for maximum expected bad blocks");
+
+                       break;
+
                case 'h':
                        printf("%s\n\n", doc);
                        printf("%s\n\n", usage);
@@ -190,6 +213,7 @@ int main(int argc, char * const argv[])
        req.mtd_num = args.mtdn;
        req.vid_hdr_offset = args.vidoffs;
        req.mtd_dev_node = args.dev;
+       req.max_beb_per1024 = args.max_beb_per1024;
 
        err = ubi_attach(libubi, args.node, &req);
        if (err) {