[4/5] Consolidate Linux fcntl implementation

Message ID 1495563960-669-5-git-send-email-adhemerval.zanella@linaro.org
State Dropped
Headers

Commit Message

Adhemerval Zanella Netto May 23, 2017, 6:25 p.m. UTC
  This patch consolidates the fcntl Linux syscall generation on
sysdeps/unix/sysv/linux/fcntl.c.  It basically removes all the
architecture define implementations.

Checked on i686-linux-gnu, x86_64-linux-gnu, x86_64-linux-gnux32,
aarch64-linux-gnu, arm-linux-gnueabihf, and powerpc64le-linux-gnu.

I also did a sanity check with fcntl tests from LTP to check for
possible issue on the aforementioned architectures.

	* sysdeps/unix/sysv/linux/arm/fcntl.c: Remove file.
	* sysdeps/unix/sysv/linux/generic/wordsize-32/fcntl.c: Likewise.
	* sysdeps/unix/sysv/linux/hppa/fcntl.c: Likewise.
	* sysdeps/unix/sysv/linux/i386/fcntl.c: Likewise.
	* sysdeps/unix/sysv/linux/m68k/fcntl.c: Likewise.
	* sysdeps/unix/sysv/linux/microblaze/fcntl.c: Likewise.
	* sysdeps/unix/sysv/linux/mips/mips32/fcntl.c: Likewise.
	* sysdeps/unix/sysv/linux/mips/mips64/n32/fcntl.c: Likewise.
	* sysdeps/unix/sysv/linux/powerpc/powerpc32/fcntl.c: Likewise.
	* sysdeps/unix/sysv/linux/s390/s390-32/fcntl.c: Likewise.
	* sysdeps/unix/sysv/linux/sh/fcntl.c: Likewise.
	* sysdeps/unix/sysv/linux/sparc/sparc32/fcntl.c: Likewise.
	* sysdeps/unix/sysv/linux/fcntl.c: New file.
	* sysdeps/unix/sysv/linux/powerpc/powerpc64/fcntl.c: Refactor to
	use default implementation.
---
 ChangeLog                                          | 16 ++++
 sysdeps/unix/sysv/linux/arm/fcntl.c                |  1 -
 sysdeps/unix/sysv/linux/fcntl.c                    | 52 ++++++-------
 .../unix/sysv/linux/generic/wordsize-32/fcntl.c    | 86 ----------------------
 sysdeps/unix/sysv/linux/hppa/fcntl.c               |  1 -
 sysdeps/unix/sysv/linux/i386/fcntl.c               | 61 ---------------
 sysdeps/unix/sysv/linux/m68k/fcntl.c               |  1 -
 sysdeps/unix/sysv/linux/microblaze/fcntl.c         |  1 -
 sysdeps/unix/sysv/linux/mips/mips32/fcntl.c        |  1 -
 sysdeps/unix/sysv/linux/mips/mips64/n32/fcntl.c    |  1 -
 sysdeps/unix/sysv/linux/powerpc/powerpc32/fcntl.c  |  1 -
 sysdeps/unix/sysv/linux/powerpc/powerpc64/fcntl.c  | 49 ++----------
 sysdeps/unix/sysv/linux/s390/s390-32/fcntl.c       |  1 -
 sysdeps/unix/sysv/linux/sh/fcntl.c                 |  1 -
 sysdeps/unix/sysv/linux/sparc/sparc32/fcntl.c      |  1 -
 15 files changed, 50 insertions(+), 224 deletions(-)
 delete mode 100644 sysdeps/unix/sysv/linux/arm/fcntl.c
 delete mode 100644 sysdeps/unix/sysv/linux/generic/wordsize-32/fcntl.c
 delete mode 100644 sysdeps/unix/sysv/linux/hppa/fcntl.c
 delete mode 100644 sysdeps/unix/sysv/linux/i386/fcntl.c
 delete mode 100644 sysdeps/unix/sysv/linux/m68k/fcntl.c
 delete mode 100644 sysdeps/unix/sysv/linux/microblaze/fcntl.c
 delete mode 100644 sysdeps/unix/sysv/linux/mips/mips32/fcntl.c
 delete mode 100644 sysdeps/unix/sysv/linux/mips/mips64/n32/fcntl.c
 delete mode 100644 sysdeps/unix/sysv/linux/powerpc/powerpc32/fcntl.c
 delete mode 100644 sysdeps/unix/sysv/linux/s390/s390-32/fcntl.c
 delete mode 100644 sysdeps/unix/sysv/linux/sh/fcntl.c
 delete mode 100644 sysdeps/unix/sysv/linux/sparc/sparc32/fcntl.c
  

Comments

Adhemerval Zanella Netto June 29, 2017, 2:15 p.m. UTC | #1
Ping.

