public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* Re: [linux-usb-devel] usb+sysfs: duplicate filename 'bInterfaceNumber'
@ 2007-10-25  9:06 Dave Young
  2007-10-25 18:11 ` Greg KH
  0 siblings, 1 reply; 18+ messages in thread
From: Dave Young @ 2007-10-25  9:06 UTC (permalink / raw)
  To: Greg KH
  Cc: Alan Stern, Matthew Dharm, bbpetkov, Kernel development list,
	USB development list

On 10/19/07, Greg KH <greg@kroah.com> wrote:
>On Wed, Oct 17, 2007 at 10:48:52AM -0400, Alan Stern wrote:
>> On Tue, 16 Oct 2007, Matthew Dharm wrote:
>>
>> > On Tue, Oct 16, 2007 at 02:04:43PM -0400, Alan Stern wrote:
>> > > On Tue, 16 Oct 2007, Matthew Dharm wrote:
>> > >
>> > > > I haven't looked at this code at all, but neither approach feels
>> > > > right to
>> > > > me.
>> > > >
>> > > > How does this work at all?  Even if you load a driver later,
>> > > > wouldn't it
>> > > > call usb_set_interface(), which would call
>> > > > usb_create_sysfs_intf_files()
>> > > > and hit the same issue?
>> > >
>> > > usb_set_interface() is smart enough to remove the old interface
>> > > files
>> > > before creating new ones, since it expects them to exist already.
>> > > Hence there's no problem in that scenario.
>> > >
>> > > But usb_set_configuration doesn't expect there to be any
>> > > pre-existing
>> > > interface files, because there isn't even an interface until the
>> > > registration is performed.
>> >
>> > And I'm guessing that you can't call usb_create_sysfs_intf_files()
>> > until
>> > registration is performed, right?
>>
>> Right.
>>
>> > > The most important reason has to do with the endpoint
>> > > pseudo-devices.
>> > > Different altsettings can have different endpoints, so those have
>> > > to be
>> > > removed and re-created whenever the altsetting changes.
>> >
>> > Right, altsettings.  I forgot about those.  I only ever think in
>> > terms of
>> > multiple configurations.
>> >
>> > *grumble*
>> >
>> > If usb_set_interface() has to be smart enough to remove existing
>> > files
>> > first already, then I guess it's reasonably symmetric to have
>> > usb_set_configuration() have the same smarts.  Maybe they can share
>> > some
>> > common code, even.
>>
>> It's not a big deal to remove the files first.  In fact, here's a
>> patch
>> to do it.  Dave, see if this doesn't fix your problem.  I don't like
>> it
>> much because it does an unnecessary remove/create cycle, but that's
>> better than doing something wrong.
>>
>> It's slightly odd that the sysfs core logs an error when you try to
>> create the same file twice but it doesn't when you try to remove a
>> non-existent file (or try to remove an existing file twice).  Oh
>> well...
>
>I used to have the 'remove a non-existant file' warning, but that just
>triggered _way_ too many responses :)
>
>
>> 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
>> @@ -1643,7 +1643,13 @@ free_interfaces:
>>                               intf->dev.bus_id, ret);
>>                       continue;
>>               }
>> -             usb_create_sysfs_intf_files (intf);
>> +
>> +             /* The driver's probe method can call
>> usb_set_interface(),
>> +              * which would mean the interface's sysfs files are
>> already
>> +              * created.  Just in case, we'll remove them first.
>> +              */
>> +             usb_remove_sysfs_intf_files(intf);
>> +             usb_create_sysfs_intf_files(intf);
>>       }
>
>If this fixes the problem, care to resend it with a signed-off-by:?
>
>Yeah, it's not the nicest solution, but I can't think of any other one
>either right now :(
Hi, greg

How about this patch (based on 2.6.24-rc1):

diff -upr linux/drivers/usb/core/message.c linux.new/drivers/usb/core/message.c
--- linux/drivers/usb/core/message.c	2007-10-25 16:41:32.000000000 +0800
+++ linux.new/drivers/usb/core/message.c	2007-10-25 16:39:38.000000000 +0800
@@ -1641,7 +1641,8 @@ free_interfaces:
 				intf->dev.bus_id, ret);
 			continue;
 		}
-		usb_create_sysfs_intf_files (intf);
+		if(!usb_sysfs_intf_exist(intf))
+			usb_create_sysfs_intf_files (intf);
 	}
 
 	usb_autosuspend_device(dev);
diff -upr linux/drivers/usb/core/sysfs.c linux.new/drivers/usb/core/sysfs.c
--- linux/drivers/usb/core/sysfs.c	2007-10-25 16:40:16.000000000 +0800
+++ linux.new/drivers/usb/core/sysfs.c	2007-10-25 16:39:32.000000000 +0800
@@ -728,6 +728,13 @@ static inline void usb_remove_intf_ep_fi
 		usb_remove_ep_files(&iface_desc->endpoint[i]);
 }
 
+int usb_sysfs_intf_exist(struct usb_interface *intf)
+{
+	struct device *dev = &intf->dev;
+	
+	return sysfs_dirent_exist(&dev->kobj, intf_attrs[0]->name);
+}
+
 int usb_create_sysfs_intf_files(struct usb_interface *intf)
 {
 	struct device *dev = &intf->dev;
diff -upr linux/drivers/usb/core/usb.h linux.new/drivers/usb/core/usb.h
--- linux/drivers/usb/core/usb.h	2007-10-25 16:41:02.000000000 +0800
+++ linux.new/drivers/usb/core/usb.h	2007-10-25 16:39:19.000000000 +0800
@@ -1,5 +1,6 @@
 /* Functions local to drivers/usb/core/ */
 
+extern int usb_sysfs_intf_exist(struct usb_interface *intf);
 extern int usb_create_sysfs_dev_files (struct usb_device *dev);
 extern void usb_remove_sysfs_dev_files (struct usb_device *dev);
 extern int usb_create_sysfs_intf_files (struct usb_interface *intf);
diff -upr linux/fs/sysfs/dir.c linux.new/fs/sysfs/dir.c
--- linux/fs/sysfs/dir.c	2007-10-25 16:40:43.000000000 +0800
+++ linux.new/fs/sysfs/dir.c	2007-10-25 16:39:00.000000000 +0800
@@ -583,6 +583,16 @@ struct sysfs_dirent *sysfs_find_dirent(s
 	return NULL;
 }
 
+int sysfs_dirent_exist(struct kobject *kobj, const unsigned char *name)
+{
+	struct sysfs_dirent *sd = kobj->sd;
+	
+	if (sysfs_find_dirent(sd, name))
+		return 1;
+	return 0;
+}
+EXPORT_SYMBOL_GPL(sysfs_dirent_exist);
+
 /**
  *	sysfs_get_dirent - find and get sysfs_dirent with the given name
  *	@parent_sd: sysfs_dirent to search under
diff -upr linux/inclue/linux/sysfs.h linux.new/inclue/linux/sysfs.h
--- linux/inclue/linux/sysfs.h	2007-10-25 16:40:02.000000000 +0800
+++ linux.new/inclue/linux/sysfs.h	2007-10-25 16:38:40.000000000 +0800
@@ -112,6 +112,8 @@ void sysfs_remove_file_from_group(struct
 
 void sysfs_notify(struct kobject *kobj, char *dir, char *attr);
 
+int sysfs_dirent_exist(struct kobject *kobj, const unsigned char *name);
+
 extern int __must_check sysfs_init(void);
 
 #else /* CONFIG_SYSFS */
@@ -211,6 +213,11 @@ static inline void sysfs_notify(struct k
 {
 }
 
+static int sysfs_dirent_exist(struct kobject *kobj, const unsigned char *name)
+{
+	return 0;
+}
+
 static inline int __must_check sysfs_init(void)
 {
 	return 0;

^ permalink raw reply	[flat|nested] 18+ messages in thread
* Re: usb+sysfs: duplicate filename 'bInterfaceNumber'
@ 2007-10-15  5:57 Dave Young
  2007-10-15 18:38 ` [linux-usb-devel] " Alan Stern
  0 siblings, 1 reply; 18+ messages in thread
