This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
Re: [2.24 PATCH 2/3] Minimize sysdeps code involved in defining major/minor/makedev.
- From: Carlos O'Donell <carlos at redhat dot com>
- To: Zack Weinberg <zackw at panix dot com>, libc-alpha at sourceware dot org
- Cc: adhemerval dot zanella at linaro dot org, vapier at gentoo dot org
- Date: Mon, 1 Aug 2016 16:55:06 -0400
- Subject: Re: [2.24 PATCH 2/3] Minimize sysdeps code involved in defining major/minor/makedev.
- Authentication-results: sourceware.org; auth=none
- References: <cover.1469994984.git.zackw@panix.com> <f8c0d2303f58584f353d8c0dcc484c1ff911c299.1469994984.git.zackw@panix.com>
On 07/31/2016 04:09 PM, Zack Weinberg wrote:
> Presently sys/sysmacros.h is entirely defined in sysdeps. This would
> mean that the deprecation logic coming up in the next patch would have
> to be written twice (in generic/ and unix/sysv/linux/). To avoid that,
> hoist all but the unavoidably system-dependent logic to misc/, leaving a
> bits/ header behind. This also promotes the Linux-specific encoding of
> dev_t, which accommodates 32-bit major and minor numbers in a 64-bit dev_t,
> to generic, as glibc's dev_t is always 64 bits wide.
>
> The former Linux implementation used inline functions to avoid evaluating
> arguments more than once. After this change, all platforms use inline
> functions, which means that three new symbols are added to the generic ABI.
> Since NaCl is the only non-Linux port currently in the tree, the only
> libc.abilist file that requires a change is arm/nacl/libc.abilist.
>
> New ports henceforth need only provide a bits/sysmacros.h defining
> internal macros __SYSMACROS_{DECLARE,DEFINE}_{MAJOR,MINOR,MAKEDEV}.
>
> While I was at it, I added a basic round-trip test for these functions.
(1) Inclusion in 2.25?
I have already made comments that I think we need to put this into 2.25
at this late stage. If you can answer (3) I can commit this immeidately
once 2.25 opens.
(2) Testing?
Awesome test.
(3) New symbols?
Overall this looks good. I have only questions about why the new functions
are going into the users namespace. Traditionally we put things into the
implementation namespace, particularly to discourage users calling the
functions directly. I would like the user to use the normal interfaces for
calling this functionality.
> ChangeLog:
>
> * sysdeps/generic/sys/sysmacros.h: Delete file.
> * sysdeps/unix/sysv/linux/makedev.c: Delete file.
> * sysdeps/unix/sysv/linux/sys/sysmacros.h: Move file ...
> * bits/sysmacros.h: ... here; this encoding is now the generic
> encoding. Now defines only the following macros:
> __SYSMACROS_DECLARE_MAJOR, __SYSMACROS_DEFINE_MAJOR,
> __SYSMACROS_DECLARE_MINOR, __SYSMACROS_DEFINE_MINOR,
> __SYSMACROS_DECLARE_MAKEDEV, __SYSMACROS_DEFINE_MAKEDEV.
>
> * misc/sys/sysmacros.h, misc/makedev.c: New files that use
> bits/sysmacros.h and the above new macros to generate the
> public implementations of major, minor, and makedev.
> * misc/tst-makedev.c: New test.
> * include/sys/sysmacros.h: New wrapper.
>
> * misc/Makefile (headers): Add sys/sysmacros.h, bits/sysmacros.h.
> (routines): Add makedev.
> (tests): Add tst-makedev.
> * misc/Versions [GLIBC_2.24]: Add gnu_dev_major, gnu_dev_minor,
> gnu_dev_makedev.
> * posix/Makefile (headers): Remove sys/sysmacros.h.
> * sysdeps/unix/sysv/linux/Makefile (sysdep_routines): Remove makedev.
>
> * sysdeps/arm/nacl/libc.abilist: Add GLIBC_2.24,
> gnu_dev_major, gnu_dev_makedev, gnu_dev_minor.
> ---
> bits/sysmacros.h | 74 +++++++++++++++++++++++
> include/sys/sysmacros.h | 1 +
> misc/Makefile | 7 ++-
> misc/Versions | 3 +
> misc/makedev.c | 30 +++++++++
> misc/sys/sysmacros.h | 64 ++++++++++++++++++++
> misc/tst-makedev.c | 104 ++++++++++++++++++++++++++++++++
> posix/Makefile | 2 +-
> sysdeps/arm/nacl/libc.abilist | 4 ++
> sysdeps/generic/sys/sysmacros.h | 30 ---------
> sysdeps/unix/sysv/linux/Makefile | 2 +-
> sysdeps/unix/sysv/linux/makedev.c | 40 ------------
> sysdeps/unix/sysv/linux/sys/sysmacros.h | 65 --------------------
> 13 files changed, 286 insertions(+), 140 deletions(-)
> create mode 100644 bits/sysmacros.h
> create mode 100644 include/sys/sysmacros.h
> create mode 100644 misc/makedev.c
> create mode 100644 misc/sys/sysmacros.h
> create mode 100644 misc/tst-makedev.c
> delete mode 100644 sysdeps/generic/sys/sysmacros.h
> delete mode 100644 sysdeps/unix/sysv/linux/makedev.c
> delete mode 100644 sysdeps/unix/sysv/linux/sys/sysmacros.h
>
> diff --git a/bits/sysmacros.h b/bits/sysmacros.h
> new file mode 100644
> index 0000000..e2c0bc2
> --- /dev/null
> +++ b/bits/sysmacros.h
> @@ -0,0 +1,74 @@
> +/* Definitions of macros to access `dev_t' values.
> + Copyright (C) 1996-2016 Free Software Foundation, Inc.
> + This file is part of the GNU C Library.
> +
> + The GNU C Library is free software; you can redistribute it and/or
> + modify it under the terms of the GNU Lesser General Public
> + License as published by the Free Software Foundation; either
> + version 2.1 of the License, or (at your option) any later version.
> +
> + The GNU C Library is distributed in the hope that it will be useful,
> + but WITHOUT ANY WARRANTY; without even the implied warranty of
> + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
> + Lesser General Public License for more details.
> +
> + You should have received a copy of the GNU Lesser General Public
> + License along with the GNU C Library; if not, see
> + <http://www.gnu.org/licenses/>. */
> +
> +#ifndef _BITS_SYSMACROS_H
> +#define _BITS_SYSMACROS_H 1
> +
> +#ifndef _SYS_SYSMACROS_H
> +# error "Never include <bits/sysmacros.h> directly; use <sys/sysmacros.h> instead."
> +#endif
> +
> +/* dev_t in glibc is a 64-bit quantity, with 32-bit major and minor numbers.
> + Our default encoding is MMMM Mmmm mmmM MMmm, where M is a hex digit of
> + the major number and m is a hex digit of the minor number. This is
> + downward compatible with legacy systems where dev_t is 16 bits wide,
> + encoded as MMmm. It is also downward compatible with the Linux kernel,
> + which (as of 2016) uses 32-bit dev_t, encoded as mmmM MMmm.
> +
> + Systems that use an incompatible encoding for dev_t should override this
> + file in the appropriate sysdeps subdirectory. */
> +
> +#define __SYSMACROS_DECLARE_MAJOR(DECL_TEMPL) \
> + DECL_TEMPL(unsigned int, major, (__dev_t __dev))
> +
> +#define __SYSMACROS_DEFINE_MAJOR(DECL_TEMPL) \
> + __SYSMACROS_DECLARE_MAJOR (DECL_TEMPL) \
> + { \
> + unsigned int __major; \
> + __major = ((__dev & (__dev_t) 0x00000000000fff00u) >> 8); \
> + __major |= ((__dev & (__dev_t) 0xfffff00000000000u) >> 32); \
OK.
> + return __major; \
> + }
> +
> +#define __SYSMACROS_DECLARE_MINOR(DECL_TEMPL) \
> + DECL_TEMPL(unsigned int, minor, (__dev_t __dev))
> +
> +#define __SYSMACROS_DEFINE_MINOR(DECL_TEMPL) \
> + __SYSMACROS_DECLARE_MINOR (DECL_TEMPL) \
> + { \
> + unsigned int __minor; \
> + __minor = ((__dev & (__dev_t) 0x00000000000000ffu) >> 0); \
> + __minor |= ((__dev & (__dev_t) 0x00000ffffff00000u) >> 12); \
OK.
> + return __minor; \
> + }
> +
> +#define __SYSMACROS_DECLARE_MAKEDEV(DECL_TEMPL) \
> + DECL_TEMPL(__dev_t, makedev, (unsigned int __major, unsigned int __minor))
> +
> +#define __SYSMACROS_DEFINE_MAKEDEV(DECL_TEMPL) \
> + __SYSMACROS_DECLARE_MAKEDEV (DECL_TEMPL) \
> + { \
> + __dev_t __dev; \
> + __dev = (((__dev_t) (__major & 0x00000fffu)) << 8); \
> + __dev |= (((__dev_t) (__major & 0xfffff000u)) << 32); \
> + __dev |= (((__dev_t) (__minor & 0x000000ffu)) << 0); \
> + __dev |= (((__dev_t) (__minor & 0xffffff00u)) << 12); \
OK.
> - return ((minor & 0xff) | ((major & 0xfff) << 8)
> - | (((unsigned long long int) (minor & ~0xff)) << 12)
> - | (((unsigned long long int) (major & ~0xfff)) << 32));
OK. Verified matches the old code.
> + return __dev; \
> + }
> +
> +#endif /* bits/sysmacros.h */
> diff --git a/include/sys/sysmacros.h b/include/sys/sysmacros.h
> new file mode 100644
> index 0000000..87813c5
> --- /dev/null
> +++ b/include/sys/sysmacros.h
> @@ -0,0 +1 @@
> +#include <misc/sys/sysmacros.h>
> diff --git a/misc/Makefile b/misc/Makefile
> index 56e20ce..3d2ebb8 100644
> --- a/misc/Makefile
> +++ b/misc/Makefile
> @@ -34,7 +34,8 @@ headers := sys/uio.h bits/uio.h sys/ioctl.h bits/ioctls.h bits/ioctl-types.h \
> regexp.h bits/select.h bits/mman.h sys/xattr.h \
> syslog.h sys/syslog.h \
> bits/syslog.h bits/syslog-ldbl.h bits/syslog-path.h bits/error.h \
> - bits/select2.h bits/hwcap.h sys/auxv.h
> + bits/select2.h bits/hwcap.h sys/auxv.h \
> + sys/sysmacros.h bits/sysmacros.h
OK.
>
> routines := brk sbrk sstk ioctl \
> readv writev preadv preadv64 pwritev pwritev64 \
> @@ -67,7 +68,7 @@ routines := brk sbrk sstk ioctl \
> getloadavg getclktck \
> fgetxattr flistxattr fremovexattr fsetxattr getxattr \
> listxattr lgetxattr llistxattr lremovexattr lsetxattr \
> - removexattr setxattr getauxval ifunc-impl-list
> + removexattr setxattr getauxval ifunc-impl-list makedev
OK.
>
> generated += tst-error1.mtrace tst-error1-mem.out
>
> @@ -78,7 +79,7 @@ gpl2lgpl := error.c error.h
> tests := tst-dirname tst-tsearch tst-fdset tst-efgcvt tst-mntent tst-hsearch \
> tst-error1 tst-pselect tst-insremque tst-mntent2 bug-hsearch1 \
> tst-mntent-blank-corrupt tst-mntent-blank-passno bug18240 \
> - tst-preadvwritev tst-preadvwritev64
> + tst-preadvwritev tst-preadvwritev64 tst-makedev
OK.
> ifeq ($(run-built-tests),yes)
> tests-special += $(objpfx)tst-error1-mem.out
> endif
> diff --git a/misc/Versions b/misc/Versions
> index 671f487..afa22bd 100644
> --- a/misc/Versions
> +++ b/misc/Versions
> @@ -152,6 +152,9 @@ libc {
> GLIBC_2.23 {
> # SHLIB_COMPAT(GLIBC_2_0, GLIBC_2_23) used in regexp.c
> }
> + GLIBC_2.24 {
> + gnu_dev_major; gnu_dev_minor; gnu_dev_makedev;
> + }
Not OK.
Traditionally I thought we hid internal functions like this in the
implemetnation namespace to avoid the suggestion that users could call
them directly. In this case they can, but still, it's a user namespace.
Why do we put these in the user namespace?
> GLIBC_PRIVATE {
> __madvise;
> __mktemp;
> diff --git a/misc/makedev.c b/misc/makedev.c
> new file mode 100644
> index 0000000..7303fb6
> --- /dev/null
> +++ b/misc/makedev.c
> @@ -0,0 +1,30 @@
> +/* Definitions of functions to access `dev_t' values.
> + Copyright (C) 2003-2016 Free Software Foundation, Inc.
> + This file is part of the GNU C Library.
> +
> + The GNU C Library is free software; you can redistribute it and/or
> + modify it under the terms of the GNU Lesser General Public
> + License as published by the Free Software Foundation; either
> + version 2.1 of the License, or (at your option) any later version.
> +
> + The GNU C Library is distributed in the hope that it will be useful,
> + but WITHOUT ANY WARRANTY; without even the implied warranty of
> + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
> + Lesser General Public License for more details.
> +
> + You should have received a copy of the GNU Lesser General Public
> + License along with the GNU C Library; if not, see
> + <http://www.gnu.org/licenses/>. */
> +
> +#include <features.h>
> +
> +#undef __USE_EXTERN_INLINES
> +#define __SYSMACROS_NEED_IMPLEMENTATION
> +#include <sys/sysmacros.h>
> +
> +#define OUT_OF_LINE_IMPL_TEMPL(rtype, name, proto) \
> + rtype gnu_dev_##name proto
> +
> +__SYSMACROS_DEFINE_MAJOR(OUT_OF_LINE_IMPL_TEMPL)
> +__SYSMACROS_DEFINE_MINOR(OUT_OF_LINE_IMPL_TEMPL)
> +__SYSMACROS_DEFINE_MAKEDEV(OUT_OF_LINE_IMPL_TEMPL)
OK.
> diff --git a/misc/sys/sysmacros.h b/misc/sys/sysmacros.h
> new file mode 100644
> index 0000000..dc2eb83
> --- /dev/null
> +++ b/misc/sys/sysmacros.h
> @@ -0,0 +1,64 @@
> +/* Definitions of macros to access `dev_t' values.
> + Copyright (C) 1996-2015 Free Software Foundation, Inc.
> + This file is part of the GNU C Library.
> +
> + The GNU C Library is free software; you can redistribute it and/or
> + modify it under the terms of the GNU Lesser General Public
> + License as published by the Free Software Foundation; either
> + version 2.1 of the License, or (at your option) any later version.
> +
> + The GNU C Library is distributed in the hope that it will be useful,
> + but WITHOUT ANY WARRANTY; without even the implied warranty of
> + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
> + Lesser General Public License for more details.
> +
> + You should have received a copy of the GNU Lesser General Public
> + License along with the GNU C Library; if not, see
> + <http://www.gnu.org/licenses/>. */
> +
> +#ifndef _SYS_SYSMACROS_H
> +#define _SYS_SYSMACROS_H 1
> +
> +#include <features.h>
> +#include <bits/types.h>
> +#include <bits/sysmacros.h>
> +
> +#define __SYSMACROS_DECL_TEMPL(rtype, name, proto) \
> + extern rtype gnu_dev_##name proto __THROW __attribute_const__;
> +
> +#define __SYSMACROS_IMPL_TEMPL(rtype, name, proto) \
> + __extension__ __extern_inline __attribute_const__ rtype \
> + __NTH (gnu_dev_##name proto)
> +
> +__BEGIN_DECLS
> +
> +__SYSMACROS_DECLARE_MAJOR (__SYSMACROS_DECL_TEMPL)
> +__SYSMACROS_DECLARE_MINOR (__SYSMACROS_DECL_TEMPL)
> +__SYSMACROS_DECLARE_MAKEDEV (__SYSMACROS_DECL_TEMPL)
> +
> +#ifdef __USE_EXTERN_INLINES
> +
> +__SYSMACROS_DEFINE_MAJOR (__SYSMACROS_IMPL_TEMPL)
> +__SYSMACROS_DEFINE_MINOR (__SYSMACROS_IMPL_TEMPL)
> +__SYSMACROS_DEFINE_MAKEDEV (__SYSMACROS_IMPL_TEMPL)
> +
> +#endif
> +
> +__END_DECLS
> +
> +#ifndef __SYSMACROS_NEED_IMPLEMENTATION
> +# undef __SYSMACROS_DECL_TEMPL
> +# undef __SYSMACROS_IMPL_TEMPL
> +# undef __SYSMACROS_DECLARE_MAJOR
> +# undef __SYSMACROS_DECLARE_MINOR
> +# undef __SYSMACROS_DECLARE_MAKEDEV
> +# undef __SYSMACROS_DEFINE_MAJOR
> +# undef __SYSMACROS_DEFINE_MINOR
> +# undef __SYSMACROS_DEFINE_MAKEDEV
> +#endif
> +
> +#define major(dev) gnu_dev_major (dev)
> +#define minor(dev) gnu_dev_minor (dev)
> +#define makedev(maj, min) gnu_dev_makedev (maj, min)
> +
> +#endif /* sys/sysmacros.h */
OK.
> diff --git a/misc/tst-makedev.c b/misc/tst-makedev.c
> new file mode 100644
> index 0000000..b330b5a
> --- /dev/null
> +++ b/misc/tst-makedev.c
> @@ -0,0 +1,104 @@
> +/* Tests of functions to access `dev_t' values.
> + Copyright (C) 2016 Free Software Foundation, Inc.
> + This file is part of the GNU C Library.
> +
> + The GNU C Library is free software; you can redistribute it and/or
> + modify it under the terms of the GNU Lesser General Public
> + License as published by the Free Software Foundation; either
> + version 2.1 of the License, or (at your option) any later version.
> +
> + The GNU C Library is distributed in the hope that it will be useful,
> + but WITHOUT ANY WARRANTY; without even the implied warranty of
> + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
> + Lesser General Public License for more details.
> +
> + You should have received a copy of the GNU Lesser General Public
> + License along with the GNU C Library; if not, see
> + <http://www.gnu.org/licenses/>. */
> +
> +#include <sys/types.h>
> +#include <sys/sysmacros.h>
> +#include <stdio.h>
> +#include <inttypes.h>
> +
> +/* Confirm that makedev (major (d), minor (d)) == d. */
> +static int
> +do_test_split_combine (dev_t d1)
> +{
> + unsigned int maj = major (d1);
> + unsigned int min = minor (d1);
> + dev_t d2 = makedev (maj, min);
> + if (d1 != d2)
> + {
> + printf ("FAIL: %016" PRIx64 " != %016" PRIx64 " (maj %08x min %08x)\n",
> + (uint64_t)d2, (uint64_t)d1, maj, min);
> + return 1;
> + }
> + else
> + return 0;
> +}
> +
> +/* Confirm that major (makedev (maj, min)) == maj and
> + minor (makedev (maj, min)) == min. */
> +static int
> +do_test_combine_split (unsigned int maj1, unsigned int min1)
> +{
> + dev_t d = makedev (maj1, min1);
> + unsigned int maj2 = major (d);
> + unsigned int min2 = minor (d);
> + if (maj1 != maj2 && min1 != min2)
> + {
> + printf ("FAIL: %08x != %08x, %08x != %08x (dev %016" PRIx64 ")\n",
> + maj2, maj1, min2, min1, (uint64_t)d);
> + return 1;
> + }
> + else if (maj1 != maj2)
> + {
> + printf ("FAIL: %08x != %08x, %08x == %08x (dev %016" PRIx64 ")\n",
> + maj2, maj1, min2, min1, (uint64_t)d);
> + return 1;
> + }
> + else if (min1 != min2)
> + {
> + printf ("FAIL: %08x == %08x, %08x != %08x (dev %016" PRIx64 ")\n",
> + maj2, maj1, min2, min1, (uint64_t)d);
> + return 1;
> + }
> + else
> + return 0;
> +}
> +
> +static int
> +do_test (void)
> +{
> + dev_t d;
> + unsigned int maj, min;
> + int status = 0;
> +
> + /* Test the traditional range (16-bit dev_t, 8-bit each maj/min)
> + exhaustively. */
> + for (d = 0; d <= 0xFFFF; d++)
> + status |= do_test_split_combine (d);
Awesome. Belt-and-suspenders :-)
> +
> + for (maj = 0; maj <= 0xFF; maj++)
> + for (min = 0; min <= 0xFF; min++)
> + status |= do_test_combine_split (maj, min);
> +
> + /* Test glibc's expanded range (64-bit dev_t, 32-bit each maj/min).
> + Exhaustive testing would take much too long, instead we shift a
> + pair of 1-bits over each range. */
Awesome compromise.
> + {
> + unsigned int a, b;
> + for (a = 0; a <= 63; a++)
> + do_test_split_combine (((dev_t) 0x03) << a);
> +
> + for (a = 0; a < 31; a++)
> + for (b = 0; b <= 31; b++)
> + do_test_combine_split (0x03u << a, 0x03u << b);
> + }
> +
> + return status;
> +}
> +
> +#define TEST_FUNCTION do_test ()
> +#include "../test-skeleton.c"
> diff --git a/posix/Makefile b/posix/Makefile
> index 5b0e298..3a7719e 100644
> --- a/posix/Makefile
> +++ b/posix/Makefile
> @@ -29,7 +29,7 @@ headers := sys/utsname.h sys/times.h sys/wait.h sys/types.h unistd.h \
> bits/local_lim.h tar.h bits/utsname.h bits/confname.h \
> bits/waitflags.h bits/waitstatus.h sys/unistd.h sched.h \
> bits/sched.h re_comp.h wait.h bits/environments.h cpio.h \
> - sys/sysmacros.h spawn.h bits/unistd.h
> + spawn.h bits/unistd.h
OK.
>
> routines := \
> uname \
> diff --git a/sysdeps/arm/nacl/libc.abilist b/sysdeps/arm/nacl/libc.abilist
> index 2f7751d..87b7139 100644
> --- a/sysdeps/arm/nacl/libc.abilist
> +++ b/sysdeps/arm/nacl/libc.abilist
> @@ -1840,4 +1840,8 @@ GLIBC_2.23 fts64_close F
> GLIBC_2.23 fts64_open F
> GLIBC_2.23 fts64_read F
> GLIBC_2.23 fts64_set F
> +GLIBC_2.24 GLIBC_2.24 A
> GLIBC_2.24 quick_exit F
> +GLIBC_2.24 gnu_dev_major F
> +GLIBC_2.24 gnu_dev_makedev F
> +GLIBC_2.24 gnu_dev_minor F
As discussed about, why not __gnu_dev_major etc. ?
> diff --git a/sysdeps/generic/sys/sysmacros.h b/sysdeps/generic/sys/sysmacros.h
> deleted file mode 100644
> index 4cc5961..0000000
> --- a/sysdeps/generic/sys/sysmacros.h
> +++ /dev/null
> @@ -1,30 +0,0 @@
> -/* Definitions of macros to access `dev_t' values.
> - Copyright (C) 1996-2016 Free Software Foundation, Inc.
> - This file is part of the GNU C Library.
> -
> - The GNU C Library is free software; you can redistribute it and/or
> - modify it under the terms of the GNU Lesser General Public
> - License as published by the Free Software Foundation; either
> - version 2.1 of the License, or (at your option) any later version.
> -
> - The GNU C Library is distributed in the hope that it will be useful,
> - but WITHOUT ANY WARRANTY; without even the implied warranty of
> - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
> - Lesser General Public License for more details.
> -
> - You should have received a copy of the GNU Lesser General Public
> - License along with the GNU C Library; if not, see
> - <http://www.gnu.org/licenses/>. */
> -
> -#ifndef _SYS_SYSMACROS_H
> -#define _SYS_SYSMACROS_H 1
> -
> -/* For compatibility we provide alternative names.
> -
> - The problem here is that compilers other than GCC probably don't
> - have the `long long' type and so `dev_t' is actually an array. */
> -#define major(dev) ((int)(((unsigned int) (dev) >> 8) & 0xff))
> -#define minor(dev) ((int)((dev) & 0xff))
> -#define makedev(major, minor) (((major) << 8) | (minor))
> -
> -#endif /* sys/sysmacros.h */
OK.
> diff --git a/sysdeps/unix/sysv/linux/Makefile b/sysdeps/unix/sysv/linux/Makefile
> index 35e1ed4..f0b052d 100644
> --- a/sysdeps/unix/sysv/linux/Makefile
> +++ b/sysdeps/unix/sysv/linux/Makefile
> @@ -15,7 +15,7 @@ ifeq ($(subdir),misc)
> include $(firstword $(wildcard $(sysdirs:=/sysctl.mk)))
>
> sysdep_routines += clone llseek umount umount2 readahead \
> - setfsuid setfsgid makedev epoll_pwait signalfd \
> + setfsuid setfsgid epoll_pwait signalfd \
OK.
> eventfd eventfd_read eventfd_write prlimit \
> personality
>
> diff --git a/sysdeps/unix/sysv/linux/makedev.c b/sysdeps/unix/sysv/linux/makedev.c
> deleted file mode 100644
> index 68c18ca..0000000
> --- a/sysdeps/unix/sysv/linux/makedev.c
> +++ /dev/null
> @@ -1,40 +0,0 @@
> -/* Definitions of functions to access `dev_t' values.
> - Copyright (C) 2003-2016 Free Software Foundation, Inc.
> - This file is part of the GNU C Library.
> -
> - The GNU C Library is free software; you can redistribute it and/or
> - modify it under the terms of the GNU Lesser General Public
> - License as published by the Free Software Foundation; either
> - version 2.1 of the License, or (at your option) any later version.
> -
> - The GNU C Library is distributed in the hope that it will be useful,
> - but WITHOUT ANY WARRANTY; without even the implied warranty of
> - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
> - Lesser General Public License for more details.
> -
> - You should have received a copy of the GNU Lesser General Public
> - License along with the GNU C Library; if not, see
> - <http://www.gnu.org/licenses/>. */
> -
> -#include <endian.h>
> -#include <sys/sysmacros.h>
> -
> -unsigned int
> -gnu_dev_major (unsigned long long int dev)
> -{
> - return ((dev >> 8) & 0xfff) | ((unsigned int) (dev >> 32) & ~0xfff);
> -}
> -
> -unsigned int
> -gnu_dev_minor (unsigned long long int dev)
> -{
> - return (dev & 0xff) | ((unsigned int) (dev >> 12) & ~0xff);
> -}
> -
> -unsigned long long int
> -gnu_dev_makedev (unsigned int major, unsigned int minor)
> -{
> - return ((minor & 0xff) | ((major & 0xfff) << 8)
> - | (((unsigned long long int) (minor & ~0xff)) << 12)
> - | (((unsigned long long int) (major & ~0xfff)) << 32));
> -}
OK.
> diff --git a/sysdeps/unix/sysv/linux/sys/sysmacros.h b/sysdeps/unix/sysv/linux/sys/sysmacros.h
> deleted file mode 100644
> index 4c4a697..0000000
> --- a/sysdeps/unix/sysv/linux/sys/sysmacros.h
> +++ /dev/null
> @@ -1,65 +0,0 @@
> -/* Definitions of macros to access `dev_t' values.
> - Copyright (C) 1996-2016 Free Software Foundation, Inc.
> - This file is part of the GNU C Library.
> -
> - The GNU C Library is free software; you can redistribute it and/or
> - modify it under the terms of the GNU Lesser General Public
> - License as published by the Free Software Foundation; either
> - version 2.1 of the License, or (at your option) any later version.
> -
> - The GNU C Library is distributed in the hope that it will be useful,
> - but WITHOUT ANY WARRANTY; without even the implied warranty of
> - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
> - Lesser General Public License for more details.
> -
> - You should have received a copy of the GNU Lesser General Public
> - License along with the GNU C Library; if not, see
> - <http://www.gnu.org/licenses/>. */
> -
> -#ifndef _SYS_SYSMACROS_H
> -#define _SYS_SYSMACROS_H 1
> -
> -#include <features.h>
> -
> -__BEGIN_DECLS
> -
> -__extension__
> -extern unsigned int gnu_dev_major (unsigned long long int __dev)
> - __THROW __attribute_const__;
> -__extension__
> -extern unsigned int gnu_dev_minor (unsigned long long int __dev)
> - __THROW __attribute_const__;
> -__extension__
> -extern unsigned long long int gnu_dev_makedev (unsigned int __major,
> - unsigned int __minor)
> - __THROW __attribute_const__;
> -
> -#ifdef __USE_EXTERN_INLINES
> -__extension__ __extern_inline __attribute_const__ unsigned int
> -__NTH (gnu_dev_major (unsigned long long int __dev))
> -{
> - return ((__dev >> 8) & 0xfff) | ((unsigned int) (__dev >> 32) & ~0xfff);
> -}
> -
> -__extension__ __extern_inline __attribute_const__ unsigned int
> -__NTH (gnu_dev_minor (unsigned long long int __dev))
> -{
> - return (__dev & 0xff) | ((unsigned int) (__dev >> 12) & ~0xff);
> -}
> -
> -__extension__ __extern_inline __attribute_const__ unsigned long long int
> -__NTH (gnu_dev_makedev (unsigned int __major, unsigned int __minor))
> -{
> - return ((__minor & 0xff) | ((__major & 0xfff) << 8)
> - | (((unsigned long long int) (__minor & ~0xff)) << 12)
> - | (((unsigned long long int) (__major & ~0xfff)) << 32));
> -}
> -#endif
> -__END_DECLS
> -
> -/* Access the functions with their traditional names. */
> -#define major(dev) gnu_dev_major (dev)
> -#define minor(dev) gnu_dev_minor (dev)
> -#define makedev(maj, min) gnu_dev_makedev (maj, min)
> -
> -#endif /* sys/sysmacros.h */
OK.
--
Cheers,
Carlos.