On 23/05/2017 15:25, Adhemerval Zanella wrote:
> This patch consolidates the fcntl Linux syscall generation on
> sysdeps/unix/sysv/linux/fcntl.c.  It basically removes all the
> architecture define implementations.
> 
> Checked on i686-linux-gnu, x86_64-linux-gnu, x86_64-linux-gnux32,
> aarch64-linux-gnu, arm-linux-gnueabihf, and powerpc64le-linux-gnu.
> 
> I also did a sanity check with fcntl tests from LTP to check for
> possible issue on the aforementioned architectures.
> 
> 	* sysdeps/unix/sysv/linux/arm/fcntl.c: Remove file.
> 	* sysdeps/unix/sysv/linux/generic/wordsize-32/fcntl.c: Likewise.
> 	* sysdeps/unix/sysv/linux/hppa/fcntl.c: Likewise.
> 	* sysdeps/unix/sysv/linux/i386/fcntl.c: Likewise.
> 	* sysdeps/unix/sysv/linux/m68k/fcntl.c: Likewise.
> 	* sysdeps/unix/sysv/linux/microblaze/fcntl.c: Likewise.
> 	* sysdeps/unix/sysv/linux/mips/mips32/fcntl.c: Likewise.
> 	* sysdeps/unix/sysv/linux/mips/mips64/n32/fcntl.c: Likewise.
> 	* sysdeps/unix/sysv/linux/powerpc/powerpc32/fcntl.c: Likewise.
> 	* sysdeps/unix/sysv/linux/s390/s390-32/fcntl.c: Likewise.
> 	* sysdeps/unix/sysv/linux/sh/fcntl.c: Likewise.
> 	* sysdeps/unix/sysv/linux/sparc/sparc32/fcntl.c: Likewise.
> 	* sysdeps/unix/sysv/linux/fcntl.c: New file.
> 	* sysdeps/unix/sysv/linux/powerpc/powerpc64/fcntl.c: Refactor to
> 	use default implementation.
> ---
>  ChangeLog                                          | 16 ++++
>  sysdeps/unix/sysv/linux/arm/fcntl.c                |  1 -
>  sysdeps/unix/sysv/linux/fcntl.c                    | 52 ++++++-------
>  .../unix/sysv/linux/generic/wordsize-32/fcntl.c    | 86 ----------------------
>  sysdeps/unix/sysv/linux/hppa/fcntl.c               |  1 -
>  sysdeps/unix/sysv/linux/i386/fcntl.c               | 61 ---------------
>  sysdeps/unix/sysv/linux/m68k/fcntl.c               |  1 -
>  sysdeps/unix/sysv/linux/microblaze/fcntl.c         |  1 -
>  sysdeps/unix/sysv/linux/mips/mips32/fcntl.c        |  1 -
>  sysdeps/unix/sysv/linux/mips/mips64/n32/fcntl.c    |  1 -
>  sysdeps/unix/sysv/linux/powerpc/powerpc32/fcntl.c  |  1 -
>  sysdeps/unix/sysv/linux/powerpc/powerpc64/fcntl.c  | 49 ++----------
>  sysdeps/unix/sysv/linux/s390/s390-32/fcntl.c       |  1 -
>  sysdeps/unix/sysv/linux/sh/fcntl.c                 |  1 -
>  sysdeps/unix/sysv/linux/sparc/sparc32/fcntl.c      |  1 -
>  15 files changed, 50 insertions(+), 224 deletions(-)
>  delete mode 100644 sysdeps/unix/sysv/linux/arm/fcntl.c
>  delete mode 100644 sysdeps/unix/sysv/linux/generic/wordsize-32/fcntl.c
>  delete mode 100644 sysdeps/unix/sysv/linux/hppa/fcntl.c
>  delete mode 100644 sysdeps/unix/sysv/linux/i386/fcntl.c
>  delete mode 100644 sysdeps/unix/sysv/linux/m68k/fcntl.c
>  delete mode 100644 sysdeps/unix/sysv/linux/microblaze/fcntl.c
>  delete mode 100644 sysdeps/unix/sysv/linux/mips/mips32/fcntl.c
>  delete mode 100644 sysdeps/unix/sysv/linux/mips/mips64/n32/fcntl.c
>  delete mode 100644 sysdeps/unix/sysv/linux/powerpc/powerpc32/fcntl.c
>  delete mode 100644 sysdeps/unix/sysv/linux/s390/s390-32/fcntl.c
>  delete mode 100644 sysdeps/unix/sysv/linux/sh/fcntl.c
>  delete mode 100644 sysdeps/unix/sysv/linux/sparc/sparc32/fcntl.c
> 
> diff --git a/ChangeLog b/ChangeLog
> index 2928e25..bb5d320 100644
> --- a/ChangeLog
> +++ b/ChangeLog
> @@ -1,5 +1,21 @@
>  2017-05-23  Adhemerval Zanella  <adhemerval.zanella@linaro.org>
>  
> +	* sysdeps/unix/sysv/linux/arm/fcntl.c: Remove file.
> +	* sysdeps/unix/sysv/linux/generic/wordsize-32/fcntl.c: Likewise.
> +	* sysdeps/unix/sysv/linux/hppa/fcntl.c: Likewise.
> +	* sysdeps/unix/sysv/linux/i386/fcntl.c: Likewise.
> +	* sysdeps/unix/sysv/linux/m68k/fcntl.c: Likewise.
> +	* sysdeps/unix/sysv/linux/microblaze/fcntl.c: Likewise.
> +	* sysdeps/unix/sysv/linux/mips/mips32/fcntl.c: Likewise.
> +	* sysdeps/unix/sysv/linux/mips/mips64/n32/fcntl.c: Likewise.
> +	* sysdeps/unix/sysv/linux/powerpc/powerpc32/fcntl.c: Likewise.
> +	* sysdeps/unix/sysv/linux/s390/s390-32/fcntl.c: Likewise.
> +	* sysdeps/unix/sysv/linux/sh/fcntl.c: Likewise.
> +	* sysdeps/unix/sysv/linux/sparc/sparc32/fcntl.c: Likewise.
> +	* sysdeps/unix/sysv/linux/fcntl.c: New file.
> +	* sysdeps/unix/sysv/linux/powerpc/powerpc64/fcntl.c: Refactor to
> +	use default implementation.
> +
>  	* io/Makefile (CFLAGS-sync_file_range.c): Remove rule.
>  	* sysdeps/unix/sysv/linux/Makefile (CFLAGS-sync_file_range.c): New
>  	rule.
> diff --git a/sysdeps/unix/sysv/linux/arm/fcntl.c b/sysdeps/unix/sysv/linux/arm/fcntl.c
> deleted file mode 100644
> index ea951bc..0000000
> --- a/sysdeps/unix/sysv/linux/arm/fcntl.c
> +++ /dev/null
> @@ -1 +0,0 @@
> -#include <sysdeps/unix/sysv/linux/i386/fcntl.c>
> diff --git a/sysdeps/unix/sysv/linux/fcntl.c b/sysdeps/unix/sysv/linux/fcntl.c
> index 02f3252..76e846c 100644
> --- a/sysdeps/unix/sysv/linux/fcntl.c
> +++ b/sysdeps/unix/sysv/linux/fcntl.c
> @@ -15,31 +15,36 @@
>     License along with the GNU C Library; if not, see
>     <http://www.gnu.org/licenses/>.  */
>  
> -#include <assert.h>
> -#include <errno.h>
> -#include <sysdep-cancel.h>	/* Must come before <fcntl.h>.  */
>  #include <fcntl.h>
>  #include <stdarg.h>
> +#include <errno.h>
> +#include <sysdep-cancel.h>
>  
> -#include <sys/syscall.h>
> +#ifndef __NR_fcntl64
> +# define __NR_fcntl64 __NR_fcntl
> +#endif
>  
> +#ifndef FCNTL_ADJUST_CMD
> +# define FCNTL_ADJUST_CMD(__cmd) __cmd
> +#endif
>  
>  static int
> -do_fcntl (int fd, int cmd, void *arg)
> +fcntl_common (int fd, int cmd, void *arg)
>  {
> -  if (cmd != F_GETOWN)
> -    return INLINE_SYSCALL (fcntl, 3, fd, cmd, arg);
> -
> -  INTERNAL_SYSCALL_DECL (err);
> -  struct f_owner_ex fex;
> -  int res = INTERNAL_SYSCALL (fcntl, err, 3, fd, F_GETOWN_EX, &fex);
> -  if (!INTERNAL_SYSCALL_ERROR_P (res, err))
> -    return fex.type == F_OWNER_GID ? -fex.pid : fex.pid;
> -
> -  return INLINE_SYSCALL_ERROR_RETURN_VALUE (INTERNAL_SYSCALL_ERRNO (res,
> +  if (cmd == F_GETOWN)
> +    {
> +      INTERNAL_SYSCALL_DECL (err);
> +      struct f_owner_ex fex;
> +      int res = INTERNAL_SYSCALL_CALL (fcntl64, err, fd, F_GETOWN_EX, &fex);
> +      if (!INTERNAL_SYSCALL_ERROR_P (res, err))
> +	return fex.type == F_OWNER_GID ? -fex.pid : fex.pid;
> +
> +      return INLINE_SYSCALL_ERROR_RETURN_VALUE (INTERNAL_SYSCALL_ERRNO (res,
>  								    err));
> -}
> +    }
>  
> +  return INLINE_SYSCALL_CALL (fcntl64, fd, cmd, (void *) arg);
> +}
>  
>  #ifndef NO_CANCELLATION
>  int
> @@ -52,11 +57,10 @@ __fcntl_nocancel (int fd, int cmd, ...)
>    arg = va_arg (ap, void *);
>    va_end (ap);
>  
> -  return do_fcntl (fd, cmd, arg);
> +  return fcntl_common (fd, cmd, arg);
>  }
>  #endif
>  
> -
>  int
>  __libc_fcntl (int fd, int cmd, ...)
>  {
> @@ -67,16 +71,12 @@ __libc_fcntl (int fd, int cmd, ...)
>    arg = va_arg (ap, void *);
>    va_end (ap);
>  
> -  if (SINGLE_THREAD_P || cmd != F_SETLKW)
> -    return do_fcntl (fd, cmd, arg);
> -
> -  int oldtype = LIBC_CANCEL_ASYNC ();
> -
> -  int result = do_fcntl (fd, cmd, arg);
> +  cmd = FCNTL_ADJUST_CMD (cmd);
>  
> -  LIBC_CANCEL_RESET (oldtype);
> +  if (cmd == F_SETLKW || cmd == F_SETLKW64)
> +    return SYSCALL_CANCEL (fcntl64, fd, cmd, (void *) arg);
>  
> -  return result;
> +  return fcntl_common (fd, cmd, arg);
>  }
>  libc_hidden_def (__libc_fcntl)
>  
> diff --git a/sysdeps/unix/sysv/linux/generic/wordsize-32/fcntl.c b/sysdeps/unix/sysv/linux/generic/wordsize-32/fcntl.c
> deleted file mode 100644
> index 20399f9..0000000
> --- a/sysdeps/unix/sysv/linux/generic/wordsize-32/fcntl.c
> +++ /dev/null
> @@ -1,86 +0,0 @@
> -/* Copyright (C) 2011-2017 Free Software Foundation, Inc.
> -   This file is part of the GNU C Library.
> -   Contributed by Chris Metcalf <cmetcalf@tilera.com>, 2011.
> -
> -   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 <assert.h>
> -#include <errno.h>
> -#include <sysdep-cancel.h>	/* Must come before <fcntl.h>.  */
> -#include <fcntl.h>
> -#include <stdarg.h>
> -
> -#include <sys/syscall.h>
> -
> -
> -static int
> -do_fcntl (int fd, int cmd, void *arg)
> -{
> -  if (cmd != F_GETOWN)
> -    return INLINE_SYSCALL (fcntl64, 3, fd, cmd, arg);
> -
> -  INTERNAL_SYSCALL_DECL (err);
> -  struct f_owner_ex fex;
> -  int res = INTERNAL_SYSCALL (fcntl64, err, 3, fd, F_GETOWN_EX, &fex);
> -  if (!INTERNAL_SYSCALL_ERROR_P (res, err))
> -    return fex.type == F_OWNER_GID ? -fex.pid : fex.pid;
> -
> -  __set_errno (INTERNAL_SYSCALL_ERRNO (res, err));
> -  return -1;
> -}
> -
> -
> -#ifndef NO_CANCELLATION
> -int
> -__fcntl_nocancel (int fd, int cmd, ...)
> -{
> -  va_list ap;
> -  void *arg;
> -
> -  va_start (ap, cmd);
> -  arg = va_arg (ap, void *);
> -  va_end (ap);
> -
> -  return do_fcntl (fd, cmd, arg);
> -}
> -#endif
> -
> -
> -int
> -__libc_fcntl (int fd, int cmd, ...)
> -{
> -  va_list ap;
> -  void *arg;
> -
> -  va_start (ap, cmd);
> -  arg = va_arg (ap, void *);
> -  va_end (ap);
> -
> -  if (SINGLE_THREAD_P || cmd != F_SETLKW)
> -    return do_fcntl (fd, cmd, arg);
> -
> -  int oldtype = LIBC_CANCEL_ASYNC ();
> -
> -  int result = do_fcntl (fd, cmd, arg);
> -
> -  LIBC_CANCEL_RESET (oldtype);
> -
> -  return result;
> -}
> -libc_hidden_def (__libc_fcntl)
> -
> -weak_alias (__libc_fcntl, __fcntl)
> -libc_hidden_weak (__fcntl)
> -weak_alias (__libc_fcntl, fcntl)
> diff --git a/sysdeps/unix/sysv/linux/hppa/fcntl.c b/sysdeps/unix/sysv/linux/hppa/fcntl.c
> deleted file mode 100644
> index ea951bc..0000000
> --- a/sysdeps/unix/sysv/linux/hppa/fcntl.c
> +++ /dev/null
> @@ -1 +0,0 @@
> -#include <sysdeps/unix/sysv/linux/i386/fcntl.c>
> diff --git a/sysdeps/unix/sysv/linux/i386/fcntl.c b/sysdeps/unix/sysv/linux/i386/fcntl.c
> deleted file mode 100644
> index b0a5783..0000000
> --- a/sysdeps/unix/sysv/linux/i386/fcntl.c
> +++ /dev/null
> @@ -1,61 +0,0 @@
> -/* Copyright (C) 2000-2017 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 <assert.h>
> -#include <errno.h>
> -#include <sysdep-cancel.h>	/* Must come before <fcntl.h>.  */
> -#include <fcntl.h>
> -#include <stdarg.h>
> -
> -#include <sys/syscall.h>
> -
> -#ifndef NO_CANCELLATION
> -int
> -__fcntl_nocancel (int fd, int cmd, ...)
> -{
> -  va_list ap;
> -  void *arg;
> -
> -  va_start (ap, cmd);
> -  arg = va_arg (ap, void *);
> -  va_end (ap);
> -
> -  return INLINE_SYSCALL (fcntl64, 3, fd, cmd, arg);
> -}
> -#endif /* NO_CANCELLATION */
> -
> -
> -int
> -__libc_fcntl (int fd, int cmd, ...)
> -{
> -  va_list ap;
> -  void *arg;
> -
> -  va_start (ap, cmd);
> -  arg = va_arg (ap, void *);
> -  va_end (ap);
> -
> -  if ((cmd != F_SETLKW) && (cmd != F_SETLKW64))
> -    return INLINE_SYSCALL (fcntl64, 3, fd, cmd, arg);
> -
> -  return SYSCALL_CANCEL (fcntl64, fd, cmd, arg);
> -}
> -libc_hidden_def (__libc_fcntl)
> -
> -weak_alias (__libc_fcntl, __fcntl)
> -libc_hidden_weak (__fcntl)
> -weak_alias (__libc_fcntl, fcntl)
> diff --git a/sysdeps/unix/sysv/linux/m68k/fcntl.c b/sysdeps/unix/sysv/linux/m68k/fcntl.c
> deleted file mode 100644
> index ea951bc..0000000
> --- a/sysdeps/unix/sysv/linux/m68k/fcntl.c
> +++ /dev/null
> @@ -1 +0,0 @@
> -#include <sysdeps/unix/sysv/linux/i386/fcntl.c>
> diff --git a/sysdeps/unix/sysv/linux/microblaze/fcntl.c b/sysdeps/unix/sysv/linux/microblaze/fcntl.c
> deleted file mode 100644
> index ea951bc..0000000
> --- a/sysdeps/unix/sysv/linux/microblaze/fcntl.c
> +++ /dev/null
> @@ -1 +0,0 @@
> -#include <sysdeps/unix/sysv/linux/i386/fcntl.c>
> diff --git a/sysdeps/unix/sysv/linux/mips/mips32/fcntl.c b/sysdeps/unix/sysv/linux/mips/mips32/fcntl.c
> deleted file mode 100644
> index ea951bc..0000000
> --- a/sysdeps/unix/sysv/linux/mips/mips32/fcntl.c
> +++ /dev/null
> @@ -1 +0,0 @@
> -#include <sysdeps/unix/sysv/linux/i386/fcntl.c>
> diff --git a/sysdeps/unix/sysv/linux/mips/mips64/n32/fcntl.c b/sysdeps/unix/sysv/linux/mips/mips64/n32/fcntl.c
> deleted file mode 100644
> index ea951bc..0000000
> --- a/sysdeps/unix/sysv/linux/mips/mips64/n32/fcntl.c
> +++ /dev/null
> @@ -1 +0,0 @@
> -#include <sysdeps/unix/sysv/linux/i386/fcntl.c>
> diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/fcntl.c b/sysdeps/unix/sysv/linux/powerpc/powerpc32/fcntl.c
> deleted file mode 100644
> index ea951bc..0000000
> --- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/fcntl.c
> +++ /dev/null
> @@ -1 +0,0 @@
> -#include <sysdeps/unix/sysv/linux/i386/fcntl.c>
> diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/fcntl.c b/sysdeps/unix/sysv/linux/powerpc/powerpc64/fcntl.c
> index 85ae8a2..d382d08 100644
> --- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/fcntl.c
> +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/fcntl.c
> @@ -15,51 +15,18 @@
>     License along with the GNU C Library; if not, see
>     <http://www.gnu.org/licenses/>.  */
>  
> -#include <assert.h>
> -#include <errno.h>
> -#include <sysdep-cancel.h>	/* Must come before <fcntl.h>.  */
> +#include <unistd.h>
>  #include <fcntl.h>
> -#include <stdarg.h>
>  
> -#include <sys/syscall.h>
> -
> -
> -#ifndef NO_CANCELLATION
> -int
> -__fcntl_nocancel (int fd, int cmd, ...)
> +static inline int
> +__libc_fcntl_adjust_cmd (int cmd)
>  {
> -  va_list ap;
> -  void *arg;
> -
> -  va_start (ap, cmd);
> -  arg = va_arg (ap, void *);
> -  va_end (ap);
> -
> -  return INLINE_SYSCALL (fcntl, 3, fd, cmd, arg);
> -}
> -#endif
> -
> -
> -int
> -__libc_fcntl (int fd, int cmd, ...)
> -{
> -  va_list ap;
> -  void *arg;
> -
> -  va_start (ap, cmd);
> -  arg = va_arg (ap, void *);
> -  va_end (ap);
> -
>    if (cmd >= F_GETLK64 && cmd <= F_SETLKW64)
>      cmd -= F_GETLK64 - F_GETLK;
> -
> -  if (cmd != F_SETLKW)
> -    return INLINE_SYSCALL (fcntl, 3, fd, cmd, arg);
> -
> -  return SYSCALL_CANCEL (fcntl, fd, cmd, arg);
> +  return cmd;
>  }
> -libc_hidden_def (__libc_fcntl)
>  
> -weak_alias (__libc_fcntl, __fcntl)
> -libc_hidden_weak (__fcntl)
> -weak_alias (__libc_fcntl, fcntl)
> +#define FCNTL_ADJUST_CMD(__cmd) \
> +  __libc_fcntl_adjust_cmd (__cmd)
> +
> +#include <sysdeps/unix/sysv/linux/fcntl.c>
> diff --git a/sysdeps/unix/sysv/linux/s390/s390-32/fcntl.c b/sysdeps/unix/sysv/linux/s390/s390-32/fcntl.c
> deleted file mode 100644
> index ea951bc..0000000
> --- a/sysdeps/unix/sysv/linux/s390/s390-32/fcntl.c
> +++ /dev/null
> @@ -1 +0,0 @@
> -#include <sysdeps/unix/sysv/linux/i386/fcntl.c>
> diff --git a/sysdeps/unix/sysv/linux/sh/fcntl.c b/sysdeps/unix/sysv/linux/sh/fcntl.c
> deleted file mode 100644
> index ea951bc..0000000
> --- a/sysdeps/unix/sysv/linux/sh/fcntl.c
> +++ /dev/null
> @@ -1 +0,0 @@
> -#include <sysdeps/unix/sysv/linux/i386/fcntl.c>
> diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/fcntl.c b/sysdeps/unix/sysv/linux/sparc/sparc32/fcntl.c
> deleted file mode 100644
> index ea951bc..0000000
> --- a/sysdeps/unix/sysv/linux/sparc/sparc32/fcntl.c
> +++ /dev/null
> @@ -1 +0,0 @@
> -#include <sysdeps/unix/sysv/linux/i386/fcntl.c>
>
  
