From patchwork Mon May 17 22:02:16 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: rtc-cmos: do dev_set_drvdata() earlier in the initialization Date: Mon, 17 May 2010 12:02:16 -0000 From: Dan Carpenter X-Patchwork-Id: 52818 Message-Id: <20100517220123.GA7691@bicker> To: Alessandro Zummo Cc: Paul Gortmaker , Andrew Morton , Malte =?iso-8859-1?Q?Schr=F6der?= , Ralf Baechle , Herton Ronaldo Krzesinski , rtc-linux@googlegroups.com, randy.dunlap@oracle.com This is in response to https://bugzilla.kernel.org/show_bug.cgi?id=15963 The bug is an oops when dev_get_drvdata() returned null in cmos_update_irq_enable(). The call tree looks like this: rtc_dev_ioctl() => rtc_update_irq_enable() => cmos_update_irq_enable() It's caused by a race condition in the module initialization. It is rtc_device_register() which makes the ioctl operations live so I moved the call to dev_set_drvdata() before the call to rtc_device_register(). Reported-by: Randy Dunlap Signed-off-by: Dan Carpenter Tested-by: Randy Dunlap diff --git a/drivers/rtc/rtc-cmos.c b/drivers/rtc/rtc-cmos.c index e9aa814..aa13875 100644 --- a/drivers/rtc/rtc-cmos.c +++ b/drivers/rtc/rtc-cmos.c @@ -719,6 +719,9 @@ cmos_do_probe(struct device *dev, struct resource *ports, int rtc_irq) } } + cmos_rtc.dev = dev; + dev_set_drvdata(dev, &cmos_rtc); + cmos_rtc.rtc = rtc_device_register(driver_name, dev, &cmos_rtc_ops, THIS_MODULE); if (IS_ERR(cmos_rtc.rtc)) { @@ -726,8 +729,6 @@ cmos_do_probe(struct device *dev, struct resource *ports, int rtc_irq) goto cleanup0; } - cmos_rtc.dev = dev; - dev_set_drvdata(dev, &cmos_rtc); rename_region(ports, dev_name(&cmos_rtc.rtc->dev)); spin_lock_irq(&rtc_lock);