diff mbox series

[2/2] i2c: xiic: xiic_xfer(): Fix runtime PM leak on error path

Message ID 20230414021022.505291-2-lars@metafoo.de
State New
Headers show
Series [1/2] i2c: cadence: cdns_i2c_master_xfer(): Fix runtime PM leak on error path | expand

Commit Message

Lars-Peter Clausen April 14, 2023, 2:10 a.m. UTC
The xiic_xfer() function gets a runtime PM reference when the function is
entered. This reference is released when the function is exited. There is
currently one error path where the function exits directly, which leads to
a leak of the runtime PM reference.

Make sure that this error path also releases the runtime PM reference.

Fixes: fdacc3c7405d ("i2c: xiic: Switch from waitqueue to completion")
Signed-off-by: Lars-Peter Clausen <lars@metafoo.de>
---
 drivers/i2c/busses/i2c-xiic.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

Comments

Wolfram Sang April 18, 2023, 4:44 p.m. UTC | #1
On Thu, Apr 13, 2023 at 07:10:22PM -0700, Lars-Peter Clausen wrote:
> The xiic_xfer() function gets a runtime PM reference when the function is
> entered. This reference is released when the function is exited. There is
> currently one error path where the function exits directly, which leads to
> a leak of the runtime PM reference.
> 
> Make sure that this error path also releases the runtime PM reference.
> 
> Fixes: fdacc3c7405d ("i2c: xiic: Switch from waitqueue to completion")
> Signed-off-by: Lars-Peter Clausen <lars@metafoo.de>

Applied to for-current, thanks!
diff mbox series

Patch

diff --git a/drivers/i2c/busses/i2c-xiic.c b/drivers/i2c/busses/i2c-xiic.c
index e7d37eb20f2b..8a3d9817cb41 100644
--- a/drivers/i2c/busses/i2c-xiic.c
+++ b/drivers/i2c/busses/i2c-xiic.c
@@ -1164,7 +1164,7 @@  static int xiic_xfer(struct i2c_adapter *adap, struct i2c_msg *msgs, int num)
 	err = xiic_start_xfer(i2c, msgs, num);
 	if (err < 0) {
 		dev_err(adap->dev.parent, "Error xiic_start_xfer\n");
-		return err;
+		goto out;
 	}
 
 	err = wait_for_completion_timeout(&i2c->completion, XIIC_XFER_TIMEOUT);
@@ -1178,6 +1178,8 @@  static int xiic_xfer(struct i2c_adapter *adap, struct i2c_msg *msgs, int num)
 		err = (i2c->state == STATE_DONE) ? num : -EIO;
 	}
 	mutex_unlock(&i2c->lock);
+
+out:
 	pm_runtime_mark_last_busy(i2c->dev);
 	pm_runtime_put_autosuspend(i2c->dev);
 	return err;