Andreas Schwab June 29, 2017, 3:01 p.m. UTC | #2
On Mai 23 2017, Adhemerval Zanella <adhemerval.zanella@linaro.org> wrote:

> 	* sysdeps/unix/sysv/linux/arm/fcntl.c: Remove file.
> 	* sysdeps/unix/sysv/linux/generic/wordsize-32/fcntl.c: Likewise.
> 	* sysdeps/unix/sysv/linux/hppa/fcntl.c: Likewise.
> 	* sysdeps/unix/sysv/linux/i386/fcntl.c: Likewise.
> 	* sysdeps/unix/sysv/linux/m68k/fcntl.c: Likewise.
> 	* sysdeps/unix/sysv/linux/microblaze/fcntl.c: Likewise.
> 	* sysdeps/unix/sysv/linux/mips/mips32/fcntl.c: Likewise.
> 	* sysdeps/unix/sysv/linux/mips/mips64/n32/fcntl.c: Likewise.
> 	* sysdeps/unix/sysv/linux/powerpc/powerpc32/fcntl.c: Likewise.
> 	* sysdeps/unix/sysv/linux/s390/s390-32/fcntl.c: Likewise.
> 	* sysdeps/unix/sysv/linux/sh/fcntl.c: Likewise.
> 	* sysdeps/unix/sysv/linux/sparc/sparc32/fcntl.c: Likewise.
> 	* sysdeps/unix/sysv/linux/fcntl.c: New file.

