All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 1/2] iio: ltc2983: Fix of_node refcounting
@ 2020-09-25  9:10 Nuno Sá
  2020-09-25  9:10 ` [PATCH 2/2] iio: ad7292: " Nuno Sá
  2020-09-26 14:32 ` [PATCH 1/2] iio: ltc2983: " Jonathan Cameron
  0 siblings, 2 replies; 4+ messages in thread
From: Nuno Sá @ 2020-09-25  9:10 UTC (permalink / raw)
  To: linux-iio
  Cc: Jonathan Cameron, Michael Hennerich, Marcelo Schmitt,
	Peter Meerwald-Stadler, Lars-Peter Clausen, stable

When returning or breaking early from a
`for_each_available_child_of_node()` loop, we need to explicitly call
`of_node_put()` on the child node to possibly release the node.

Fixes: f110f3188e563 ("iio: temperature: Add support for LTC2983")
Cc: stable@vger.kernel.org
Signed-off-by: Nuno Sá <nuno.sa@analog.com>
---
 drivers/iio/temperature/ltc2983.c | 18 ++++++++++++------
 1 file changed, 12 insertions(+), 6 deletions(-)

diff --git a/drivers/iio/temperature/ltc2983.c b/drivers/iio/temperature/ltc2983.c
index 55ff28a0f1c7..c6641bc185cb 100644
--- a/drivers/iio/temperature/ltc2983.c
+++ b/drivers/iio/temperature/ltc2983.c
@@ -1285,18 +1285,19 @@ static int ltc2983_parse_dt(struct ltc2983_data *st)
 		ret = of_property_read_u32(child, "reg", &sensor.chan);
 		if (ret) {
 			dev_err(dev, "reg property must given for child nodes\n");
-			return ret;
+			goto put_child;
 		}
 
 		/* check if we have a valid channel */
+		ret = -EINVAL;
 		if (sensor.chan < LTC2983_MIN_CHANNELS_NR ||
 		    sensor.chan > LTC2983_MAX_CHANNELS_NR) {
 			dev_err(dev,
 				"chan:%d must be from 1 to 20\n", sensor.chan);
-			return -EINVAL;
+			goto put_child;
 		} else if (channel_avail_mask & BIT(sensor.chan)) {
 			dev_err(dev, "chan:%d already in use\n", sensor.chan);
-			return -EINVAL;
+			goto put_child;
 		}
 
 		ret = of_property_read_u32(child, "adi,sensor-type",
@@ -1304,7 +1305,7 @@ static int ltc2983_parse_dt(struct ltc2983_data *st)
 		if (ret) {
 			dev_err(dev,
 				"adi,sensor-type property must given for child nodes\n");
-			return ret;
+			goto put_child;
 		}
 
 		dev_dbg(dev, "Create new sensor, type %u, chann %u",
@@ -1334,13 +1335,15 @@ static int ltc2983_parse_dt(struct ltc2983_data *st)
 			st->sensors[chan] = ltc2983_adc_new(child, st, &sensor);
 		} else {
 			dev_err(dev, "Unknown sensor type %d\n", sensor.type);
-			return -EINVAL;
+			ret = -EINVAL;
+			goto put_child;
 		}
 
 		if (IS_ERR(st->sensors[chan])) {
 			dev_err(dev, "Failed to create sensor %ld",
 				PTR_ERR(st->sensors[chan]));
-			return PTR_ERR(st->sensors[chan]);
+			ret = PTR_ERR(st->sensors[chan]);
+			goto put_child;
 		}
 		/* set generic sensor parameters */
 		st->sensors[chan]->chan = sensor.chan;
@@ -1351,6 +1354,9 @@ static int ltc2983_parse_dt(struct ltc2983_data *st)
 	}
 
 	return 0;
+put_child:
+	of_node_put(child);
+	return ret;
 }
 
 static int ltc2983_setup(struct ltc2983_data *st, bool assign_iio)
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 4+ messages in thread

* [PATCH 2/2] iio: ad7292: Fix of_node refcounting
  2020-09-25  9:10 [PATCH 1/2] iio: ltc2983: Fix of_node refcounting Nuno Sá
