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;
 }

Reply via email to