That's not a new file.

> 	* sysdeps/unix/sysv/linux/powerpc/powerpc64/fcntl.c: Refactor to
> 	use default implementation.

> diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/fcntl.c b/sysdeps/unix/sysv/linux/powerpc/powerpc64/fcntl.c
> index 85ae8a2..d382d08 100644
> --- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/fcntl.c
> +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/fcntl.c
> @@ -15,51 +15,18 @@
>     License along with the GNU C Library; if not, see
>     <http://www.gnu.org/licenses/>.  */
>  
> -#include <assert.h>
> -#include <errno.h>
> -#include <sysdep-cancel.h>	/* Must come before <fcntl.h>.  */
> +#include <unistd.h>
>  #include <fcntl.h>
> -#include <stdarg.h>
>  
> -#include <sys/syscall.h>
> -
> -
> -#ifndef NO_CANCELLATION
> -int
> -__fcntl_nocancel (int fd, int cmd, ...)
> +static inline int
> +__libc_fcntl_adjust_cmd (int cmd)

No need for __libc prefix, since this is static.

Ok with those changes.

Andreas.
  

Patch

diff --git a/ChangeLog b/ChangeLog
index 2928e25..bb5d320 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,21 @@ 
 2017-05-23  Adhemerval Zanella  <adhemerval.zanella@linaro.org>
 