@ 2020-09-25  9:10 ` Nuno Sá
  2020-09-26 14:43   ` Jonathan Cameron
  2020-09-26 14:32 ` [PATCH 1/2] iio: ltc2983: " Jonathan Cameron
  1 sibling, 1 reply; 4+ messages in thread
From: Nuno Sá @ 2020-09-25  9:10 UTC (permalink / raw)
  To: linux-iio
  Cc: Jonathan Cameron, Michael Hennerich, Marcelo Schmitt,
	Peter Meerwald-Stadler, Lars-Peter Clausen, stable

When returning or breaking early from a
`for_each_available_child_of_node()` loop, we need to explicitly call
`of_node_put()` on the child node to possibly release the node.

Fixes: 506d2e317a0a0 ("iio: adc: Add driver support for AD7292")
Cc: stable@vger.kernel.org
Signed-off-by: Nuno Sá <nuno.sa@analog.com>
---
 drivers/iio/adc/ad7292.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/iio/adc/ad7292.c b/drivers/iio/adc/ad7292.c
index 2eafbe7ac7c7..ab204e9199e9 100644
--- a/drivers/iio/adc/ad7292.c
+++ b/drivers/iio/adc/ad7292.c
@@ -310,8 +310,10 @@ static int ad7292_probe(struct spi_device *spi)
 
 	for_each_available_child_of_node(spi->dev.of_node, child) {
 		diff_channels = of_property_read_bool(child, "diff-channels");
-		if (diff_channels)
+		if (diff_channels) {
+			of_node_put(child);
 			break;
+		}
 	}
 
 	if (diff_channels) {
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [PATCH 1/2] iio: ltc2983: Fix of_node refcounting
  2020-09-25  9:10 [PATCH 1/2] iio: ltc2983: Fix of_node refcounting Nuno Sá
  2020-09-25  9:10 ` [PATCH 2/2] iio: ad7292: " Nuno Sá
@ 2020-09-26 14:32 ` Jonathan Cameron
  1 sibling, 0 replies; 4+ messages in thread
From: Jonathan Cameron @ 2020-09-26 14:32 UTC (permalink / raw)
  To: Nuno Sá
  Cc: linux-iio, Michael Hennerich, Marcelo Schmitt,
	Peter Meerwald-Stadler, Lars-Peter Clausen, stable

On Fri, 25 Sep 2020 11:10:44 +0200
Nuno Sá <nuno.sa@analog.com> wrote:

> When returning or breaking early from a
> `for_each_available_child_of_node()` loop, we need to explicitly call
> `of_node_put()` on the child node to possibly release the node.
> 
> Fixes: f110f3188e563 ("iio: temperature: Add support for LTC2983")
> Cc: stable@vger.kernel.org
> Signed-off-by: Nuno Sá <nuno.sa@analog.com>

I've tweaked this a tiny bit and applied it to the fixes-togreg branch
of iio.git on assumption it won't now go in until after the merge
window.  If merge window is delayed, I may sneak it in for that.

Thanks,

Jonathan

> ---
>  drivers/iio/temperature/ltc2983.c | 18 ++++++++++++------
>  1 file changed, 12 insertions(+), 6 deletions(-)
> 
> diff --git a/drivers/iio/temperature/ltc2983.c b/drivers/iio/temperature/ltc2983.c
> index 55ff28a0f1c7..c6641bc185cb 100644
> --- a/drivers/iio/temperature/ltc2983.c
> +++ b/drivers/iio/temperature/ltc2983.c
> @@ -1285,18 +1285,19 @@ static int ltc2983_parse_dt(struct ltc2983_data *st)
>  		ret = of_property_read_u32(child, "reg", &sensor.chan);
>  		if (ret) {
>  			dev_err(dev, "reg property must given for child nodes\n");
> -			return ret;
> +			goto put_child;
>  		}
>  
>  		/* check if we have a valid channel */
> +		ret = -EINVAL;

I'm not keen on this being here rather than in the error path.
It will obvious work, but is harder to read and more
fragile if future changes are made.

I've moved it down into the two cases this covers.

>  		if (sensor.chan < LTC2983_MIN_CHANNELS_NR ||
>  		    sensor.chan > LTC2983_MAX_CHANNELS_NR) {
>  			dev_err(dev,
>  				"chan:%d must be from 1 to 20\n", sensor.chan);
> -			return -EINVAL;
> +			goto put_child;
>  		} else if (channel_avail_mask & BIT(sensor.chan)) {
>  			dev_err(dev, "chan:%d already in use\n", sensor.chan);
> -			return -EINVAL;
> +			goto put_child;
>  		}
>  
>  		ret = of_property_read_u32(child, "adi,sensor-type",
> @@ -1304,7 +1305,7 @@ static int ltc2983_parse_dt(struct ltc2983_data *st)
>  		if (ret) {
>  			dev_err(dev,
>  				"adi,sensor-type property must given for child nodes\n");
> -			return ret;
> +			goto put_child;
>  		}
>  
>  		dev_dbg(dev, "Create new sensor, type %u, chann %u",
> @@ -1334,13 +1335,15 @@ static int ltc2983_parse_dt(struct ltc2983_data *st)
>  			st->sensors[chan] = ltc2983_adc_new(child, st, &sensor);
>  		} else {
>  			dev_err(dev, "Unknown sensor type %d\n", sensor.type);
> -			return -EINVAL;
> +			ret = -EINVAL;
> +			goto put_child;
>  		}
>  
>  		if (IS_ERR(st->sensors[chan])) {
>  			dev_err(dev, "Failed to create sensor %ld",
>  				PTR_ERR(st->sensors[chan]));
> -			return PTR_ERR(st->sensors[chan]);
> +			ret = PTR_ERR(st->sensors[chan]);
> +			goto put_child;
>  		}
>  		/* set generic sensor parameters */
>  		st->sensors[chan]->chan = sensor.chan;
> @@ -1351,6 +1354,9 @@ static int ltc2983_parse_dt(struct ltc2983_data *st)
>  	}
>  
>  	return 0;
> +put_child:
> +	of_node_put(child);
> +	return ret;
>  }
>  
>  static int ltc2983_setup(struct ltc2983_data *st, bool assign_iio)


^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH 2/2] iio: ad7292: Fix of_node refcounting
  2020-09-25  9:10 ` [PATCH 2/2] iio: ad7292: " Nuno Sá
