1234567891011121314151617181920212223242526272829303132333435363738394041424344 |
- --- a/drivers/mtd/parsers/redboot.c
- +++ b/drivers/mtd/parsers/redboot.c
- @@ -94,12 +94,18 @@ static int parse_redboot_partitions(stru
-
- parse_redboot_of(master);
-
- + buf = vmalloc(master->erasesize);
- + if (!buf)
- + return -ENOMEM;
- +
- +restart:
- if (directory < 0) {
- offset = master->size + directory * master->erasesize;
- while (mtd_block_isbad(master, offset)) {
- if (!offset) {
- nogood:
- pr_notice("Failed to find a non-bad block to check for RedBoot partition table\n");
- + vfree(buf);
- return -EIO;
- }
- offset -= master->erasesize;
- @@ -112,10 +118,6 @@ nogood:
- goto nogood;
- }
- }
- - buf = vmalloc(master->erasesize);
- -
- - if (!buf)
- - return -ENOMEM;
-
- pr_notice("Searching for RedBoot partition table in %s at offset 0x%lx\n",
- master->name, offset);
- @@ -187,6 +189,11 @@ nogood:
- }
- if (i == numslots) {
- /* Didn't find it */
- + if (offset + master->erasesize < master->size) {
- + /* not at the end of the flash yet, maybe next block */
- + directory++;
- + goto restart;
- + }
- pr_notice("No RedBoot partition table detected in %s\n",
- master->name);
- ret = 0;
|