+	* sysdeps/unix/sysv/linux/arm/fcntl.c: Remove file.
+	* sysdeps/unix/sysv/linux/generic/wordsize-32/fcntl.c: Likewise.
+	* sysdeps/unix/sysv/linux/hppa/fcntl.c: Likewise.
+	* sysdeps/unix/sysv/linux/i386/fcntl.c: Likewise.
+	* sysdeps/unix/sysv/linux/m68k/fcntl.c: Likewise.
+	* sysdeps/unix/sysv/linux/microblaze/fcntl.c: Likewise.
+	* sysdeps/unix/sysv/linux/mips/mips32/fcntl.c: Likewise.
+	* sysdeps/unix/sysv/linux/mips/mips64/n32/fcntl.c: Likewise.
+	* sysdeps/unix/sysv/linux/powerpc/powerpc32/fcntl.c: Likewise.
+	* sysdeps/unix/sysv/linux/s390/s390-32/fcntl.c: Likewise.
+	* sysdeps/unix/sysv/linux/sh/fcntl.c: Likewise.
+	* sysdeps/unix/sysv/linux/sparc/sparc32/fcntl.c: Likewise.
+	* sysdeps/unix/sysv/linux/fcntl.c: New file.
+	* sysdeps/unix/sysv/linux/powerpc/powerpc64/fcntl.c: Refactor to
+	use default implementation.
+
 	* io/Makefile (CFLAGS-sync_file_range.c): Remove rule.
 	* sysdeps/unix/sysv/linux/Makefile (CFLAGS-sync_file_range.c): New
 	rule.
