Patch "mfd: intel_quark_i2c_gpio: Remove clock tree on error path" has been added to the 4.6-stable tree
Subsystems (2)
This is a note to let you know that I've just added the patch titled
mfd: intel_quark_i2c_gpio: Remove clock tree on error path
to the 4.6-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
mfd-intel_quark_i2c_gpio-remove-clock-tree-on-error-path.patch
and it can be found in the queue-4.6 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
7f0c5ae18d649ed2f4978cbf07c02a0ff732f23eMon Sep 17 00:00:00 2001
From: Andy Shevchenko <[email protected]>
Date: Fri, 19 Feb 2016 10:42:10 +0200
Subject: mfd: intel_quark_i2c_gpio: Remove clock tree on error path
From: Andy Shevchenko <[email protected]>
commit 7f0c5ae18d649ed2f4978cbf07c02a0ff732f23e upstream.
There is a potential resource leak in case when ->probe() fails. We have to unregister and remove clock tree which is done here.
This is a follow up to previously pushed commit c4726abce63b ("mfd:intel_quark_i2c_gpio: Use clkdev_create()") that prevents double free() when clkdev_drop() followed by kfree() in devm_kcalloc() release stage.
I leave Fixes tag here, but the backporting will require to backport the commit c4726abce63b ("mfd: intel_quark_i2c_gpio: Use clkdev_create()") first.
--- drivers/mfd/intel_quark_i2c_gpio.c | 25 +++++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-)
drivers/mfd/intel_quark_i2c_gpio.c +17 -8
@@ -139,6 +139,7 @@ static int intel_quark_register_i2c_clk( INTEL_QUARK_I2C_CONTROLLER_CLK);if (!quark_mfd->i2c_clk_lookup) { +clk_unregister (quark_mfd->i2c_clk);dev_err (&pdev->dev,"Fixed clk register failed\n" );return -ENOMEM ; }
@@ -150,7 +151,7 @@ static void intel_quark_unregister_i2c_c {struct intel_quark_mfd *quark_mfd =dev_get_drvdata (&pdev->dev); -if (!quark_mfd->i2c_clk || !quark_mfd->i2c_clk_lookup) +if (!quark_mfd->i2c_clk_lookup)return ;clkdev_drop (quark_mfd->i2c_clk_lookup);
@@ -246,25 +247,33 @@ static int intel_quark_mfd_probe(struct quark_mfd =devm_kzalloc (&pdev->dev,sizeof (*quark_mfd),GFP_KERNEL );if (!quark_mfd)return -ENOMEM ; + quark_mfd->pdev = pdev; +dev_set_drvdata (&pdev->dev, quark_mfd); ret =intel_quark_register_i2c_clk (quark_mfd);if (ret)return ret; -dev_set_drvdata (&pdev->dev, quark_mfd); - ret =intel_quark_i2c_setup (pdev, &intel_quark_mfd_cells[1 ]);if (ret) -return ret; + goto err_unregister_i2c_clk; ret =intel_quark_gpio_setup (pdev, &intel_quark_mfd_cells[0 ]);if (ret) -return ret; + goto err_unregister_i2c_clk; + + ret =mfd_add_devices (&pdev->dev,0 , intel_quark_mfd_cells, +ARRAY_SIZE (intel_quark_mfd_cells),NULL ,0 , +NULL ); +if (ret) + goto err_unregister_i2c_clk; + +return 0 ; -return mfd_add_devices (&pdev->dev,0 , intel_quark_mfd_cells, -ARRAY_SIZE (intel_quark_mfd_cells),NULL ,0 , -NULL ); +err_unregister_i2c_clk: +intel_quark_unregister_i2c_clk (pdev); +return ret; }static void intel_quark_mfd_remove (struct pci_dev *pdev)
Patches currently in stable-queue which might be from [email protected] are
queue-4.6/mfd-intel_quark_i2c_gpio-remove-clock-tree-on-error-path.patch