Re: [PATCH] iio: light: ltrf216a: fix runtime PM reference leak in error path
Jonathan Cameron <[email protected]> Sun, 19 Jul 2026 23:33:23 +0100
| Newsgroups | dev.linux.lists.linux-kernel-mentees,org.kernel.vger.linux-iio,org.kernel.vger.linux-kernel |
|---|---|
| Message-ID | <20260719233244.0a3fd246@jic23-huawei> |
On Mon, 13 Jul 2026 15:36:51 +0300 Andy Shevchenko <[email protected]> wrote: > On Mon, Jul 13, 2026 at 07:58:29AM +0530, Vidhu Sarwal wrote: > > ltrf216a_get_lux() acquires a runtime PM reference by calling > > ltrf216a_set_power_state(data, true). However, if > > ltrf216a_read_data() fails, the function returns immediately without > > dropping the reference. > > > > This leaves the runtime PM usage count unbalanced, preventing the device > > from autosuspending after a failed read. > > > > Fix this by releasing the runtime PM reference before returning from the > > error path. > > ... > > > static int ltrf216a_get_lux(struct ltrf216a_data *data) > > > greendata = ltrf216a_read_data(data, LTRF216A_ALS_DATA_0); > > - if (greendata < 0) > > + if (greendata < 0) { > > + ltrf216a_set_power_state(data, false); > > return greendata; > > + } > > > > ltrf216a_set_power_state(data, false); > > Wouldn't be simpler to do > > greendata = ltrf216a_read_data(data, LTRF216A_ALS_DATA_0); > > ltrf216a_set_power_state(data, false); > > if (greendata < 0) > return greendata; > > ? > > Not insisting on this. Up to Jonathan and others to decide. I merged a slight variant on what Andy has here to keep the greendata assignment and check closer together. diff --git a/drivers/iio/light/ltrf216a.c b/drivers/iio/light/ltrf216a.c index aad96fc91565..dd8f3260b1d8 100644 --- a/drivers/iio/light/ltrf216a.c +++ b/drivers/iio/light/ltrf216a.c @@ -248,11 +248,10 @@ static int ltrf216a_get_lux(struct ltrf216a_data *data) return ret; greendata = ltrf216a_read_data(data, LTRF216A_ALS_DATA_0); + ltrf216a_set_power_state(data, false); if (greendata < 0) return greendata; - ltrf216a_set_power_state(data, false); - lux = greendata * data->info->lux_multiplier * LTRF216A_WIN_FAC; return lux; > >