Skip to content

Commit

Permalink
mtd: physmap_of: Release resources on error
Browse files Browse the repository at this point in the history
During probe, if there was an error the memory region and the memory
map were not properly released.This can lead a system unusable if
deferred probe is in use.

Replace mem_request and map with devm_ioremap_resource

Signed-off-by: Ricardo Ribalda Delgado <[email protected]>
Signed-off-by: Boris Brezillon <[email protected]>
  • Loading branch information
ribalda authored and Boris Brezillon committed Oct 5, 2018
1 parent e42e175 commit ef0de74
Showing 1 changed file with 5 additions and 22 deletions.
27 changes: 5 additions & 22 deletions drivers/mtd/maps/physmap_of_core.c
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,6 @@
struct of_flash_list {
struct mtd_info *mtd;
struct map_info map;
struct resource *res;
};

struct of_flash {
Expand All @@ -56,18 +55,10 @@ static int of_flash_remove(struct platform_device *dev)
mtd_concat_destroy(info->cmtd);
}

for (i = 0; i < info->list_size; i++) {
for (i = 0; i < info->list_size; i++)
if (info->list[i].mtd)
map_destroy(info->list[i].mtd);

if (info->list[i].map.virt)
iounmap(info->list[i].map.virt);

if (info->list[i].res) {
release_resource(info->list[i].res);
kfree(info->list[i].res);
}
}
return 0;
}

Expand Down Expand Up @@ -215,10 +206,11 @@ static int of_flash_probe(struct platform_device *dev)

err = -EBUSY;
res_size = resource_size(&res);
info->list[i].res = request_mem_region(res.start, res_size,
dev_name(&dev->dev));
if (!info->list[i].res)
info->list[i].map.virt = devm_ioremap_resource(&dev->dev, &res);
if (IS_ERR(info->list[i].map.virt)) {
err = PTR_ERR(info->list[i].map.virt);
goto err_out;
}

err = -ENXIO;
width = of_get_property(dp, "bank-width", NULL);
Expand Down Expand Up @@ -246,15 +238,6 @@ static int of_flash_probe(struct platform_device *dev)
if (err)
goto err_out;

err = -ENOMEM;
info->list[i].map.virt = ioremap(info->list[i].map.phys,
info->list[i].map.size);
if (!info->list[i].map.virt) {
dev_err(&dev->dev, "Failed to ioremap() flash"
" region\n");
goto err_out;
}

simple_map_init(&info->list[i].map);

/*
Expand Down

0 comments on commit ef0de74

Please sign in to comment.