linux/drivers/base
Jarkko Nikula 2a077f7258 device property: Track owner device of device property
commit 5ab894aee0 upstream.

Deletion of subdevice will remove device properties associated to parent
when they share the same firmware node after commit 478573c93a (driver
core: Don't leak secondary fwnode on device removal).  This was observed
with a driver adding subdevice that driver wasn't able to read device
properties after rmmod/modprobe cycle.

Consider the lifecycle of it:

parent device registration
	ACPI_COMPANION_SET()
	device_add_properties()
		pset_copy_set()
		set_secondary_fwnode(dev, &p->fwnode)
	device_add()

parent probe
	read device properties
	ACPI_COMPANION_SET(subdevice, ACPI_COMPANION(parent))
	device_add(subdevice)

parent remove
	device_del(subdevice)
		device_remove_properties()
			set_secondary_fwnode(dev, NULL);
			pset_free()

Parent device will have its primary firmware node pointing to an ACPI
node and secondary firmware node point to device properties.

ACPI_COMPANION_SET() call in parent probe will set the subdevice's
firmware node to point to the same 'struct fwnode_handle' and the
associated secondary firmware node, i.e. the device properties as the
parent.

When subdevice is deleted in parent remove that will remove those
device properties and attempt to read device properties in next
parent probe call will fail.

Fix this by tracking the owner device of device properties and delete
them only when owner device is being deleted.

Fixes: 478573c93a (driver core: Don't leak secondary fwnode on device removal)
Signed-off-by: Jarkko Nikula <jarkko.nikula@linux.intel.com>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
History 2017-10-18 09:35:39 +02:00
..
power PM: core: Fix device_pm_check_callbacks() 2017-10-05 09:44:01 +02:00
regmap Merge remote-tracking branches 'regmap/topic/core' and 'regmap/topic/debugfs' into regmap-next 2016-10-04 05:17:12 +02:00
attribute_container.c attribute_container: Fix typo 2016-08-31 15:13:56 +02:00
base.h PM / sleep: prohibit devices probing during suspend/hibernation 2015-11-30 14:47:22 +01:00
bus.c driver core: bus: Fix a potential double free 2017-09-09 17:39:38 +02:00
cacheinfo.c cpu/cacheinfo: Fix teardown path 2015-09-17 06:06:54 -07:00
class.c class_find_device: fix reference to argument "match" 2015-09-29 15:23:14 +02:00
component.c Merge 4.5-rc4 into driver-core-next 2016-02-14 14:29:55 -08:00
container.c ACPI / hotplug / driver core: Handle containers in a special way 2013-12-29 15:25:48 +01:00
core.c Add "shutdown" to "struct class". 2017-07-15 12:16:11 +02:00
cpu.c cpu: clean up register_cpu func 2016-08-31 15:19:55 +02:00
dd.c driver core: fix smatch warning on dev->bus check 2016-10-31 09:15:22 -06:00
devcoredump.c devcoredump: add scatterlist support 2016-04-15 11:20:32 -07:00
devres.c devm: make allocations numa aware by default 2015-10-09 17:00:33 -04:00
devtmpfs.c wrappers for ->i_mutex access 2016-01-22 18:04:28 -05:00
dma-coherent.c drivers: dma-coherent: Move spinlock in dma_alloc_from_coherent() 2016-09-28 17:53:16 +02:00
dma-contiguous.c driver core update for 4.4-rc1 2015-11-04 21:50:37 -08:00
dma-mapping.c drivers/base dmam_declare_coherent_memory leaks 2016-08-31 15:19:55 +02:00
driver.c driver core: add missing blank line after declaration 2015-03-25 14:36:30 +01:00
firmware.c firmware: change firmware_kset to firmware_kobj 2008-01-24 20:40:23 -08:00
firmware_class.c firmware: fix usermode helper fallback loading 2017-01-09 08:32:22 +01:00
hypervisor.c drivers/base: Add export.h for EXPORT_SYMBOL/THIS_MODULE as required. 2011-10-31 19:31:38 -04:00
init.c drivers: of/base: move of_init to driver_init 2015-05-26 19:55:56 -07:00
isa.c isa: Call isa_bus_init before dependent ISA bus drivers register 2016-06-17 20:47:11 -07:00
Kconfig driver core: Make Kconfig text for DEBUG_TEST_DRIVER_REMOVE stronger 2016-10-27 17:47:12 +02:00
Makefile isa: Allow ISA-style drivers on modern systems 2016-06-17 20:21:12 -07:00
map.c drivers: base: map: Use kmalloc_array instead of kmalloc 2015-03-25 14:35:08 +01:00
memory.c base/memory, hotplug: fix a kernel oops in show_valid_zones() 2017-02-09 08:08:28 +01:00
module.c base: make module_create_drivers_dir race-free 2016-06-15 19:21:31 -07:00
node.c treewide: replace obsolete _refok by __ref 2016-08-02 17:31:41 -04:00
pinctrl.c driver: base: pinctrl: return error from pinctrl_bind_pins() 2016-09-13 23:02:59 +02:00
platform-msi.c genirq/msi: Add cpumask allocation to alloc_msi_entry 2016-09-14 22:11:08 +02:00
platform.c driver core: platform: Don't read past the end of "driver_override" buffer 2017-10-12 11:51:24 +02:00
property.c device property: Track owner device of device property 2017-10-18 09:35:39 +02:00
soc.c base: soc: make it explicitly non-modular 2016-08-31 15:13:56 +02:00
syscore.c genirq: Simplify wakeup mechanism 2014-09-01 13:48:59 +02:00
topology.c topology/sysfs: provide drawer id and siblings attributes 2016-06-13 15:58:27 +02:00
transport_class.c drivers/base: transport_class explicitly requires EXPORT_SYMBOL 2011-10-31 19:31:15 -04:00