From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754587AbbESHQw (ORCPT ); Tue, 19 May 2015 03:16:52 -0400 Received: from mailout1.w1.samsung.com ([210.118.77.11]:14193 "EHLO mailout1.w1.samsung.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753281AbbESHQp (ORCPT ); Tue, 19 May 2015 03:16:45 -0400 X-AuditID: cbfec7f5-f794b6d000001495-16-555ae35bdc57 From: Krzysztof Kozlowski To: Sebastian Reichel , Dmitry Eremin-Solenikov , David Woodhouse , linux-pm@vger.kernel.org, linux-kernel@vger.kernel.org Cc: Krzysztof Kozlowski Subject: [PATCH 1/2] power_supply: Use wrappers to avoid races when registering power supply Date: Tue, 19 May 2015 16:16:29 +0900 Message-id: <1432019790-5664-2-git-send-email-k.kozlowski@samsung.com> X-Mailer: git-send-email 1.9.1 In-reply-to: <1432019790-5664-1-git-send-email-k.kozlowski@samsung.com> References: <1432019790-5664-1-git-send-email-k.kozlowski@samsung.com> X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFuphluLIzCtJLcpLzFFi42I5/e/4Vd3ox1GhBmsbbSwmPXnPbDFx5WRm i9cvDC0u75rDZvG59wijxendJQ5sHjtn3WX32LxCy2PTqk42j74tqxg9Pm+SC2CN4rJJSc3J LEst0rdL4Mo4de0oU8FN4Yqe3RfYGhif8ncxcnJICJhI9G1sZoWwxSQu3FvP1sXIxSEksJRR oun4f2YI5z+jRM+2LjaQKjYBY4nNy5eAVYkI7GaUmDB1OQtIglnAUOLnuz/sILawQJzE+RUX GUFsFgFViXcbXjGD2LwCbhI/375hgVgnJ3Hy2GSw1ZwC7hLPzvwDinMAbXOTuNrmOYGRdwEj wypG0dTS5ILipPRcI73ixNzi0rx0veT83E2MkDD6uoNx6TGrQ4wCHIxKPLwr/CJDhVgTy4or cw8xSnAwK4nwsl2KChXiTUmsrEotyo8vKs1JLT7EKM3BoiTOO3PX+xAhgfTEktTs1NSC1CKY LBMHp1QD44K3XQFlXTnhUzQzXvaubX9YLP9g/0/1/zFz57AHmZl9mS88Z20Bt3frfPe/x35/ Wj/Ja2WX1b4Vrb+Dsni5JuSn2++ZHJe+rUflZNCc9LKg5fKxrsbtvXJWos8111bMO8o67fl/ FmXl+LaU/L4J3Auecq9Y2aIWIrz8ZnW7mL4Ez6EpEqHnlViKMxINtZiLihMB35LoVB8CAAA= Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Use wrappers over get_property() and set_property() internally in power supply and for sysfs interface. The wrappers provide safe access if power supply is not yet registered or t is being destroyed. In case of syfs the theoretical race could happen between ending of driver's probe and parallel sysfs access: some_driver_probe() userspace ==================================== =========================== drv->psy = power_supply_register() device_add() sysfs entries are created atomic_inc(&psy->use_cnt); store on sysfs attributes drv->set_property() dereference of drv->psy drv->psy = returned psy; For leds the race could happen between power supply being destroyed and ongoing power_supply_changed_work(). Signed-off-by: Krzysztof Kozlowski --- drivers/power/power_supply_leds.c | 4 ++-- drivers/power/power_supply_sysfs.c | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/drivers/power/power_supply_leds.c b/drivers/power/power_supply_leds.c index 2d41a43fc81a..2277ad9c2f68 100644 --- a/drivers/power/power_supply_leds.c +++ b/drivers/power/power_supply_leds.c @@ -25,7 +25,7 @@ static void power_supply_update_bat_leds(struct power_supply *psy) unsigned long delay_on = 0; unsigned long delay_off = 0; - if (psy->desc->get_property(psy, POWER_SUPPLY_PROP_STATUS, &status)) + if (power_supply_get_property(psy, POWER_SUPPLY_PROP_STATUS, &status)) return; dev_dbg(&psy->dev, "%s %d\n", __func__, status.intval); @@ -115,7 +115,7 @@ static void power_supply_update_gen_leds(struct power_supply *psy) { union power_supply_propval online; - if (psy->desc->get_property(psy, POWER_SUPPLY_PROP_ONLINE, &online)) + if (power_supply_get_property(psy, POWER_SUPPLY_PROP_ONLINE, &online)) return; dev_dbg(&psy->dev, "%s %d\n", __func__, online.intval); diff --git a/drivers/power/power_supply_sysfs.c b/drivers/power/power_supply_sysfs.c index 9134e3d2d95e..af026806cba5 100644 --- a/drivers/power/power_supply_sysfs.c +++ b/drivers/power/power_supply_sysfs.c @@ -125,7 +125,7 @@ static ssize_t power_supply_store_property(struct device *dev, value.intval = long_val; - ret = psy->desc->set_property(psy, off, &value); + ret = power_supply_set_property(psy, off, &value); if (ret < 0) return ret; -- 1.9.1