On Thu, 18 Sep 2003, David Brownell wrote:

> You might be right that another put_device() is needed, but
> if so I've to to suspect that's because there's an extra
> get_device() ... like the one in "config.c".  Isn't the
> object initialized to count == 1, so that get_device() makes
> usbcore track count == 2 for just one copy of that pointer?

That's right, and you're also right that there's an extra get_device().  
In fact, there are two extra.  The first is indeed in config.c; this patch 
(as111) gets rid of it.

===== config.c 1.25 vs edited =====
--- 1.25/drivers/usb/core/config.c      Mon Sep 15 10:14:46 2003
+++ edited/drivers/usb/core/config.c    Fri Sep 19 17:07:29 2003
@@ -237,9 +237,6 @@
                memset(interface, 0, sizeof(struct usb_interface));
                interface->dev.release = usb_release_intf;
                device_initialize(&interface->dev);
-
-               /* put happens in usb_destroy_configuration */
-               get_device(&interface->dev);
        }
 
        /* Go through the descriptors, checking their length and counting the

The other is in usb.c:usb_new_device().  Neither the get_device() nor the 
put_device() in the function should be there.  The patch below, which 
applies on top of David's usb_set_configuration() rework patch, takes care 
of them.

Probably both of these mistakes arose from someone not realizing that 
device_initialize() already sets the reference count to 1.

Alan Stern


--- orig/drivers/usb/core/usb.c Fri Sep 19 17:09:00 2003
+++ edited/drivers/usb/core/usb.c       Fri Sep 19 17:09:42 2003
@@ -1009,7 +1009,6 @@
        dev->dev.driver = &usb_generic_driver;
        dev->dev.bus = &usb_bus_type;
        dev->dev.driver_data = &usb_generic_driver_data;
-       usb_get_dev(dev);
        if (dev->dev.bus_id[0] == 0)
                sprintf (&dev->dev.bus_id[0], "%d-%s",
                         dev->bus->busnum, dev->devpath);
@@ -1135,7 +1134,6 @@
        dev->state = USB_STATE_DEFAULT;
        clear_bit(dev->devnum, dev->bus->devmap.devicemap);
        dev->devnum = -1;
-       usb_put_dev(dev);
        return err;
 }
 




-------------------------------------------------------
This sf.net email is sponsored by:ThinkGeek
Welcome to geek heaven.
http://thinkgeek.com/sf
_______________________________________________
[EMAIL PROTECTED]
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel

Reply via email to