diff --git a/sysdeps/unix/sysv/linux/arm/fcntl.c b/sysdeps/unix/sysv/linux/arm/fcntl.c
deleted file mode 100644
index ea951bc..0000000
--- a/sysdeps/unix/sysv/linux/arm/fcntl.c
+++ /dev/null
@@ -1 +0,0 @@ 
-#include <sysdeps/unix/sysv/linux/i386/fcntl.c>
diff --git a/sysdeps/unix/sysv/linux/fcntl.c b/sysdeps/unix/sysv/linux/fcntl.c
index 02f3252..76e846c 100644
--- a/sysdeps/unix/sysv/linux/fcntl.c
+++ b/sysdeps/unix/sysv/linux/fcntl.c
@@ -15,31 +15,36 @@ 
    License along with the GNU C Library; if not, see
    <http://www.gnu.org/licenses/>.  */
 
-#include <assert.h>
-#include <errno.h>
-#include <sysdep-cancel.h>	/* Must come before <fcntl.h>.  */
 #include <fcntl.h>
 #include <stdarg.h>
+#include <errno.h>
+#include <sysdep-cancel.h>
 
-#include <sys/syscall.h>
+#ifndef __NR_fcntl64
+# define __NR_fcntl64 __NR_fcntl
+#endif
 
+#ifndef FCNTL_ADJUST_CMD
+# define FCNTL_ADJUST_CMD(__cmd) __cmd
+#endif
 
 static int
-do_fcntl (int fd, int cmd, void *arg)
+fcntl_common (int fd, int cmd, void *arg)
 {
-  if (cmd != F_GETOWN)
-    return INLINE_SYSCALL (fcntl, 3, fd, cmd, arg);
-
-  INTERNAL_SYSCALL_DECL (err);
-  struct f_owner_ex fex;
-  int res = INTERNAL_SYSCALL (fcntl, err, 3, fd, F_GETOWN_EX, &fex);
-  if (!INTERNAL_SYSCALL_ERROR_P (res, err))
-    return fex.type == F_OWNER_GID ? -fex.pid : fex.pid;
-
-  return INLINE_SYSCALL_ERROR_RETURN_VALUE (INTERNAL_SYSCALL_ERRNO (res,
+  if (cmd == F_GETOWN)
+    {
+      INTERNAL_SYSCALL_DECL (err);
+      struct f_owner_ex fex;
+      int res = INTERNAL_SYSCALL_CALL (fcntl64, err, fd, F_GETOWN_EX, &fex);
+      if (!INTERNAL_SYSCALL_ERROR_P (res, err))
+	return fex.type == F_OWNER_GID ? -fex.pid : fex.pid;
+
+      return INLINE_SYSCALL_ERROR_RETURN_VALUE (INTERNAL_SYSCALL_ERRNO (res,
 								    err));
-}
+    }
 
+  return INLINE_SYSCALL_CALL (fcntl64, fd, cmd, (void *) arg);
+}
 
 #ifndef NO_CANCELLATION
 int
@@ -52,11 +57,10 @@  __fcntl_nocancel (int fd, int cmd, ...)
   arg = va_arg (ap, void *);
   va_end (ap);
 
-  return do_fcntl (fd, cmd, arg);
+  return fcntl_common (fd, cmd, arg);
 }
 #endif
 
