Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S933076AbcJLMxq (ORCPT ); Wed, 12 Oct 2016 08:53:46 -0400 Received: from lb1-smtp-cloud2.xs4all.net ([194.109.24.21]:41075 "EHLO lb1-smtp-cloud2.xs4all.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755478AbcJLMw0 (ORCPT ); Wed, 12 Oct 2016 08:52:26 -0400 Message-ID: <1476276740.9670.19.camel@tiscali.nl> Subject: Re: [PATCH 3.4 088/125] ser_gigaset: fix deallocation of platform device structure From: Paul Bolle To: lizf@kernel.org, stable@vger.kernel.org Cc: linux-kernel@vger.kernel.org, Tilman Schmidt , "David S. Miller" , Zefan Li Date: Wed, 12 Oct 2016 14:52:20 +0200 In-Reply-To: <1476275641-4697-88-git-send-email-lizf@kernel.org> References: <1476275600-4626-1-git-send-email-lizf@kernel.org> <1476275641-4697-88-git-send-email-lizf@kernel.org> Content-Type: text/plain; charset="UTF-8" X-Mailer: Evolution 3.20.5 (3.20.5-1.fc24) 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 Content-Length: 2088 Lines: 67 Zefan Li, On Wed, 2016-10-12 at 20:33 +0800, lizf@kernel.org wrote: > When shutting down the device, the struct ser_cardstate must not be > kfree()d immediately after the call to platform_device_unregister() > since the embedded struct platform_device is still in use. > Move the kfree() call to the release method instead. > > Signed-off-by: Tilman Schmidt > Fixes: 2869b23e4b95 ("drivers/isdn/gigaset: new M101 driver (v2)") > Reported-by: Sasha Levin > Signed-off-by: Paul Bolle > Signed-off-by: David S. Miller > Signed-off-by: Zefan Li There has been a follow up for this fix. I'll have to dive into my archive to see why that was needed. It was complicated, because there has been a short period in which this fix was correct. Something like that, I'm speaking from memory. (Perhaps Tilman's memory is less imperfect.) I'll try get back to this shortly (in a day or so). Thanks, Paul Bolle > --- >  drivers/isdn/gigaset/ser-gigaset.c | 10 +++++++--- >  1 file changed, 7 insertions(+), 3 deletions(-) > > diff --git a/drivers/isdn/gigaset/ser-gigaset.c > b/drivers/isdn/gigaset/ser-gigaset.c > index 6f3fd4c..3cdfcd0 100644 > --- a/drivers/isdn/gigaset/ser-gigaset.c > +++ b/drivers/isdn/gigaset/ser-gigaset.c > @@ -371,19 +371,23 @@ static void gigaset_freecshw(struct cardstate > *cs) >   tasklet_kill(&cs->write_tasklet); >   if (!cs->hw.ser) >   return; > - dev_set_drvdata(&cs->hw.ser->dev.dev, NULL); >   platform_device_unregister(&cs->hw.ser->dev); > - kfree(cs->hw.ser); > - cs->hw.ser = NULL; >  } >   >  static void gigaset_device_release(struct device *dev) >  { >   struct platform_device *pdev = to_platform_device(dev); > + struct cardstate *cs = dev_get_drvdata(dev); >   >   /* adapted from platform_device_release() in > drivers/base/platform.c */ >   kfree(dev->platform_data); >   kfree(pdev->resource); > + > + if (!cs) > + return; > + dev_set_drvdata(dev, NULL); > + kfree(cs->hw.ser); > + cs->hw.ser = NULL; >  } >   >  /*