| --- a/drivers/mtd/parsers/redboot.c |
| +++ b/drivers/mtd/parsers/redboot.c |
| @@ -91,12 +91,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: |
| printk(KERN_NOTICE "Failed to find a non-bad block to check for RedBoot partition table\n"); |
| + vfree(buf); |
| return -EIO; |
| } |
| offset -= master->erasesize; |
| @@ -109,10 +115,6 @@ static int parse_redboot_partitions(stru |
| goto nogood; |
| } |
| } |
| - buf = vmalloc(master->erasesize); |
| - |
| - if (!buf) |
| - return -ENOMEM; |
| |
| printk(KERN_NOTICE "Searching for RedBoot partition table in %s at offset 0x%lx\n", |
| master->name, offset); |
| @@ -185,6 +187,11 @@ static int parse_redboot_partitions(stru |
| } |
| 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; |
| + } |
| printk(KERN_NOTICE "No RedBoot partition table detected in %s\n", |
| master->name); |
| ret = 0; |