Re: /sys/devices/system/timer registered twice

Maneesh Soni
2004-11-10T22:38:02Z

On Wed, Nov 10, 2004 at 03:25:35AM +0100, Kay Sievers wrote:
> On Tue, Nov 09, 2004 at 11:39:47AM -0800, Greg KH wrote:
> > On Tue, Nov 09, 2004 at 08:30:43PM +0100, Kay Sievers wrote:
> > > Hi,
> > > I got this on a Centrino box with the latest bk:
> > >
> > > [kay@pim linux.kay]$ ls -l /sys/devices/system/
> > > total 0
> > > drwxr-xr-x 7 root root 0 Nov 8 15:12 .
> > > drwxr-xr-x 5 root root 0 Nov 8 15:12 ..
> > > drwxr-xr-x 3 root root 0 Nov 8 15:12 cpu
> > > drwxr-xr-x 3 root root 0 Nov 8 15:12 i8259
> > > drwxr-xr-x 2 root root 0 Nov 8 15:12 ioapic
> > > drwxr-xr-x 3 root root 0 Nov 8 15:12 irqrouter
> > > ?--------- ? ? ? ? ? timer
> > >
> > >
> > > It is caused by registering two devices with the name "timer" from:
> > >
> > > arch/i386/kernel/time.c
> > > arch/i386/kernel/timers/timer_pit.c
> > >
> > > If I change one of the names, I get two correct looking sysfs entries.
> > >
> > > Greg, shouldn't the driver core prevent the corruption of the first
> > > device if another one tries to register with the same name?
> >
> > Yes, we should handle this. Can you try the patch below? I just sent
> > it to Linus, as it fixes a bug that was recently introduced.
> >
> > The second registration should fail, and this patch will make it fail,
> > and recover properly.
>
> Yes, the registration fails. But it seems that the second call to
> create_dir(kobj) with a kobject with the same name and parent corrupts
> the dentry from the first call.
>
> To test it, I just called create_dir(kobj) a second time for my video
> driver and the sysfs entry of the successful registered kobject was
> corrupted:
>
> [kay@pim ~]$ ls -la /sys/class/video4linux/
> total 0
> drwxr-xr-x 3 root root 0 Nov 10 02:53 .
> drwxr-xr-x 18 root root 0 Nov 10 02:53 ..
> ?--------- ? ? ? ? ? video0
>

Thanks for reporting this bug. I think the problem here is doing d_drop()
for the existing directory dentry in create_dir() for error case. It should
not be done for EEXIST. Could you please try the same test with the following
patch applied.

Thanks
Maneesh

o Do not release existing directory if the new directory happens to be a
duplicate directory. Thanks to Kay Sievers for the testcase.

Signed-off-by: <maneesh@in.ibm.com>
---

linux-2.6.10-rc1-bk20-maneesh/fs/sysfs/dir.c | 2 +-
1 files changed, 1 insertion(+), 1 deletion(-)

diff -puN fs/sysfs/dir.c~fix-dropping-existing-dir fs/sysfs/dir.c
--- linux-2.6.10-rc1-bk20/fs/sysfs/dir.c~fix-dropping-existing-dir 2004-11-10 16:26:14.000000000 -0600
+++ linux-2.6.10-rc1-bk20-maneesh/fs/sysfs/dir.c 2004-11-10 16:27:42.000000000 -0600
@@ -111,7 +111,7 @@ static int create_dir(struct kobject * k
d_rehash(*d);
}
}
- if (error)
+ if (error && (error != -EEXIST))
d_drop(*d);
dput(*d);
} else
_

--
Maneesh Soni
Linux Technology Center,
IBM Austin
email: maneesh@in.ibm.com
Phone: 1-512-838-1896 Fax:
T/L : 6781896