-
 int
 __libc_fcntl (int fd, int cmd, ...)
 {
@@ -67,16 +71,12 @@  __libc_fcntl (int fd, int cmd, ...)
   arg = va_arg (ap, void *);
   va_end (ap);
 
-  if (SINGLE_THREAD_P || cmd != F_SETLKW)
-    return do_fcntl (fd, cmd, arg);
-
-  int oldtype = LIBC_CANCEL_ASYNC ();
-
-  int result = do_fcntl (fd, cmd, arg);
+  cmd = FCNTL_ADJUST_CMD (cmd);
 
-  LIBC_CANCEL_RESET (oldtype);
+  if (cmd == F_SETLKW || cmd == F_SETLKW64)
+    return SYSCALL_CANCEL (fcntl64, fd, cmd, (void *) arg);
 
-  return result;
+  return fcntl_common (fd, cmd, arg);
 }
 libc_hidden_def (__libc_fcntl)
 
diff --git a/sysdeps/unix/sysv/linux/generic/wordsize-32/fcntl.c b/sysdeps/unix/sysv/linux/generic/wordsize-32/fcntl.c
deleted file mode 100644
index 20399f9..0000000
--- a/sysdeps/unix/sysv/linux/generic/wordsize-32/fcntl.c
+++ /dev/null
@@ -1,86 +0,0 @@ 
-/* Copyright (C) 2011-2017 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-   Contributed by Chris Metcalf <cmetcalf@tilera.com>, 2011.
-
-   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 <assert.h>
-#include <errno.h>
-#include <sysdep-cancel.h>	/* Must come before <fcntl.h>.  */
-#include <fcntl.h>
-#include <stdarg.h>
-
-#include <sys/syscall.h>
-
-
-static int
-do_fcntl (int fd, int cmd, void *arg)
-{
-  if (cmd != F_GETOWN)
-    return INLINE_SYSCALL (fcntl64, 3, fd, cmd, arg);
-
-  INTERNAL_SYSCALL_DECL (err);
-  struct f_owner_ex fex;
-  int res = INTERNAL_SYSCALL (fcntl64, err, 3, fd, F_GETOWN_EX, &fex);
-  if (!INTERNAL_SYSCALL_ERROR_P (res, err))
-    return fex.type == F_OWNER_GID ? -fex.pid : fex.pid;
-
-  __set_errno (INTERNAL_SYSCALL_ERRNO (res, err));
-  return -1;
-}
-
-
-#ifndef NO_CANCELLATION
-int
-__fcntl_nocancel (int fd, int cmd, ...)
-{
-  va_list ap;
-  void *arg;
-
-  va_start (ap, cmd);
-  arg = va_arg (ap, void *);
-  va_end (ap);
-
-  return do_fcntl (fd, cmd, arg);
-}
-#endif
-
-
-int
-__libc_fcntl (int fd, int cmd, ...)
-{
-  va_list ap;
-  void *arg;
-
-  va_start (ap, cmd);
-  arg = va_arg (ap, void *);
-  va_end (ap);
-
-  if (SINGLE_THREAD_P || cmd != F_SETLKW)
-    return do_fcntl (fd, cmd, arg);
-
-  int oldtype = LIBC_CANCEL_ASYNC ();
-
-  int result = do_fcntl (fd, cmd, arg);
-
-  LIBC_CANCEL_RESET (oldtype);
-
-  return result;
-}
-libc_hidden_def (__libc_fcntl)
-
-weak_alias (__libc_fcntl, __fcntl)
-libc_hidden_weak (__fcntl)
-weak_alias (__libc_fcntl, fcntl)
diff --git a/sysdeps/unix/sysv/linux/hppa/fcntl.c b/sysdeps/unix/sysv/linux/hppa/fcntl.c
deleted file mode 100644
index ea951bc..0000000
--- a/sysdeps/unix/sysv/linux/hppa/fcntl.c
+++ /dev/null
@@ -1 +0,0 @@ 
-#include <sysdeps/unix/sysv/linux/i386/fcntl.c>
diff --git a/sysdeps/unix/sysv/linux/i386/fcntl.c b/sysdeps/unix/sysv/linux/i386/fcntl.c
deleted file mode 100644
index b0a5783..0000000
--- a/sysdeps/unix/sysv/linux/i386/fcntl.c
+++ /dev/null
@@ -1,61 +0,0 @@ 
-/* Copyright (C) 2000-2017 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 <assert.h>
-#include <errno.h>
-#include <sysdep-cancel.h>	/* Must come before <fcntl.h>.  */
-#include <fcntl.h>
-#include <stdarg.h>
-
-#include <sys/syscall.h>
-
-#ifndef NO_CANCELLATION
-int
-__fcntl_nocancel (int fd, int cmd, ...)
-{
-  va_list ap;
-  void *arg;
-
-  va_start (ap, cmd);
-  arg = va_arg (ap, void *);
-  va_end (ap);
-
-  return INLINE_SYSCALL (fcntl64, 3, fd, cmd, arg);
-}
-#endif /* NO_CANCELLATION */
-
-
-int
-__libc_fcntl (int fd, int cmd, ...)
-{
-  va_list ap;
-  void *arg;
-
-  va_start (ap, cmd);
-  arg = va_arg (ap, void *);
-  va_end (ap);
-
-  if ((cmd != F_SETLKW) && (cmd != F_SETLKW64))
-    return INLINE_SYSCALL (fcntl64, 3, fd, cmd, arg);
-
-  return SYSCALL_CANCEL (fcntl64, fd, cmd, arg);
-}
-libc_hidden_def (__libc_fcntl)
-
-weak_alias (__libc_fcntl, __fcntl)
-libc_hidden_weak (__fcntl)
-weak_alias (__libc_fcntl, fcntl)
diff --git a/sysdeps/unix/sysv/linux/m68k/fcntl.c b/sysdeps/unix/sysv/linux/m68k/fcntl.c
deleted file mode 100644
index ea951bc..0000000
--- a/sysdeps/unix/sysv/linux/m68k/fcntl.c
+++ /dev/null
@@ -1 +0,0 @@ 
-#include <sysdeps/unix/sysv/linux/i386/fcntl.c>
diff --git a/sysdeps/unix/sysv/linux/microblaze/fcntl.c b/sysdeps/unix/sysv/linux/microblaze/fcntl.c
deleted file mode 100644
index ea951bc..0000000
--- a/sysdeps/unix/sysv/linux/microblaze/fcntl.c
+++ /dev/null
@@ -1 +0,0 @@ 
-#include <sysdeps/unix/sysv/linux/i386/fcntl.c>
diff --git a/sysdeps/unix/sysv/linux/mips/mips32/fcntl.c b/sysdeps/unix/sysv/linux/mips/mips32/fcntl.c
deleted file mode 100644
index ea951bc..0000000
--- a/sysdeps/unix/sysv/linux/mips/mips32/fcntl.c
+++ /dev/null
@@ -1 +0,0 @@ 
-#include <sysdeps/unix/sysv/linux/i386/fcntl.c>
diff --git a/sysdeps/unix/sysv/linux/mips/mips64/n32/fcntl.c b/sysdeps/unix/sysv/linux/mips/mips64/n32/fcntl.c
deleted file mode 100644
index ea951bc..0000000
--- a/sysdeps/unix/sysv/linux/mips/mips64/n32/fcntl.c
+++ /dev/null
@@ -1 +0,0 @@ 
-#include <sysdeps/unix/sysv/linux/i386/fcntl.c>
diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/fcntl.c b/sysdeps/unix/sysv/linux/powerpc/powerpc32/fcntl.c
deleted file mode 100644
index ea951bc..0000000
--- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/fcntl.c
+++ /dev/null
@@ -1 +0,0 @@ 
-#include <sysdeps/unix/sysv/linux/i386/fcntl.c>
diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/fcntl.c b/sysdeps/unix/sysv/linux/powerpc/powerpc64/fcntl.c
index 85ae8a2..d382d08 100644
--- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/fcntl.c
+++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/fcntl.c
@@ -15,51 +15,18 @@ 
    License along with the GNU C Library; if not, see
    <http://www.gnu.org/licenses/>.  */
 