From: Dave Young @ 2007-10-15  5:57 UTC (permalink / raw)
  To: bbpetkov; +Cc: linux-kernel, linux-usb-devel, Greg KH

On 10/14/07, Borislav Petkov <bbpetkov@yahoo.de> wrote:
> Hi,
>
> i get the following warning on yesterday's git tree (v2.6.23-2840-g752097c):
>
> Oct 14 09:07:15 zmei kernel: [   49.368030] sysfs: duplicate filename 'bInterfaceNumber' can not be created
> Oct 14 09:07:15 zmei kernel: [   49.368086] WARNING: at fs/sysfs/dir.c:425 sysfs_add_one()
> Oct 14 09:07:15 zmei kernel: [   49.368134]  [<c010527c>] show_trace_log_lvl+0x1a/0x2f
> Oct 14 09:07:15 zmei kernel: [   49.368220]  [<c0105da0>] show_trace+0x12/0x14
> Oct 14 09:07:15 zmei kernel: [   49.368300]  [<c0105db8>] dump_stack+0x16/0x18
> Oct 14 09:07:15 zmei kernel: [   49.368379]  [<c019f2ee>] sysfs_add_one+0x57/0xbc
> Oct 14 09:07:15 zmei kernel: [   49.368461]  [<c019edeb>] sysfs_add_file+0x49/0x71
> Oct 14 09:07:15 zmei kernel: [   49.368541]  [<c01a05c2>] sysfs_create_group+0x86/0xe8
> Oct 14 09:07:15 zmei kernel: [   49.368621]  [<c024f5da>] usb_create_sysfs_intf_files+0x27/0x9b
> Oct 14 09:07:15 zmei kernel: [   49.368704]  [<c024c28b>] usb_set_configuration+0x454/0x466
> Oct 14 09:07:15 zmei kernel: [   49.368787]  [<c0252b97>] generic_probe+0x53/0x94
> Oct 14 09:07:15 zmei kernel: [   49.368867]  [<c024d4f7>] usb_probe_device+0x35/0x3b
> Oct 14 09:07:15 zmei kernel: [   49.368947]  [<c022a46c>] driver_probe_device+0xcb/0x14f
> Oct 14 09:07:15 zmei kernel: [   49.369039]  [<c022a4f8>] __device_attach+0x8/0xa
> Oct 14 09:07:15 zmei kernel: [   49.369119]  [<c02298d5>] bus_for_each_drv+0x3b/0x63
> Oct 14 09:07:15 zmei kernel: [   49.369199]  [<c022a589>] device_attach+0x70/0x85
> Oct 14 09:07:15 zmei kernel: [   49.369279]  [<c022984c>] bus_attach_device+0x29/0x77
> Oct 14 09:07:15 zmei kernel: [   49.369359]  [<c0228abc>] device_add+0x28c/0x445
> Oct 14 09:07:15 zmei kernel: [   49.369439]  [<c0247c7a>] usb_new_device+0x44/0x82
> Oct 14 09:07:15 zmei kernel: [   49.369519]  [<c02486ec>] hub_thread+0x666/0x9c2
> Oct 14 09:07:15 zmei kernel: [   49.369598]  [<c01370e9>] kthread+0x3b/0x62
> Oct 14 09:07:15 zmei kernel: [   49.369679]  [<c0104eaf>] kernel_thread_helper+0x7/0x10
> Oct 14 09:07:15 zmei kernel: [   49.369759]  =======================
>
> The usb hub in question is named 4-1:1.0 and it has an extension connected to it
> which is used to activate the 2 usb connectors at the side of the pc's monitor.
> Correct me if i'm wrong but from what i've understood so far from reading the code,
> i think, it adds the bInterfaceNumber-file after calling usb_create_sysfs_intf_files(intf).
> However, the currently active usbhost interface alternate setting is the only one active
> so the bInterfaceNumber exists already and therefore the warning, but this is
> just a guess since i'm not that fluent in the usb internals.
Hi,
I have encountered the same problem which was  reported in
http://lkml.org/lkml/2007/9/29/45

