[PATCH] mknod fix for major/minor number greater than 255

Basheer, Mansoor Ahamed mansoor.ahamed at ti.com
Wed Mar 12 08:57:34 UTC 2008



Khem Raj wrote:
> 
> On Mar 11, 2008, at 11:56 PM, Basheer, Mansoor Ahamed wrote:
> 
> >
> >
> > Robert Wrote [mailto:rpjday at crashcourse.ca]
> >>
> >> On Tue, 11 Mar 2008, Khem Raj wrote:
> >>
> >>>
> >>> On Mar 11, 2008, at 11:03 PM, Basheer, Mansoor Ahamed wrote:
> >>>
> >>>> Hi,
> >>>>
> >>>> Current mknod implementation fails for major/minor number greater
> > than
> >> 255.
> >>>
> >>> is linux kernel supporting major/minor numbers greater than 255 ?
> >>
> >> the *kernel* supports major/minor numbers of bit length (12,20).
> >> it's
> >> only userspace that restricts their values to (8,8).
> >>
> >
> > Yes Robert you are right. For example USB endpoint devices use major
> > 442
> > (drivers/usb/core/endpoint.c).
> 
> >
> >
> > Also, __kernel_dev_t for ARM should be "unsigned int" and not
> > "unsigned
> > short".
> >
> > Signed-off-by: Mansoor Ahamed <mansoor.ahamed at ti.com>
> >
> > --- libc/sysdeps/linux/common/mknod.c 2008-03-11 17:43:54.000000000
> > +0530
> > +++ libc/sysdeps/linux/common/mknod.c 2008-03-11 17:45:21.000000000
> > +++ +0530
> > @@ -20,9 +20,8 @@ static inline _syscall3(int, __syscall_m  int
> > mknod(const char *path, mode_t mode, dev_t dev)  {
> >        /* We must convert the dev_t value to a __kernel_dev_t */
> > -       __kernel_dev_t k_dev;
> > +       __kernel_dev_t k_dev = (__kernel_dev_t)dev;
> >
> > -       k_dev = ((major(dev) & 0xff) << 8) | (minor(dev) & 0xff);
> >        return __syscall_mknod(path, mode, k_dev);  }
> > libc_hidden_def(mknod)
> 
> 
> OK. the change looks ok. A testcase would be good to have.
> 
> >
> >
> >
> >
> > --- libc/sysdeps/linux/arm/bits/kernel_types.h
> > +++ libc/sysdeps/linux/arm/bits/kernel_types.h
> > @@ -7,7 +7,7 @@
> > #ifndef __ARCH_ARM_POSIX_TYPES_H
> > #define __ARCH_ARM_POSIX_TYPES_H
> >
> > -typedef unsigned short         __kernel_dev_t;
> > +typedef unsigned int           __kernel_dev_t;
> > typedef unsigned long          __kernel_ino_t;
> > typedef unsigned short         __kernel_mode_t;
> > typedef unsigned short         __kernel_nlink_t;
> > @@ -31,7 +31,7 @@
> > typedef unsigned short         __kernel_old_uid_t;
> > typedef unsigned short         __kernel_old_gid_t;
> > typedef long long              __kernel_loff_t;
> > -typedef __kernel_dev_t         __kernel_old_dev_t;
> > +typedef unsigned short         __kernel_old_dev_t;
> >
> 
> This also looks ok.
> 
> > typedef struct {
> > #ifdef __USE_ALL
> >

How do I provide the test application? I should register for svn
developer access or attach the test application in an email?

-Mansoor





More information about the uClibc mailing list