1
linux/drivers
Ian Abbott 5c796ae7a7 PCI: Fix fakephp deadlock
If the fakephp driver is used to emulate removal of a PCI device by
writing text string "0" to the "power" sysfs attribute file, this causes
its parent directory and its contents (including the "power" file) to be
deleted before the write operation returns.  Unfortunately, it ends up
in a deadlock waiting for itself to complete.

The deadlock is as follows: sysfs_write_file calls flush_write_buffer
which calls sysfs_get_active_two before calling power_write_file in
pci_hotplug_core.c via the sysfs store operation. The power_write_file
function calls disable_slot in fakephp.c via the slot operation.  The
disable_slot function calls remove_slot which calls pci_hp_deregister
(back in pci_hotplug_core.c) which calls fs_remove_slot which calls
sysfs_remove_file to remove the "power" file. The sysfs_remove_file
function calls sysfs_hash_and_remove which calls sysfs_addrm_finish
which calls sysfs_deactivate. The sysfs_deactivate function sees that
something has an active reference on the sysfs_dirent (from the
previous call to sysfs_get_active_two back up the call stack somewhere)
so waits for the active reference to go away, which is of course
impossible.

The problem has been present since 2.6.21.

This patch breaks the deadlock by queuing work queue items on a single-
threaded work queue to remove a slot from sysfs, and to rescan the PCI
buses.  There is also some protection against disabling a slot that is
already being removed.

Signed-off-by: Ian Abbott <abbotti@mev.co.uk>
Cc: Kristen Accardi <kristen.c.accardi@intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
2008-02-01 15:04:30 -08:00
..
acorn/char
acpi x86: don't disable TSC in any C states on AMD Fam10h 2008-01-30 13:32:41 +01:00
amba
ata PCI: Remove users of pci_enable_device_bars() 2008-02-01 15:04:27 -08:00
atm
auxdisplay
base Merge git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/driver-2.6 2008-01-31 09:31:37 +11:00
block block/sunvdc.c:print_version() must be __devinit 2008-02-01 09:26:32 +01:00
bluetooth
cdrom
char unexport add_disk_randomness 2008-02-01 09:26:32 +01:00
clocksource
connector [NETNS]: Consolidate kernel netlink socket destruction. 2008-01-28 15:08:07 -08:00
cpufreq cpufreq: fix obvious condition statement error 2008-01-30 13:33:34 +01:00
cpuidle
crypto
dca
dio
dma
edac Merge branch 'linux-2.6' 2008-01-31 11:25:51 +11:00
eisa
firewire firewire: fw-sbp2: Use sbp2 device-provided mgt orb timeout for logins 2008-01-30 22:22:29 +01:00
firmware x86: left over fix for leak of early_ioremp in dmi_scan 2008-01-30 13:33:32 +01:00
hid
hwmon
i2c PCI: Remove users of pci_enable_device_bars() 2008-02-01 15:04:27 -08:00
ide PCI: Remove users of pci_enable_device_bars() 2008-02-01 15:04:27 -08:00
ieee1394 ieee1394: ohci1394: don't schedule IT tasklets on IR events 2008-01-30 22:22:21 +01:00
infiniband [SCSI] remove use_sg_chaining 2008-01-30 13:14:02 -06:00
input [ALSA] Remove sound/driver.h 2008-01-31 17:29:48 +01:00
isdn
leds
lguest lguest: fix mis-merge against hpa's TSS renaming 2008-01-31 19:59:44 +11:00
macintosh Merge branch 'linux-2.6' 2008-01-31 11:25:51 +11:00
mca
md
media [ALSA] Remove sound/driver.h 2008-01-31 17:29:48 +01:00
message
mfd
misc
mmc
mtd
net Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6 2008-02-01 21:06:29 +11:00
nubus
of
oprofile
parisc
parport
pci PCI: Fix fakephp deadlock 2008-02-01 15:04:30 -08:00
pcmcia
pnp git-x86: drivers/pnp/pnpbios/bioscalls.c build fix 2008-01-30 13:32:31 +01:00
power
ps3
rapidio Merge branch 'linux-2.6' 2008-01-31 11:25:51 +11:00
rtc
s390 [SCSI] zfcp: fix sense_buffer access bug 2008-01-30 13:03:39 -06:00
sbus
scsi PCI: Remove users of pci_enable_device_bars() 2008-02-01 15:04:27 -08:00
serial m68knommu: use container_of in mcf.c 2008-02-01 21:00:01 +11:00
sh
sn
spi Merge branch 'linux-2.6' 2008-01-31 11:25:51 +11:00
ssb ssb: Add boardflags_hi field to the sprom data structure 2008-01-28 15:09:52 -08:00
tc
telephony
uio
usb PCI: use dev_printk in quirk messages 2008-02-01 15:04:26 -08:00
video x86: cpa: move flush to cpa 2008-01-30 13:34:07 +01:00
virtio
w1
watchdog [WATCHDOG] use SGI_HAS_INDYDOG for INDYDOG depends 2008-01-29 12:58:38 +00:00
xen
zorro
Kconfig KVM: Move arch dependent files to new directory arch/x86/kvm/ 2008-01-30 18:01:18 +02:00
Makefile Merge git://git.kernel.org/pub/scm/linux/kernel/git/rusty/linux-2.6-for-linus 2008-01-31 09:35:32 +11:00