* [PATCH] mtd: hyperbus: hbmc-am654: fix an OF node reference leak
@ 2024-12-06 11:47 Joe Hattori
2024-12-06 13:29 ` Miquel Raynal
0 siblings, 1 reply; 3+ messages in thread
From: Joe Hattori @ 2024-12-06 11:47 UTC (permalink / raw)
To: vigneshr, tudor.ambarus, miquel.raynal, richard; +Cc: linux-mtd, Joe Hattori
In am654_hbmc_platform_driver, .remove() and the error path of .probe()
do not decrement the refcount of an OF node obtained by
of_get_next_child(). Fix this by adding of_node_put() calls.
Fixes: aca31ce96814 ("mtd: hyperbus: hbmc-am654: Fix direct mapping setup flash access")
Signed-off-by: Joe Hattori <joe@pf.is.s.u-tokyo.ac.jp>
---
drivers/mtd/hyperbus/hbmc-am654.c | 11 +++++++----
1 file changed, 7 insertions(+), 4 deletions(-)
diff --git a/drivers/mtd/hyperbus/hbmc-am654.c b/drivers/mtd/hyperbus/hbmc-am654.c
index 217f4e69233f..3e206bb34287 100644
--- a/drivers/mtd/hyperbus/hbmc-am654.c
+++ b/drivers/mtd/hyperbus/hbmc-am654.c
@@ -174,18 +174,18 @@ static int am654_hbmc_probe(struct platform_device *pdev)
priv->hbdev.np = of_get_next_child(np, NULL);
ret = of_address_to_resource(priv->hbdev.np, 0, &res);
if (ret)
- return ret;
+ goto put_node;
if (of_property_read_bool(dev->of_node, "mux-controls")) {
struct mux_control *control = devm_mux_control_get(dev, NULL);
if (IS_ERR(control))
- return PTR_ERR(control);
+ goto put_node;
ret = mux_control_select(control, 1);
if (ret) {
dev_err(dev, "Failed to select HBMC mux\n");
- return ret;
+ goto put_node;
}
priv->mux_ctrl = control;
}
@@ -193,7 +193,7 @@ static int am654_hbmc_probe(struct platform_device *pdev)
priv->hbdev.map.size = resource_size(&res);
priv->hbdev.map.virt = devm_ioremap_resource(dev, &res);
if (IS_ERR(priv->hbdev.map.virt))
- return PTR_ERR(priv->hbdev.map.virt);
+ goto disable_mux;
priv->ctlr.dev = dev;
priv->ctlr.ops = &am654_hbmc_ops;
@@ -226,6 +226,8 @@ static int am654_hbmc_probe(struct platform_device *pdev)
disable_mux:
if (priv->mux_ctrl)
mux_control_deselect(priv->mux_ctrl);
+put_node:
+ of_node_put(priv->hbdev.np);
return ret;
}
@@ -241,6 +243,7 @@ static void am654_hbmc_remove(struct platform_device *pdev)
if (dev_priv->rx_chan)
dma_release_channel(dev_priv->rx_chan);
+ of_node_put(priv->hbdev.np);
}
static const struct of_device_id am654_hbmc_dt_ids[] = {
--
2.34.1
______________________________________________________
Linux MTD discussion mailing list
http://lists.infradead.org/mailman/listinfo/linux-mtd/
^ permalink raw reply related [flat|nested] 3+ messages in thread
* Re: [PATCH] mtd: hyperbus: hbmc-am654: fix an OF node reference leak
2024-12-06 11:47 [PATCH] mtd: hyperbus: hbmc-am654: fix an OF node reference leak Joe Hattori
@ 2024-12-06 13:29 ` Miquel Raynal
2024-12-06 13:39 ` Joe Hattori
0 siblings, 1 reply; 3+ messages in thread
From: Miquel Raynal @ 2024-12-06 13:29 UTC (permalink / raw)
To: Joe Hattori; +Cc: vigneshr, tudor.ambarus, richard, linux-mtd
Hi Joe,
On 06/12/2024 at 20:47:40 +09, Joe Hattori <joe@pf.is.s.u-tokyo.ac.jp> wrote:
> In am654_hbmc_platform_driver, .remove() and the error path of .probe()
> do not decrement the refcount of an OF node obtained by
> of_get_next_child(). Fix this by adding of_node_put() calls.
>
> Fixes: aca31ce96814 ("mtd: hyperbus: hbmc-am654: Fix direct mapping setup flash access")
> Signed-off-by: Joe Hattori <joe@pf.is.s.u-tokyo.ac.jp>
> ---
> drivers/mtd/hyperbus/hbmc-am654.c | 11 +++++++----
> 1 file changed, 7 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/mtd/hyperbus/hbmc-am654.c b/drivers/mtd/hyperbus/hbmc-am654.c
> index 217f4e69233f..3e206bb34287 100644
> --- a/drivers/mtd/hyperbus/hbmc-am654.c
> +++ b/drivers/mtd/hyperbus/hbmc-am654.c
> @@ -174,18 +174,18 @@ static int am654_hbmc_probe(struct platform_device *pdev)
> priv->hbdev.np = of_get_next_child(np, NULL);
> ret = of_address_to_resource(priv->hbdev.np, 0, &res);
> if (ret)
> - return ret;
> + goto put_node;
>
> if (of_property_read_bool(dev->of_node, "mux-controls")) {
> struct mux_control *control = devm_mux_control_get(dev, NULL);
>
> if (IS_ERR(control))
> - return PTR_ERR(control);
> + goto put_node;
>
> ret = mux_control_select(control, 1);
> if (ret) {
> dev_err(dev, "Failed to select HBMC mux\n");
> - return ret;
> + goto put_node;
> }
> priv->mux_ctrl = control;
> }
> @@ -193,7 +193,7 @@ static int am654_hbmc_probe(struct platform_device *pdev)
> priv->hbdev.map.size = resource_size(&res);
> priv->hbdev.map.virt = devm_ioremap_resource(dev, &res);
> if (IS_ERR(priv->hbdev.map.virt))
> - return PTR_ERR(priv->hbdev.map.virt);
> + goto disable_mux;
This error path will return ret, whereas it should return
PTR_ERR(priv->hbdev.map.virt).
______________________________________________________
Linux MTD discussion mailing list
http://lists.infradead.org/mailman/listinfo/linux-mtd/
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [PATCH] mtd: hyperbus: hbmc-am654: fix an OF node reference leak
2024-12-06 13:29 ` Miquel Raynal
@ 2024-12-06 13:39 ` Joe Hattori
0 siblings, 0 replies; 3+ messages in thread
From: Joe Hattori @ 2024-12-06 13:39 UTC (permalink / raw)
To: Miquel Raynal; +Cc: vigneshr, tudor.ambarus, richard, linux-mtd
Hi Miquel,
Thank you for the review.
On 12/6/24 22:29, Miquel Raynal wrote:
> Hi Joe,
>
> On 06/12/2024 at 20:47:40 +09, Joe Hattori <joe@pf.is.s.u-tokyo.ac.jp> wrote:
>
>> In am654_hbmc_platform_driver, .remove() and the error path of .probe()
>> do not decrement the refcount of an OF node obtained by
>> of_get_next_child(). Fix this by adding of_node_put() calls.
>>
>> Fixes: aca31ce96814 ("mtd: hyperbus: hbmc-am654: Fix direct mapping setup flash access")
>> Signed-off-by: Joe Hattori <joe@pf.is.s.u-tokyo.ac.jp>
>> ---
>> drivers/mtd/hyperbus/hbmc-am654.c | 11 +++++++----
>> 1 file changed, 7 insertions(+), 4 deletions(-)
>>
>> diff --git a/drivers/mtd/hyperbus/hbmc-am654.c b/drivers/mtd/hyperbus/hbmc-am654.c
>> index 217f4e69233f..3e206bb34287 100644
>> --- a/drivers/mtd/hyperbus/hbmc-am654.c
>> +++ b/drivers/mtd/hyperbus/hbmc-am654.c
>> @@ -174,18 +174,18 @@ static int am654_hbmc_probe(struct platform_device *pdev)
>> priv->hbdev.np = of_get_next_child(np, NULL);
>> ret = of_address_to_resource(priv->hbdev.np, 0, &res);
>> if (ret)
>> - return ret;
>> + goto put_node;
>>
>> if (of_property_read_bool(dev->of_node, "mux-controls")) {
>> struct mux_control *control = devm_mux_control_get(dev, NULL);
>>
>> if (IS_ERR(control))
>> - return PTR_ERR(control);
>> + goto put_node;
>>
>> ret = mux_control_select(control, 1);
>> if (ret) {
>> dev_err(dev, "Failed to select HBMC mux\n");
>> - return ret;
>> + goto put_node;
>> }
>> priv->mux_ctrl = control;
>> }
>> @@ -193,7 +193,7 @@ static int am654_hbmc_probe(struct platform_device *pdev)
>> priv->hbdev.map.size = resource_size(&res);
>> priv->hbdev.map.virt = devm_ioremap_resource(dev, &res);
>> if (IS_ERR(priv->hbdev.map.virt))
>> - return PTR_ERR(priv->hbdev.map.virt);
>> + goto disable_mux;
>
> This error path will return ret, whereas it should return
> PTR_ERR(priv->hbdev.map.virt).
>
Yes, absolutely right. Fixed in the V2 patch.
Best,
Joe
______________________________________________________
Linux MTD discussion mailing list
http://lists.infradead.org/mailman/listinfo/linux-mtd/
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2024-12-06 13:40 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-12-06 11:47 [PATCH] mtd: hyperbus: hbmc-am654: fix an OF node reference leak Joe Hattori
2024-12-06 13:29 ` Miquel Raynal
2024-12-06 13:39 ` Joe Hattori
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.