Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 5c6e3a97 authored by Krzysztof Kozlowski's avatar Krzysztof Kozlowski Committed by Sebastian Reichel
Browse files

power_supply: sysfs: Bring back write to writeable properties



The fix for NULL pointer exception related to calling uevent for not
finished probe caused to set all writeable properties as non-writeable.
This was caused by checking if property is writeable before the initial
increase of power supply usage counter and in the same time using
wrapper over property_is_writeable(). The wrapper returns ENODEV if the
usage counter is still 0.

The call trace looked like:
  device probe:
    power_supply_register()
      use_cnt = 0;
      device_add()
        create sysfs entries
          power_supply_attr_is_visible()
            power_supply_property_is_writeable()
              if (use_cnt == 0) return -ENODEV;
      use_cnt++;

Replace the usage of wrapper with direct call to property_is_writeable()
from driver. This should be safe call during device probe because
implementations of this callback just return 0/1 for different
properties and they do not access any of the driver's internal data.

Fixes: 8e59c7f2 ("power_supply: Fix NULL pointer dereference during bq27x00_battery probe")
Signed-off-by: default avatarKrzysztof Kozlowski <k.kozlowski@samsung.com>
Signed-off-by: default avatarSebastian Reichel <sre@kernel.org>
parent fb323ecc
Loading
Loading
Loading
Loading
+1 −1
Original line number Original line Diff line number Diff line
@@ -223,7 +223,7 @@ static umode_t power_supply_attr_is_visible(struct kobject *kobj,


		if (property == attrno) {
		if (property == attrno) {
			if (psy->desc->property_is_writeable &&
			if (psy->desc->property_is_writeable &&
			    power_supply_property_is_writeable(psy, property) > 0)
			    psy->desc->property_is_writeable(psy, property) > 0)
				mode |= S_IWUSR;
				mode |= S_IWUSR;


			return mode;
			return mode;
+5 −0
Original line number Original line Diff line number Diff line
@@ -206,6 +206,11 @@ struct power_supply_desc {
	int (*set_property)(struct power_supply *psy,
	int (*set_property)(struct power_supply *psy,
			    enum power_supply_property psp,
			    enum power_supply_property psp,
			    const union power_supply_propval *val);
			    const union power_supply_propval *val);
	/*
	 * property_is_writeable() will be called during registration
	 * of power supply. If this happens during device probe then it must
	 * not access internal data of device (because probe did not end).
	 */
	int (*property_is_writeable)(struct power_supply *psy,
	int (*property_is_writeable)(struct power_supply *psy,
				     enum power_supply_property psp);
				     enum power_supply_property psp);
	void (*external_power_changed)(struct power_supply *psy);
	void (*external_power_changed)(struct power_supply *psy);