For the first one "usbcore duplicated sysfs filename" , I have submit
a patch to fix it.

For the "bInterfaceNumber" one, I have no idea, the same problem still
exist in the latest 23-mm1 tree.


>
> .config attached.
>
> --
> Regards/Gruß,
>     Boris.
>
>

^ permalink raw reply	[flat|nested] 18+ messages in thread

end of thread, other threads:[~2007-10-26  4:43 UTC | newest]

Thread overview: 18+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2007-10-25  9:06 [linux-usb-devel] usb+sysfs: duplicate filename 'bInterfaceNumber' Dave Young
2007-10-25 18:11 ` Greg KH
2007-10-26  2:01   ` Dave Young
2007-10-26  2:42     ` Greg KH
2007-10-26  3:11       ` Dave Young
2007-10-26  3:28         ` Greg KH
2007-10-26  4:43           ` Dave Young
  -- strict thread matches above, loose matches on Subject: below --
2007-10-15  5:57 Dave Young
2007-10-15 18:38 ` [linux-usb-devel] " Alan Stern
2007-10-16  4:48   ` Greg KH
2007-10-16  5:22     ` Dave Young
2007-10-16 14:55       ` Alan Stern
2007-10-16 16:33         ` Matthew Dharm
2007-10-16 18:04           ` Alan Stern
2007-10-16 19:13             ` Matthew Dharm
2007-10-17  1:31               ` Dave Young
2007-10-17 14:48               ` Alan Stern
2007-10-18  1:52                 ` Dave Young
2007-10-18 22:48                 ` Greg KH

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox