kernel-ark/drivers
Daniel Ritz 4c898c7f2f [PATCH] Driver Core: fis bus rescan devices race
bus_rescan_devices_helper() does not hold the dev->sem when it checks for
!dev->driver().  device_attach() holds the sem, but calls again
device_bind_driver() even when dev->driver is set.

What happens is that a first device_attach() call (module insertion time)
is on the way binding the device to a driver.  Another thread calls
bus_rescan_devices().  Now when bus_rescan_devices_helper() checks for
dev->driver it is still NULL 'cos the the prior device_attach() is not yet
finished.  But as soon as the first one releases the dev->sem the second
device_attach() tries to rebind the already bound device again.
device_bind_driver() does this blindly which leads to a corrupt
driver->klist_devices list (the device links itself, the head points to the
device).  Later a call to device_release_driver() sets dev->driver to NULL
and breaks the link it has to itself on knode_driver.  Rmmoding the driver
later calls driver_detach() which leads to an endless loop 'cos the list
head in klist_devices still points to the device.  And since dev->driver is
NULL it's stuck with the same device forever.  Boom.  And rmmod hangs.

Very easy to reproduce with new-style pcmcia and a 16bit card.  Just loop
modprobe <pcmcia-modules> ;cardctl eject; rmmod <card driver, pcmcia
modules>.

Easiest fix is to check if the device is already bound to a driver in
device_bind_driver().  This avoids the double binding.

Signed-off-by: Daniel Ritz <daniel.ritz@gmx.ch>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
2005-09-22 07:58:24 -07:00
..
acorn [ARM] Fix pcf8583 to build 2005-09-20 21:01:13 +01:00
acpi
atm
base [PATCH] Driver Core: fis bus rescan devices race 2005-09-22 07:58:24 -07:00
block [PATCH] remove blkdev_scsi_issue_flush_fn again 2005-09-21 10:11:54 -07:00
bluetooth
cdrom
char Merge branch 'release' of master.kernel.org:/pub/scm/linux/kernel/git/aegl/linux-2.6 2005-09-16 11:54:13 -07:00
connector
cpufreq
crypto
dio
eisa
fc4
firmware [PATCH] dell_rbu tidy 2005-09-17 11:50:02 -07:00
hwmon [PATCH] hdaps driver update 2005-09-17 11:50:02 -07:00
i2c [I2C] Add a functionality method, and remove algorithm ids 2005-09-14 22:54:45 +01:00
ide [PATCH] ide: fix null request pointer for taskfile ioctl 2005-09-17 11:50:03 -07:00
ieee1394
infiniband [IB] Fix RMPP receive length calculation 2005-09-21 12:33:09 -07:00
input [PATCH] SharpSL: Add an input keyboard driver for Zaurus cxx00 series 2005-09-13 08:22:31 -07:00
isdn [PATCH] Fix ST 5481 USB driver 2005-09-17 15:34:30 -07:00
macintosh
mca
md [PATCH] RAID6 Altivec fix 2005-09-17 11:49:58 -07:00
media [PATCH] v4l: fixup on cx88_dvb for Dvico HDTV5 Gold 2005-09-13 08:22:32 -07:00
message [PATCH] Fix I2O config-osm init to return proper error 2005-09-21 10:11:54 -07:00
mfd
misc
mmc
mtd [PATCH] MTD: Update SharpSL partition definitions 2005-09-17 11:49:58 -07:00
net [PATCH] r8169: call proper VLAN receive function 2005-09-21 22:49:07 -04:00
nubus
oprofile
parisc
parport
pci [PATCH] shpchp: Use dword accessors for PCI_ROM_ADDRESS 2005-09-17 11:50:03 -07:00
pcmcia Fix yenta error message when unable to find a bus assignment 2005-09-14 13:05:17 -07:00
pnp
s390 Merge master.kernel.org:/pub/scm/linux/kernel/git/jejb/scsi-for-linus-2.6 2005-09-20 08:50:49 -07:00
sbus [PATCH] Remove unnecessary check_region references in comments 2005-09-13 08:22:29 -07:00
scsi Merge master.kernel.org:/pub/scm/linux/kernel/git/jejb/scsi-for-linus-2.6 2005-09-20 08:50:49 -07:00
serial [PATCH] Fix up some pm_message_t types 2005-09-17 11:50:00 -07:00
sh
sn
tc [PATCH] Remove unnecessary check_region references in comments 2005-09-13 08:22:29 -07:00
telephony
usb
video Merge master.kernel.org:/pub/scm/linux/kernel/git/davem/sparc-2.6 2005-09-21 07:53:38 -07:00
w1
zorro
Kconfig
Makefile