Merge git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb-2.6
authorLinus Torvalds <torvalds@linux-foundation.org>
Tue, 15 Dec 2009 16:58:13 +0000 (08:58 -0800)
committerLinus Torvalds <torvalds@linux-foundation.org>
Tue, 15 Dec 2009 16:58:13 +0000 (08:58 -0800)
* git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb-2.6:
  USB: Close usb_find_interface race v3
  Revert "USB: Close usb_find_interface race"

1  2 
drivers/usb/core/usb.c

diff --combined drivers/usb/core/usb.c
index 043fa833eeca949c6f7613bec94f1433cfe42afc,d86276c639c1a3915f9344187b9ff6e5071694b8..2fb42043b305228e6995cff0b870a744237d52af
@@@ -167,18 -167,23 +167,23 @@@ struct usb_host_interface *usb_altnum_t
  }
  EXPORT_SYMBOL_GPL(usb_altnum_to_altsetting);
  
+ struct find_interface_arg {
+       int minor;
+       struct device_driver *drv;
+ };
  static int __find_interface(struct device *dev, void *data)
  {
-       int *minor = data;
+       struct find_interface_arg *arg = data;
        struct usb_interface *intf;
  
        if (!is_usb_interface(dev))
                return 0;
  
+       if (dev->driver != arg->drv)
+               return 0;
        intf = to_usb_interface(dev);
-       if (intf->minor != -1 && intf->minor == *minor)
-               return 1;
-       return 0;
+       return intf->minor == arg->minor;
  }
  
  /**
   * @minor: the minor number of the desired device
   *
   * This walks the bus device list and returns a pointer to the interface
-  * with the matching minor.  Note, this only works for devices that share the
-  * USB major number.
+  * with the matching minor and driver.  Note, this only works for devices
+  * that share the USB major number.
   */
  struct usb_interface *usb_find_interface(struct usb_driver *drv, int minor)
  {
+       struct find_interface_arg argb;
        struct device *dev;
  
-       dev = bus_find_device(&usb_bus_type, NULL, &minor, __find_interface);
+       argb.minor = minor;
+       argb.drv = &drv->drvwrap.driver;
+       dev = bus_find_device(&usb_bus_type, NULL, &argb, __find_interface);
  
        /* Drop reference count from bus_find_device */
        put_device(dev);
@@@ -320,7 -329,7 +329,7 @@@ static int usb_dev_restore(struct devic
        return usb_resume(dev, PMSG_RESTORE);
  }
  
 -static struct dev_pm_ops usb_device_pm_ops = {
 +static const struct dev_pm_ops usb_device_pm_ops = {
        .prepare =      usb_dev_prepare,
        .complete =     usb_dev_complete,
        .suspend =      usb_dev_suspend,