linux/drivers/base
Chuansheng Liu ce2fcbd99c firmware loader: Fix the race FW_STATUS_DONE is followed by class_timeout
There is a race as below when calling request_firmware():
CPU1                                   CPU2
write 0 > loading
mutex_lock(&fw_lock)
...
set_bit FW_STATUS_DONE                 class_timeout is coming
                                       set_bit FW_STATUS_ABORT
complete_all &completion
...
mutex_unlock(&fw_lock)

In this time, the bit FW_STATUS_DONE and FW_STATUS_ABORT are set,
and request_firmware() will return failure due to condition in
_request_firmware_load():
	if (!buf->size || test_bit(FW_STATUS_ABORT, &buf->status))
		retval = -ENOENT;

But from the above scenerio, it should be a successful requesting.
So we need judge if the bit FW_STATUS_DONE is already set before
calling fw_load_abort() in timeout function.

As Ming's proposal, we need change the timer into sched_work to
benefit from using &fw_lock mutex also.

Signed-off-by: liu chuansheng <chuansheng.liu@intel.com>
Acked-by: Ming Lei <ming.lei@canonical.com>
Cc: stable <stable@vger.kernel.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2012-11-14 15:04:23 -08:00
..
power PM / Domains: Fix memory leak on error path in pm_genpd_attach_cpuidle 2012-10-23 00:54:38 +02:00
regmap regmap: select REGMAP if REGMAP_MMIO and REGMAP_IRQ enabled 2012-10-17 22:09:35 +09:00
attribute_container.c drivers: base: Convert dev_printk(KERN_<LEVEL> to dev_<level>( 2012-10-30 17:38:43 -07:00
base.h driver core: move the deferred probe pointer into the private area 2012-03-08 12:17:22 -08:00
bus.c driver core: move uevent call to driver_register 2012-07-16 18:04:25 -07:00
class.c Revert "driver core: check start node in klist_iter_init_node" 2012-04-19 19:17:30 -07:00
core.c device and dynamic_debug: Use dev_vprintk_emit and dev_printk_emit 2012-09-17 06:10:05 -07:00
cpu.c sched: Remove stale power aware scheduling remnants and dysfunctional knobs 2012-05-17 13:48:56 +02:00
dd.c [SCSI] cleanup usages of scsi_complete_async_scans 2012-07-20 09:25:22 +01:00
devres.c drivers: base: Convert dev_printk(KERN_<LEVEL> to dev_<level>( 2012-10-30 17:38:43 -07:00
devtmpfs.c userns: Convert devtmpfs to use GLOBAL_ROOT_UID and GLOBAL_ROOT_GID 2012-09-21 03:13:05 -07:00
dma-buf.c make get_file() return its argument 2012-09-26 21:10:25 -04:00
dma-coherent.c drivers: dma-coherent: Fix typo in dma_mmap_from_coherent documentation 2012-10-23 14:05:32 +02:00
dma-contiguous.c drivers: dma-contiguous: Don't redefine SZ_1M 2012-10-23 14:05:32 +02:00
dma-mapping.c common: dma-mapping: introduce dma_get_sgtable() function 2012-07-30 12:25:46 +02:00
driver.c driver core: don't trigger uevent after failure 2012-07-17 10:40:23 -07:00
firmware_class.c firmware loader: Fix the race FW_STATUS_DONE is followed by class_timeout 2012-11-14 15:04:23 -08:00
firmware.c
hypervisor.c drivers/base: Add export.h for EXPORT_SYMBOL/THIS_MODULE as required. 2011-10-31 19:31:38 -04:00
init.c driver-core: implement 'sysdev' functionality for regular devices and buses 2011-12-14 14:29:38 -08:00
isa.c
Kconfig Merge 3.7-rc3 into driver-core-next 2012-10-29 08:46:28 -07:00
Makefile drivers: add Contiguous Memory Allocator 2012-05-21 15:09:37 +02:00
map.c
memory.c memory-hotplug: update memory block's state and notify userspace 2012-10-09 16:23:02 +09:00
module.c driver core: module.c: Use kasprintf 2010-05-21 09:37:29 -07:00
node.c mm: fix off-by-one bug in print_nodes_state() 2012-05-29 16:22:19 -07:00
platform.c Merge 3.7-rc5 into driver-core-next 2012-11-14 15:01:02 -08:00
soc.c mode_t whack-a-mole: ->is_visible() returns umode_t... 2012-05-29 23:28:42 -04:00
syscore.c PM: Reintroduce dropped call to check_wakeup_irqs 2011-07-11 10:51:49 +02:00
topology.c cpu: convert 'cpu' and 'machinecheck' sysdev_class to a regular subsystem 2011-12-21 14:29:42 -08:00
transport_class.c drivers/base: transport_class explicitly requires EXPORT_SYMBOL 2011-10-31 19:31:15 -04:00