Skip to contentSkip to conversation

driver core bugfixes for 2.6.12-rc3

PATCH New Greg KH 1 participant 3 messages May 5, 2005 Driver core

lore
Share & tools
lore

Greg KH

author
#0 lore raw

PATCH 1/1 driver core bugfixes for 2.6.12-rc3

Here are two driver core bugfixes for 2.6.12-rc3.

Pull from:
rsync://rsync.kernel.org/pub/scm/linux/kernel/git/gregkh/driver-2.6.git/

Full patches will be sent to the linux-kernel mailing lists, if anyone wants to see them.

thanks,

greg k-h

-------------

 drivers/base/bus.c  |    5 ++---
 drivers/base/core.c |    2 +-
 2 files changed, 3 insertions(+), 4 deletions(-)

Alexander Nyberg:
o Hotplug: Make dev->bus checking consistent

Roman Kagan:
o drivers/base/bus.c: fix iteration in driver_detach()

author
#1 lore raw

PATCH 1/1 Hotplug: Make dev->bus checking consistent

[PATCH] Hotplug: Make dev->bus checking consistent

Earlier in the same function dev->bus is checked before dereferenced, make consistent although I honestly don't know if dev->bus could ever be NULL

Found by the Coverity tool

---
commit 177a4324944478f2799ce4ede2797cb0f602f274 tree cc42dcdbce1c3b53ea147abd3ebf784f0d2bf1bc parent 897f5ab2cd733a77a2279268262919caa8154b9d author Alexander Nyberg <[email protected]> 1109421531 +0100 committer Greg KH <[email protected]> 1115275477 -0700

drivers/base/core.c (mode:100644 sha1:268a9c8d168b6ac72a46e0c624830b030b79df51) renamed from drivers/base/core.c (mode:100644 sha1:a7cedd8cefe5385a8d2eb6f334c8661454c443d7) +1 -1
Index: drivers/base/core.c
===================================================================
@@ -139,7 +139,7 @@
 	buffer = &buffer[length];
 	buffer_size -= length;
 
-	if (dev->bus->hotplug) {
+	if (dev->bus && dev->bus->hotplug) {
 		/* have the bus specific function add its stuff */
 		retval = dev->bus->hotplug (dev, envp, num_envp, buffer, buffer_size);
 			if (retval) {
author
#2 lore raw

PATCH 1/1 drivers/base/bus.c: fix iteration in driver_detach()

[PATCH] drivers/base/bus.c: fix iteration in driver_detach()

With 2.6.11 and 2.6.12-rc2 (and perhaps a few versions before) usb drivers for multi-interface devices, which do usb_driver_release_interface() in their disconnect(), make rmmod hang.

It turns out to be due to a bug in drivers/base/bus.c:driver_detach(), that iterates over the list of attached devices with list_for_each_safe() under an assumption that device_release_driver() only releases the current device, while it may also call device_release_driver() for other devices on the same list.

The following patch fixes it. Please consider applying.

---
commit b2d84f078a8be40f5ae3b4d2ac001e2a7f45fe4f tree 173f941991f1b68da820e9926a3b7ebdd3a2c8b9 parent 177a4324944478f2799ce4ede2797cb0f602f274 author Roman Kagan <[email protected]> 1113414017 +0400 committer Greg KH <[email protected]> 1115275478 -0700

drivers/base/bus.c (mode:100644 sha1:2b3902c867dab76cf5b9b9d65d1778be20ac20e1) renamed from drivers/base/bus.c (mode:100644 sha1:f4fa27315fb4b69841ecf2a551d58d9a241c5546) +2 -3
Index: drivers/base/bus.c
===================================================================
@@ -405,9 +405,8 @@
 
 static void driver_detach(struct device_driver * drv)
 {
-	struct list_head * entry, * next;
-	list_for_each_safe(entry, next, &drv->devices) {
-		struct device * dev = container_of(entry, struct device, driver_list);
+	while (!list_empty(&drv->devices)) {
+		struct device * dev = container_of(drv->devices.next, struct device, driver_list);
 		device_release_driver(dev);
 	}
 }