-#include <assert.h>
-#include <errno.h>
-#include <sysdep-cancel.h>	/* Must come before <fcntl.h>.  */
+#include <unistd.h>
 #include <fcntl.h>
-#include <stdarg.h>
 
-#include <sys/syscall.h>
-
-
-#ifndef NO_CANCELLATION
-int
-__fcntl_nocancel (int fd, int cmd, ...)
+static inline int
+__libc_fcntl_adjust_cmd (int cmd)
 {
-  va_list ap;
-  void *arg;
-
-  va_start (ap, cmd);
-  arg = va_arg (ap, void *);
-  va_end (ap);
-
-  return INLINE_SYSCALL (fcntl, 3, fd, cmd, arg);
-}
-#endif
-
-
-int
-__libc_fcntl (int fd, int cmd, ...)
-{
-  va_list ap;
-  void *arg;
-
-  va_start (ap, cmd);
-  arg = va_arg (ap, void *);
-  va_end (ap);
-
   if (cmd >= F_GETLK64 && cmd <= F_SETLKW64)
     cmd -= F_GETLK64 - F_GETLK;
-
-  if (cmd != F_SETLKW)
-    return INLINE_SYSCALL (fcntl, 3, fd, cmd, arg);
-
-  return SYSCALL_CANCEL (fcntl, fd, cmd, arg);
+  return cmd;
 }
-libc_hidden_def (__libc_fcntl)
 
-weak_alias (__libc_fcntl, __fcntl)
-libc_hidden_weak (__fcntl)
-weak_alias (__libc_fcntl, fcntl)
+#define FCNTL_ADJUST_CMD(__cmd) \
+  __libc_fcntl_adjust_cmd (__cmd)
+
+#include <sysdeps/unix/sysv/linux/fcntl.c>
diff --git a/sysdeps/unix/sysv/linux/s390/s390-32/fcntl.c b/sysdeps/unix/sysv/linux/s390/s390-32/fcntl.c
deleted file mode 100644
index ea951bc..0000000
--- a/sysdeps/unix/sysv/linux/s390/s390-32/fcntl.c
+++ /dev/null
@@ -1 +0,0 @@ 
-#include <sysdeps/unix/sysv/linux/i386/fcntl.c>
diff --git a/sysdeps/unix/sysv/linux/sh/fcntl.c b/sysdeps/unix/sysv/linux/sh/fcntl.c
deleted file mode 100644
index ea951bc..0000000
--- a/sysdeps/unix/sysv/linux/sh/fcntl.c
+++ /dev/null
@@ -1 +0,0 @@ 
-#include <sysdeps/unix/sysv/linux/i386/fcntl.c>
diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/fcntl.c b/sysdeps/unix/sysv/linux/sparc/sparc32/fcntl.c
deleted file mode 100644
index ea951bc..0000000
--- a/sysdeps/unix/sysv/linux/sparc/sparc32/fcntl.c
+++ /dev/null
@@ -1 +0,0 @@ 
-#include <sysdeps/unix/sysv/linux/i386/fcntl.c>