From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S965747AbcCJLHZ (ORCPT ); Thu, 10 Mar 2016 06:07:25 -0500 Received: from mga02.intel.com ([134.134.136.20]:59250 "EHLO mga02.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S965579AbcCJLHT (ORCPT ); Thu, 10 Mar 2016 06:07:19 -0500 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.24,315,1455004800"; d="scan'208";a="933760463" Message-ID: <1457608086.1347.53.camel@linux.intel.com> Subject: Re: [PATCH v2 1/2] mfd: intel_quark_i2c_gpio: remove clock tree on error path From: Andy Shevchenko To: Stephen Boyd , Lee Jones , linux-kernel@vger.kernel.org Cc: stable@vger.kernel.org Date: Thu, 10 Mar 2016 13:08:06 +0200 In-Reply-To: <1455871331-93095-1-git-send-email-andriy.shevchenko@linux.intel.com> References: <1455871331-93095-1-git-send-email-andriy.shevchenko@linux.intel.com> Organization: Intel Finland Oy Content-Type: text/plain; charset="UTF-8" X-Mailer: Evolution 3.18.5.1-1 Mime-Version: 1.0 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Fri, 2016-02-19 at 10:42 +0200, Andy Shevchenko wrote: > 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. Lee, ping? > > Fixes: 60ae5b9f5cdd (mfd: intel_quark_i2c_gpio: Add Intel Quark X1000 > I2C-GPIO MFD Driver) > Cc: stable@vger.kernel.org > Signed-off-by: Andy Shevchenko > --- > v2: > - do not unregister clock before lookup (Stephen) >  drivers/mfd/intel_quark_i2c_gpio.c | 25 +++++++++++++++++-------- >  1 file changed, 17 insertions(+), 8 deletions(-) > > diff --git a/drivers/mfd/intel_quark_i2c_gpio.c > b/drivers/mfd/intel_quark_i2c_gpio.c > index bdc5e27..7450f5d 100644 > --- a/drivers/mfd/intel_quark_i2c_gpio.c > +++ b/drivers/mfd/intel_quark_i2c_gpio.c > @@ -139,6 +139,7 @@ static int intel_quark_register_i2c_clk(struct > intel_quark_mfd *quark_mfd) >   INTEL_QUARK_I2C_CONT > ROLLER_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_clk(struct > pci_dev *pdev) >  { >   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 pci_dev > *pdev, >   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; >   > - return mfd_add_devices(&pdev->dev, 0, intel_quark_mfd_cells, > -        ARRAY_SIZE(intel_quark_mfd_cells), > NULL, 0, > -        NULL); > + 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; > + > +err_unregister_i2c_clk: > + intel_quark_unregister_i2c_clk(pdev); > + return ret; >  } >   >  static void intel_quark_mfd_remove(struct pci_dev *pdev) -- Andy Shevchenko Intel Finland Oy