These are "obvious" locking fixes: using the right lock to protect interface claim/release (should be the driver model bus lock, not BKL).
- Dave
--- 1.22/drivers/usb/core/devices.c Tue Jul 29 04:28:37 2003
+++ edited/drivers/usb/core/devices.c Mon Mar 29 17:18:25 2004
@@ -238,7 +238,7 @@
if (start > end)
return start;
- lock_kernel(); /* driver might be unloaded */
+ down_read(&usb_bus_type.subsys.rwsem);
start += sprintf(start, format_iface,
desc->bInterfaceNumber,
desc->bAlternateSetting,
@@ -248,7 +248,7 @@
desc->bInterfaceSubClass,
desc->bInterfaceProtocol,
iface->driver ? iface->driver->name : "(none)");
- unlock_kernel();
+ up_read(&usb_bus_type.subsys.rwsem);
return start;
}
--- 1.56/drivers/usb/core/devio.c Mon Mar 1 03:40:11 2004
+++ edited/drivers/usb/core/devio.c Mon Mar 29 17:20:58 2004
@@ -363,13 +363,15 @@
return 0;
iface = dev->actconfig->interface[intf];
err = -EBUSY;
- lock_kernel();
+
+ /* lock against other changes to driver bindings */
+ down_write(&usb_bus_type.subsys.rwsem);
if (!usb_interface_claimed(iface)) {
usb_driver_claim_interface(&usbdevfs_driver, iface, ps);
set_bit(intf, &ps->ifclaimed);
err = 0;
}
- unlock_kernel();
+ up_write(&usb_bus_type.subsys.rwsem);
return err;
}
@@ -384,11 +386,14 @@
err = -EINVAL;
dev = ps->dev;
down(&dev->serialize);
+ /* lock against other changes to driver bindings */
+ down_write(&usb_bus_type.subsys.rwsem);
if (test_and_clear_bit(intf, &ps->ifclaimed)) {
iface = dev->actconfig->interface[intf];
usb_driver_release_interface(&usbdevfs_driver, iface);
err = 0;
}
+ up_write(&usb_bus_type.subsys.rwsem);
up(&dev->serialize);
return err;
}
