Consolidate Linux fcntl implementation
authorAdhemerval Zanella <adhemerval.zanella@linaro.org>
Mon, 28 Nov 2016 17:18:22 +0000 (15:18 -0200)
committerAdhemerval Zanella <adhemerval.zanella@linaro.org>
Fri, 30 Jun 2017 18:17:26 +0000 (15:17 -0300)
This patch consolidates the fcntl Linux syscall generation on
sysdeps/unix/sysv/linux/fcntl.c.  It basically removes all the
architecture specific implementations.

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

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

15 files changed:
ChangeLog
sysdeps/unix/sysv/linux/arm/fcntl.c [deleted file]
sysdeps/unix/sysv/linux/fcntl.c
sysdeps/unix/sysv/linux/generic/wordsize-32/fcntl.c [deleted file]
sysdeps/unix/sysv/linux/hppa/fcntl.c [deleted file]
sysdeps/unix/sysv/linux/i386/fcntl.c [deleted file]
sysdeps/unix/sysv/linux/m68k/fcntl.c [deleted file]
sysdeps/unix/sysv/linux/microblaze/fcntl.c [deleted file]
sysdeps/unix/sysv/linux/mips/mips32/fcntl.c [deleted file]
sysdeps/unix/sysv/linux/mips/mips64/n32/fcntl.c [deleted file]
sysdeps/unix/sysv/linux/powerpc/powerpc32/fcntl.c [deleted file]
sysdeps/unix/sysv/linux/powerpc/powerpc64/fcntl.c
sysdeps/unix/sysv/linux/s390/s390-32/fcntl.c [deleted file]
sysdeps/unix/sysv/linux/sh/fcntl.c [deleted file]
sysdeps/unix/sysv/linux/sparc/sparc32/fcntl.c [deleted file]

index 2483254..08ff793 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,23 @@
+2017-06-30  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 (do_fcntl): Rename to
+       fcntl_common and add check for F_GETOWN.
+       (__libc_fcntl): Use SYSCALL_CANCEL macro.
+       * sysdeps/unix/sysv/linux/powerpc/powerpc64/fcntl.c: Refactor to
+       use default implementation.
+
 2017-06-30  Siddhesh Poyarekar  <siddhesh@sourceware.org>
 
        * elf/dl-tunables.h (tunable_is_name): Move from...
diff --git a/sysdeps/unix/sysv/linux/arm/fcntl.c b/sysdeps/unix/sysv/linux/arm/fcntl.c
deleted file mode 100644 (file)
index ea951bc..0000000
+++ /dev/null
@@ -1 +0,0 @@
-#include <sysdeps/unix/sysv/linux/i386/fcntl.c>
index 02f3252..76e846c 100644 (file)
    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 (file)
index 20399f9..0000000
+++ /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 (file)
index ea951bc..0000000
+++ /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 (file)
index b0a5783..0000000
+++ /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 (file)
index ea951bc..0000000
+++ /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 (file)
index ea951bc..0000000
+++ /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 (file)
index ea951bc..0000000
+++ /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 (file)
index ea951bc..0000000
+++ /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 (file)
index ea951bc..0000000
+++ /dev/null
@@ -1 +0,0 @@
-#include <sysdeps/unix/sysv/linux/i386/fcntl.c>
index 85ae8a2..1eec4ea 100644 (file)
    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
+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) \
+  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 (file)
index ea951bc..0000000
+++ /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 (file)
index ea951bc..0000000
+++ /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 (file)
index ea951bc..0000000
+++ /dev/null
@@ -1 +0,0 @@
-#include <sysdeps/unix/sysv/linux/i386/fcntl.c>