Re: [PATCH] [mtd] fixed faulty check

vimal singh
2009-07-30T15:14:18Z

On Thu, Jul 30, 2009 at 8:23 PM, Sebastian Andrzej
Siewior<bigeasy@linutronix.de> wrote:
> Stoyan Gaydarov wrote:
>>>>
>>>> We have to and of_flash_remove() takes care of it.
>>>>
>>>
>>>
>>
>> Does this mean that the original patch is fine or does it still need the
>> kfree? From what i understand when going to err_out it will take care of
>> info using of_flash_remove() so then it is not needed in the if check.
>
> The original patch was fine but it leaked info. of_flash_remove() does the
> cleanup of info but only if it is part of driver's data (after the
> of_flash_remove()). So you have to call dev_set_drvdata(&dev->dev, info)
> earlier, after the kzalloc() to save the data or else there is no clean
> up.
>

Is this patch looks OK??

diff --git a/drivers/mtd/maps/physmap_of.c b/drivers/mtd/maps/physmap_of.c
index 39d357b..d104cfc 100644
--- a/drivers/mtd/maps/physmap_of.c
+++ b/drivers/mtd/maps/physmap_of.c
@@ -204,7 +204,7 @@ static int __devinit of_flash_probe(struct of_device *dev,
dev_err(&dev->dev, "Malformed reg property on %s\n",
dev->node->full_name);
err = -EINVAL;
- goto err_out;
+ goto err_flash_remove;
}
count /= reg_tuple_size;

@@ -212,14 +212,14 @@ static int __devinit of_flash_probe(struct of_device *dev,
info = kzalloc(sizeof(struct of_flash) +
sizeof(struct of_flash_list) * count, GFP_KERNEL);
if (!info)
- goto err_out;
-
- mtd_list = kzalloc(sizeof(struct mtd_info) * count, GFP_KERNEL);
- if (!info)
- goto err_out;
+ goto err_flash_remove;

dev_set_drvdata(&dev->dev, info);

+ mtd_list = kzalloc(sizeof(struct mtd_info) * count, GFP_KERNEL);
+ if (!mtd_list)
+ goto err_flash_remove;
+
for (i = 0; i < count; i++) {
err = -ENXIO;
if (of_address_to_resource(dp, i, &res)) {
@@ -338,6 +338,7 @@ static int __devinit of_flash_probe(struct of_device *dev,

err_out:
kfree(mtd_list);
+eerr_flash_remov:
of_flash_remove(dev);

return err;