Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753280AbbKZTMB (ORCPT ); Thu, 26 Nov 2015 14:12:01 -0500 Received: from dgate20.ts.fujitsu.com ([80.70.172.51]:48089 "EHLO dgate20.ts.fujitsu.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752056AbbKZTL7 (ORCPT ); Thu, 26 Nov 2015 14:11:59 -0500 X-Greylist: delayed 585 seconds by postgrey-1.27 at vger.kernel.org; Thu, 26 Nov 2015 14:11:58 EST DomainKey-Signature: s=s1536a; d=ts.fujitsu.com; c=nofws; q=dns; h=X-SBRSScore:Received:Received:Received:From:To:Cc: Subject:Date:Message-Id:X-Mailer; b=VXpPqbH7PtpPgraEBIIE0BJeZpoko4BMXbgu8bBeyVjNOD8JILl5YRGt H2CRkf7sUrPfV0a+R9oGpCo/MVczBySbx0H6tO3zcz6f3K233V2M9jVm7 NuS5xPkVjXmaeR5UAy8+5CLEMabl7iOYRMvRGVMcp1abjkvuxHcX7KxbF b/87p0opA/dLoqSkw1rtO8530n1opmyXP7Te6JroSWXz4scUTERyO0syx yY0pm50xQRCtVgy+vCFQgc+f+lkGg; X-SBRSScore: None From: martin.wilck@ts.fujitsu.com To: gregkh@linuxfoundation.org, linux-kernel@vger.kernel.org Cc: u.kleine-koenig@pengutronix.de, tpmdd-devel@lists.sourceforge.net, Martin Wilck Subject: [PATCH] base/platform: fix panic when probe function is NULL Date: Thu, 26 Nov 2015 20:01:34 +0100 Message-Id: <1448564494-23218-1-git-send-email-martin.wilck@ts.fujitsu.com> X-Mailer: git-send-email 2.1.0 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 2148 Lines: 60 From: Martin Wilck Since b8b2c7d845d5, platform_drv_probe() is called for all platform devices. If drv->probe is NULL, and dev_pm_domain_attach() fails, platform_drv_probe() will return the error code from dev_pm_domain_attach(). This causes real_probe() to enter the "probe_failed" path and set dev->driver to NULL. Before b8b2c7d845d5, real_probe() would assume success if both dev->bus->probe and drv->probe are missing. This may cause a panic later. For example, inserting the tpm_tis driver with parameter "force=1" (i.e. registering tpm_tis as a platform driver) will panic in tpmm_chip_alloc() because dev->driver is NULL: chip->cdev.owner = chip->pdev->driver->owner; This patch fixes this by returning success in platform_drv_probe() if "just" dev_pm_domain_attach() had failed. This restores the semantics of platform_device_register_XXX() if the associated platform driver has no "probe" function. Fixes: b8b2c7d845d5 ("base/platform: assert that dev_pm_domain callbacks are called unconditionally") Signed-off-by: Martin Wilck --- drivers/base/platform.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/drivers/base/platform.c b/drivers/base/platform.c index 1dd6d3b..c994e76 100644 --- a/drivers/base/platform.c +++ b/drivers/base/platform.c @@ -513,10 +513,14 @@ static int platform_drv_probe(struct device *_dev) return ret; ret = dev_pm_domain_attach(_dev, true); - if (ret != -EPROBE_DEFER && drv->probe) { - ret = drv->probe(dev); - if (ret) - dev_pm_domain_detach(_dev, true); + if (ret != -EPROBE_DEFER) { + if (drv->probe) { + ret = drv->probe(dev); + if (ret) + dev_pm_domain_detach(_dev, true); + } else + /* don't fail if just dev_pm_domain_attach failed */ + ret = 0; } if (drv->prevent_deferred_probe && ret == -EPROBE_DEFER) { -- 1.8.3.1 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/