@ 2020-09-26 14:43   ` Jonathan Cameron
  0 siblings, 0 replies; 4+ messages in thread
From: Jonathan Cameron @ 2020-09-26 14:43 UTC (permalink / raw)
  To: Nuno Sá
  Cc: linux-iio, Michael Hennerich, Marcelo Schmitt,
	Peter Meerwald-Stadler, Lars-Peter Clausen, stable

On Fri, 25 Sep 2020 11:10:45 +0200
Nuno Sá <nuno.sa@analog.com> wrote:

> When returning or breaking early from a
> `for_each_available_child_of_node()` loop, we need to explicitly call
> `of_node_put()` on the child node to possibly release the node.
> 
> Fixes: 506d2e317a0a0 ("iio: adc: Add driver support for AD7292")
> Cc: stable@vger.kernel.org
> Signed-off-by: Nuno Sá <nuno.sa@analog.com>
Applied to the fixes togreg branch of iio.git.

Thanks

Jonathan

> ---
>  drivers/iio/adc/ad7292.c | 4 +++-
>  1 file changed, 3 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/iio/adc/ad7292.c b/drivers/iio/adc/ad7292.c
> index 2eafbe7ac7c7..ab204e9199e9 100644
> --- a/drivers/iio/adc/ad7292.c
> +++ b/drivers/iio/adc/ad7292.c
> @@ -310,8 +310,10 @@ static int ad7292_probe(struct spi_device *spi)
>  
>  	for_each_available_child_of_node(spi->dev.of_node, child) {
>  		diff_channels = of_property_read_bool(child, "diff-channels");
> -		if (diff_channels)
> +		if (diff_channels) {
> +			of_node_put(child);
>  			break;
> +		}
>  	}
>  
>  	if (diff_channels) {


^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2020-09-26 14:43 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-09-25  9:10 [PATCH 1/2] iio: ltc2983: Fix of_node refcounting Nuno Sá
2020-09-25  9:10 ` [PATCH 2/2] iio: ad7292: " Nuno Sá
2020-09-26 14:43   ` Jonathan Cameron
2020-09-26 14:32 ` [PATCH 1/2] iio: ltc2983: " Jonathan Cameron

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.