123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960 |
- --- a/drivers/mtd/redboot.c
- +++ b/drivers/mtd/redboot.c
- @@ -30,6 +30,8 @@
- #include <linux/mtd/partitions.h>
- #include <linux/module.h>
-
- +#define BOARD_CONFIG_PART "boardconfig"
- +
- struct fis_image_desc {
- unsigned char name[16]; // Null terminated name
- uint32_t flash_base; // Address within FLASH of image
- @@ -60,6 +62,7 @@ static int parse_redboot_partitions(stru
- const struct mtd_partition **pparts,
- struct mtd_part_parser_data *data)
- {
- + unsigned long max_offset = 0;
- int nrparts = 0;
- struct fis_image_desc *buf;
- struct mtd_partition *parts;
- @@ -225,14 +228,15 @@ static int parse_redboot_partitions(stru
- }
- }
- #endif
- - parts = kzalloc(sizeof(*parts)*nrparts + nulllen + namelen, GFP_KERNEL);
- + parts = kzalloc(sizeof(*parts) * (nrparts + 1) + nulllen + namelen +
- + sizeof(BOARD_CONFIG_PART), GFP_KERNEL);
-
- if (!parts) {
- ret = -ENOMEM;
- goto out;
- }
-
- - nullname = (char *)&parts[nrparts];
- + nullname = (char *)&parts[nrparts + 1];
- #ifdef CONFIG_MTD_REDBOOT_PARTS_UNALLOCATED
- if (nulllen > 0) {
- strcpy(nullname, nullstring);
- @@ -251,6 +255,8 @@ static int parse_redboot_partitions(stru
- }
- #endif
- for ( ; i<nrparts; i++) {
- + if (max_offset < buf[i].flash_base + buf[i].size)
- + max_offset = buf[i].flash_base + buf[i].size;
- parts[i].size = fl->img->size;
- parts[i].offset = fl->img->flash_base;
- parts[i].name = names;
- @@ -284,6 +290,13 @@ static int parse_redboot_partitions(stru
- fl = fl->next;
- kfree(tmp_fl);
- }
- + if (master->size - max_offset >= master->erasesize) {
- + parts[nrparts].size = master->size - max_offset;
- + parts[nrparts].offset = max_offset;
- + parts[nrparts].name = names;
- + strcpy(names, BOARD_CONFIG_PART);
- + nrparts++;
- + }
- ret = nrparts;
- *pparts = parts;
- out:
|