lkml.org 
[lkml]   [2019]   [Nov]   [12]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH AUTOSEL 4.14 057/115] mtd: physmap_of: Release resources on error
    Date
    From: Ricardo Ribalda Delgado <ricardo.ribalda@gmail.com>

    [ Upstream commit ef0de747f7ad179c7698a5b0e28db05f18ecbf57 ]

    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 <ricardo.ribalda@gmail.com>
    Signed-off-by: Boris Brezillon <boris.brezillon@bootlin.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/mtd/maps/physmap_of_core.c | 27 +++++----------------------
    1 file changed, 5 insertions(+), 22 deletions(-)

    diff --git a/drivers/mtd/maps/physmap_of_core.c b/drivers/mtd/maps/physmap_of_core.c
    index b1bd4faecfb25..5d8399742c754 100644
    --- a/drivers/mtd/maps/physmap_of_core.c
    +++ b/drivers/mtd/maps/physmap_of_core.c
    @@ -30,7 +30,6 @@
    struct of_flash_list {
    struct mtd_info *mtd;
    struct map_info map;
    - struct resource *res;
    };

    struct of_flash {
    @@ -55,18 +54,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;
    }

    @@ -214,10 +205,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);
    @@ -240,15 +232,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);

    /*
    --
    2.20.1
    \
     
     \ /
      Last update: 2019-11-13 03:13    [W:4.306 / U:0.320 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site