--- zzzz-none-000/linux-2.6.32.61/drivers/mtd/redboot.c 2013-06-10 09:43:48.000000000 +0000 +++ ar9-7330-650/linux-2.6.32.61/drivers/mtd/redboot.c 2011-07-20 07:23:51.000000000 +0000 @@ -11,6 +11,8 @@ #include #include +#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 @@ -41,6 +43,7 @@ struct mtd_partition **pparts, unsigned long fis_origin) { + unsigned long max_offset = 0; int nrparts = 0; struct fis_image_desc *buf; struct mtd_partition *parts; @@ -209,14 +212,14 @@ } } #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); @@ -235,6 +238,8 @@ } #endif for ( ; iimg->size; parts[i].offset = fl->img->flash_base; parts[i].name = names; @@ -249,18 +254,33 @@ #endif names += strlen(names)+1; -#ifdef CONFIG_MTD_REDBOOT_PARTS_UNALLOCATED if(fl->next && fl->img->flash_base + fl->img->size + master->erasesize <= fl->next->img->flash_base) { - i++; - parts[i].offset = parts[i-1].size + parts[i-1].offset; - parts[i].size = fl->next->img->flash_base - parts[i].offset; - parts[i].name = nullname; - } + if (!strcmp(parts[i].name, "rootfs")) { + parts[i].size = fl->next->img->flash_base; + parts[i].size &= ~(master->erasesize - 1); + parts[i].size -= parts[i].offset; +#ifdef CONFIG_MTD_REDBOOT_PARTS_UNALLOCATED + nrparts--; + } else { + i++; + parts[i].offset = parts[i-1].size + parts[i-1].offset; + parts[i].size = fl->next->img->flash_base - parts[i].offset; + parts[i].name = nullname; #endif + } + } tmp_fl = fl; 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: