mtd: Fix compile failure and error path in physmap.c
Commit 4b56ffcace
("mtd: Fix kernel NULL
pointer dereference in physmap.c") introduced a couple of bugs.
It neglected to run the loop of map_destroy() calls in
physmap_flash_remove(), if !info->cmtd, which would happen if that
function was called to clean up errors during probe.
It also failed to compile if CONFIG_MTD_PARTITIONS was not defined.
Reported-By: Atsushi Nemoto <anemo@mba.ocn.ne.jp>
Signed-off-by: H Hartley Sweeten <hsweeten@visionengravers.com>
Signed-off-by: David Woodhouse <David.Woodhouse@intel.com>
This commit is contained in:
parent
1cc523999e
commit
8ce110ac19
|
@ -44,12 +44,10 @@ static int physmap_flash_remove(struct platform_device *dev)
|
||||||
return 0;
|
return 0;
|
||||||
platform_set_drvdata(dev, NULL);
|
platform_set_drvdata(dev, NULL);
|
||||||
|
|
||||||
if (info->cmtd == NULL)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
physmap_data = dev->dev.platform_data;
|
physmap_data = dev->dev.platform_data;
|
||||||
|
|
||||||
if (mtd_has_partitions()) {
|
if (info->cmtd) {
|
||||||
|
#ifdef CONFIG_MTD_PARTITIONS
|
||||||
if (info->nr_parts || physmap_data->nr_parts) {
|
if (info->nr_parts || physmap_data->nr_parts) {
|
||||||
del_mtd_partitions(info->cmtd);
|
del_mtd_partitions(info->cmtd);
|
||||||
|
|
||||||
|
@ -58,14 +56,14 @@ static int physmap_flash_remove(struct platform_device *dev)
|
||||||
} else {
|
} else {
|
||||||
del_mtd_device(info->cmtd);
|
del_mtd_device(info->cmtd);
|
||||||
}
|
}
|
||||||
} else {
|
#else
|
||||||
del_mtd_device(info->cmtd);
|
del_mtd_device(info->cmtd);
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef CONFIG_MTD_CONCAT
|
|
||||||
if (info->cmtd != info->mtd[0])
|
|
||||||
mtd_concat_destroy(info->cmtd);
|
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef CONFIG_MTD_CONCAT
|
||||||
|
if (info->cmtd != info->mtd[0])
|
||||||
|
mtd_concat_destroy(info->cmtd);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
for (i = 0; i < MAX_RESOURCES; i++) {
|
for (i = 0; i < MAX_RESOURCES; i++) {
|
||||||
if (info->mtd[i] != NULL)
|
if (info->mtd[i] != NULL)
|
||||||
|
@ -170,23 +168,23 @@ static int physmap_flash_probe(struct platform_device *dev)
|
||||||
if (err)
|
if (err)
|
||||||
goto err_out;
|
goto err_out;
|
||||||
|
|
||||||
if (mtd_has_partitions()) {
|
#ifdef CONFIG_MTD_PARTITIONS
|
||||||
err = parse_mtd_partitions(info->cmtd, part_probe_types,
|
err = parse_mtd_partitions(info->cmtd, part_probe_types,
|
||||||
&info->parts, 0);
|
&info->parts, 0);
|
||||||
if (err > 0) {
|
if (err > 0) {
|
||||||
add_mtd_partitions(info->cmtd, info->parts, err);
|
add_mtd_partitions(info->cmtd, info->parts, err);
|
||||||
info->nr_parts = err;
|
info->nr_parts = err;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
|
||||||
|
|
||||||
if (physmap_data->nr_parts) {
|
|
||||||
printk(KERN_NOTICE "Using physmap partition information\n");
|
|
||||||
add_mtd_partitions(info->cmtd, physmap_data->parts,
|
|
||||||
physmap_data->nr_parts);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (physmap_data->nr_parts) {
|
||||||
|
printk(KERN_NOTICE "Using physmap partition information\n");
|
||||||
|
add_mtd_partitions(info->cmtd, physmap_data->parts,
|
||||||
|
physmap_data->nr_parts);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
add_mtd_device(info->cmtd);
|
add_mtd_device(info->cmtd);
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue