From: Phil Turmel <philip@turmel.org>
To: Jiri Kosina <jkosina@suse.cz>
Cc: Alan Stern <stern@rowland.harvard.edu>,
Mat <jackdachef@gmail.com>,
Guillaume Chazarain <guichaz@gmail.com>,
linux-kernel@vger.kernel.org, Greg Kroah-Hartman <gregkh@suse.de>,
Oliver Neukum <oliver@neukum.org>, Alan Ott <alan@signal11.us>,
linux-usb@vger.kernel.org, linux-input@vger.kernel.org,
Andreas Bombe <aeb@debian.org>, Alex Riesen <raa.lkml@gmail.com>,
Gabriel C <nix.or.die@googlemail.com>,
Heinz Diehl <htd@fritha.org>
Subject: Re: [BUG, Regression, bisected] USB mouse causes bug on 1st insert, ignored on 2nd insert, lsusb stuck at usbdev_open
Date: Tue, 21 Sep 2010 10:42:10 -0400 [thread overview]
Message-ID: <4C98C442.8030305@turmel.org> (raw)
In-Reply-To: <alpine.LNX.2.00.1009211638450.26813@pobox.suse.cz>
On 09/21/2010 10:40 AM, Jiri Kosina wrote:
> On Tue, 21 Sep 2010, Alan Stern wrote:
>
>> On Tue, 21 Sep 2010, Jiri Kosina wrote:
>>
>>> I have just found out that it's actually CONFIG_USB_DYNAMIC_MINORS which
>>> makes the difference. When unset, the problem doesn't trigger, and
>>> usb_find_interface() always returns the proper interface. When
>>> CONFIG_USB_DYNAMIC_MINORS is being used, the oops happen.
>>>
>>> I'll look into that.
>>
>> Apparently the problem is that intf->minors doesn't get initialized
>> properly. This patch should fix it. Everybody, please try it out.
>>
>> Alan Stern
>>
>>
>> Index: usb-2.6/drivers/usb/core/file.c
>> ===================================================================
>> --- usb-2.6.orig/drivers/usb/core/file.c
>> +++ usb-2.6/drivers/usb/core/file.c
>> @@ -159,9 +159,9 @@ void usb_major_cleanup(void)
>> int usb_register_dev(struct usb_interface *intf,
>> struct usb_class_driver *class_driver)
>> {
>> - int retval = -EINVAL;
>> + int retval;
>> int minor_base = class_driver->minor_base;
>> - int minor = 0;
>> + int minor;
>> char name[20];
>> char *temp;
>>
>> @@ -173,12 +173,17 @@ int usb_register_dev(struct usb_interfac
>> */
>> minor_base = 0;
>> #endif
>> - intf->minor = -1;
>> -
>> - dbg ("looking for a minor, starting at %d", minor_base);
>>
>> if (class_driver->fops == NULL)
>> - goto exit;
>> + return -EINVAL;
>> + if (intf->minor >= 0)
>> + return -EADDRINUSE;
>> +
>> + retval = init_usb_class();
>> + if (retval)
>> + return retval;
>> +
>> + dev_dbg(&intf->dev, "looking for a minor, starting at %d", minor_base);
>>
>> down_write(&minor_rwsem);
>> for (minor = minor_base; minor < MAX_USB_MINORS; ++minor) {
>> @@ -186,20 +191,12 @@ int usb_register_dev(struct usb_interfac
>> continue;
>>
>> usb_minors[minor] = class_driver->fops;
>> -
>> - retval = 0;
>> + intf->minor = minor;
>> break;
>> }
>> up_write(&minor_rwsem);
>> -
>> - if (retval)
>> - goto exit;
>> -
>> - retval = init_usb_class();
>> - if (retval)
>> - goto exit;
>> -
>> - intf->minor = minor;
>> + if (intf->minor < 0)
>> + return -EXFULL;
>>
>> /* create a usb class device for this usb interface */
>> snprintf(name, sizeof(name), class_driver->name, minor - minor_base);
>> @@ -212,12 +209,12 @@ int usb_register_dev(struct usb_interfac
>> MKDEV(USB_MAJOR, minor), class_driver,
>> "%s", temp);
>> if (IS_ERR(intf->usb_dev)) {
>> + retval = PTR_ERR(intf->usb_dev);
>> down_write(&minor_rwsem);
>> - usb_minors[intf->minor] = NULL;
>> + usb_minors[minor] = NULL;
>> + intf->minor = -1;
>> up_write(&minor_rwsem);
>> - retval = PTR_ERR(intf->usb_dev);
>> }
>> -exit:
>> return retval;
>> }
>> EXPORT_SYMBOL_GPL(usb_register_dev);
>> Index: usb-2.6/drivers/usb/core/message.c
>> ===================================================================
>> --- usb-2.6.orig/drivers/usb/core/message.c
>> +++ usb-2.6/drivers/usb/core/message.c
>> @@ -1803,6 +1803,7 @@ free_interfaces:
>> intf->dev.groups = usb_interface_groups;
>> intf->dev.dma_mask = dev->dev.dma_mask;
>> INIT_WORK(&intf->reset_ws, __usb_queue_reset_device);
>> + intf->minor = -1;
>> device_initialize(&intf->dev);
>> dev_set_name(&intf->dev, "%d-%s:%d.%d",
>> dev->bus->busnum, dev->devpath,
>
> [ adding Heinz to CC ]
>
> If USB core would guarantee the initialization of intf->minor to -1, that
> would be of course nicer than having to do it myself in the driver (which
> is exactly what my previous patch has been doing).
>
> So everyone please test Alan's patch rather than mine, as it is more
> general.
>
For what it's worth, I just finished testing yours, and it works just fine. I'll try Alan's now.
Phil
next prev parent reply other threads:[~2010-09-21 14:42 UTC|newest]
Thread overview: 30+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-09-20 1:33 [BUG, Regression, bisected] USB mouse causes bug on 1st insert, ignored on 2nd insert, lsusb stuck at usbdev_open Phil Turmel
2010-09-20 9:43 ` Guillaume Chazarain
2010-09-20 10:47 ` Phil Turmel
2010-09-20 12:42 ` Jiri Kosina
2010-09-20 13:19 ` Phil Turmel
2010-09-20 13:25 ` Jiri Kosina
2010-09-20 13:56 ` Mat
2010-09-20 15:10 ` Jiri Kosina
2010-09-20 17:05 ` Mat
2010-09-20 17:40 ` Phil Turmel
2010-09-21 12:31 ` Jiri Kosina
2010-09-21 13:57 ` Jiri Kosina
2010-09-21 14:48 ` Heinz Diehl
2010-09-21 14:55 ` Jiri Kosina
2010-09-21 14:30 ` Alan Stern
2010-09-21 14:40 ` Jiri Kosina
2010-09-21 14:42 ` Phil Turmel [this message]
2010-09-21 14:54 ` Phil Turmel
2010-09-21 16:08 ` Gabriel C
2010-09-22 9:47 ` Mat
2010-09-24 16:46 ` Greg KH
2010-09-21 16:50 ` Greg KH
2010-09-21 16:55 ` Jiri Kosina
2010-09-21 17:07 ` Greg KH
2010-09-21 17:14 ` Jiri Kosina
2010-09-20 20:55 ` Alan Stern
2010-09-20 22:48 ` Jiri Kosina
2010-09-21 0:41 ` Andreas Bombe
2010-09-20 14:11 ` Phil Turmel
2010-09-20 19:35 ` Maciej Rutecki
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4C98C442.8030305@turmel.org \
--to=philip@turmel.org \
--cc=aeb@debian.org \
--cc=alan@signal11.us \
--cc=gregkh@suse.de \
--cc=guichaz@gmail.com \
--cc=htd@fritha.org \
--cc=jackdachef@gmail.com \
--cc=jkosina@suse.cz \
--cc=linux-input@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-usb@vger.kernel.org \
--cc=nix.or.die@googlemail.com \
--cc=oliver@neukum.org \
--cc=raa.lkml@gmail.com \
--cc=stern@rowland.harvard.edu \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox