This is the mail archive of the libc-alpha@sourceware.org mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH 4/5] Consolidate Linux fcntl implementation


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>
> 


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]