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]

Remove __ASSUME_FCNTL64


The macro __ASSUME_FCNTL64 is defined, for all kernel versions, for
i386, sparc, powerpc32, sh, arm, hppa, m68k, mips (n32 only), tile.

It is used in sysdeps/unix/sysv/linux/i386/fcntl.c and
sysdeps/unix/sysv/linux/i386/lockf64.c.  Those files are #included
for: am33, arm, hppa, m68k, mips (o32, n32), powerpc32, s390-32, sh,
sparc32.

Thus the only architectures using those files that do not have this
macro defined are am33, mips (o32) and s390-32.  For am33, the fcntl64
syscall was present in 2.6.25 when the kernel support for that
architecture was present; for mips (o32 and n32) it was present in
2.6.12, the minimum kernel version for mips, and for s390-32 it was
present in 2.4.21, the global minimum kernel version.  So all cases
that did not define this macro do in fact have the syscall and so
could have safely defined it.

Thus I propose this patch to remove this macro and simplify the code
accordingly.  Tested x86.

2012-08-01  Joseph Myers  <joseph@codesourcery.com>

	* sysdeps/unix/sysv/linux/kernel-features.h (__ASSUME_FCNTL64):
	Remove all definitions.
	* sysdeps/unix/sysv/linux/i386/fcntl.c: Do not include
	<kernel-features.h>.
	[!__ASSUME_FCNTL64] (__have_no_fcntl64): Remove.
	(miss_F_GETOWN_EX): Remove all definitions.
	[NO_CANCELLATION && !__ASSUME_FCNTL64] (__fcntl_nocancel): Remove
	macro definition.
	[!__ASSUME_FCNTL64]: Remove conditional code.
	[__ASSUME_FCNTL64]: Make code unconditional.
	* sysdeps/unix/sysv/linux/i386/lockf64.c: Do not include
	<kernel-features.h>.
	[__NR_fcntl64 && !__ASSUME_FCNTL64] (__have_no_fcntl64): Remove.
	(lockf64) [!__ASSUME_FCNTL64]: Remove conditional code.
	(lockf64) [__NR_fcntl64]: Make code unconditional.
	(lockf64) [__ASSUME_FCNTL64]: Likewise.

ports/ChangeLog.arm:
2012-08-01  Joseph Myers  <joseph@codesourcery.com>

	* sysdeps/unix/sysv/linux/arm/kernel-features.h
	(__ASSUME_FCNTL64): Remove.

ports/ChangeLog.hppa:
2012-08-01  Joseph Myers  <joseph@codesourcery.com>

	* sysdeps/unix/sysv/linux/hppa/kernel-features.h
	(__ASSUME_FCNTL64): Remove.

ports/ChangeLog.m68k:
2012-08-01  Joseph Myers  <joseph@codesourcery.com>

	* sysdeps/unix/sysv/linux/m68k/kernel-features.h
	(__ASSUME_FCNTL64): Remove.

ports/ChangeLog.mips:
2012-08-01  Joseph Myers  <joseph@codesourcery.com>

	* sysdeps/unix/sysv/linux/mips/kernel-features.h
	(__ASSUME_FCNTL64): Remove.

ports/ChangeLog.tile:
2012-08-01  Joseph Myers  <joseph@codesourcery.com>

	* sysdeps/unix/sysv/linux/tile/kernel-features.h
	(__ASSUME_FCNTL64): Remove.

diff --git a/ports/sysdeps/unix/sysv/linux/arm/kernel-features.h b/ports/sysdeps/unix/sysv/linux/arm/kernel-features.h
index 9092df7..e6c5238 100644
--- a/ports/sysdeps/unix/sysv/linux/arm/kernel-features.h
+++ b/ports/sysdeps/unix/sysv/linux/arm/kernel-features.h
@@ -27,9 +27,6 @@
 #define __ASSUME_MMAP2_SYSCALL		1
 #define __ASSUME_STAT64_SYSCALL	1
 
-/* Arm got fcntl64 in 2.4.4.  */
-#define __ASSUME_FCNTL64		1
-
 /* The vfork syscall on arm was definitely available in 2.4.  */
 #define __ASSUME_VFORK_SYSCALL		1
 
diff --git a/ports/sysdeps/unix/sysv/linux/hppa/kernel-features.h b/ports/sysdeps/unix/sysv/linux/hppa/kernel-features.h
index 8dcdfbf..13a3c01 100644
--- a/ports/sysdeps/unix/sysv/linux/hppa/kernel-features.h
+++ b/ports/sysdeps/unix/sysv/linux/hppa/kernel-features.h
@@ -27,7 +27,6 @@
 #define __ASSUME_STAT64_SYSCALL		1
 #define __ASSUME_IPC64			1
 #define __ASSUME_ST_INO_64_BIT		1
-#define __ASSUME_FCNTL64		1
 #define __ASSUME_GETDENTS64_SYSCALL	1
 
 /* PA-RISC 2.6.9 kernels had the first LWS CAS support */
diff --git a/ports/sysdeps/unix/sysv/linux/m68k/kernel-features.h b/ports/sysdeps/unix/sysv/linux/m68k/kernel-features.h
index 3b0b441..dc651c0 100644
--- a/ports/sysdeps/unix/sysv/linux/m68k/kernel-features.h
+++ b/ports/sysdeps/unix/sysv/linux/m68k/kernel-features.h
@@ -20,7 +20,6 @@
 /* These features were surely available with 2.4.12.  */
 #define __ASSUME_MMAP2_SYSCALL		1
 #define __ASSUME_STAT64_SYSCALL	1
-#define __ASSUME_FCNTL64		1
 #define __ASSUME_VFORK_SYSCALL		1
 
 /* Many syscalls were added in 2.6.10 for m68k.  */
diff --git a/ports/sysdeps/unix/sysv/linux/mips/kernel-features.h b/ports/sysdeps/unix/sysv/linux/mips/kernel-features.h
index 70f1fc1..996ba0a 100644
--- a/ports/sysdeps/unix/sysv/linux/mips/kernel-features.h
+++ b/ports/sysdeps/unix/sysv/linux/mips/kernel-features.h
@@ -22,10 +22,6 @@
 /* MIPS platforms had IPC64 all along.  */
 #define __ASSUME_IPC64		1
 
-#if _MIPS_SIM == _ABIN32
-# define __ASSUME_FCNTL64		1
-#endif
-
 /* Support for the eventfd2 and signalfd4 syscalls was added in 2.6.27.  */
 #if __LINUX_KERNEL_VERSION >= 0x02061c
 # define __ASSUME_EVENTFD2	1
diff --git a/ports/sysdeps/unix/sysv/linux/tile/kernel-features.h b/ports/sysdeps/unix/sysv/linux/tile/kernel-features.h
index 89929d2..766b4ad 100644
--- a/ports/sysdeps/unix/sysv/linux/tile/kernel-features.h
+++ b/ports/sysdeps/unix/sysv/linux/tile/kernel-features.h
@@ -1,4 +1,4 @@
-/* Copyright (C) 2011 Free Software Foundation, Inc.
+/* Copyright (C) 2011-2012 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Chris Metcalf <cmetcalf@tilera.com>, 2011.
 
@@ -20,7 +20,6 @@
 /* TILE glibc support starts with 2.6.36, guaranteeing many kernel features. */
 #define __ASSUME_MMAP2_SYSCALL		1
 #define __ASSUME_STAT64_SYSCALL		1
-#define __ASSUME_FCNTL64		1
 #define __ASSUME_CLONE_THREAD_FLAGS	1
 #define __ASSUME_TGKILL			1
 #define __ASSUME_UTIMES			1
diff --git a/sysdeps/unix/sysv/linux/i386/fcntl.c b/sysdeps/unix/sysv/linux/i386/fcntl.c
index c68a06b..a0f2544 100644
--- a/sysdeps/unix/sysv/linux/i386/fcntl.c
+++ b/sysdeps/unix/sysv/linux/i386/fcntl.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 2000,2002-2004,2006,2009,2010 Free Software Foundation, Inc.
+/* Copyright (C) 2000-2012 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
@@ -22,25 +22,8 @@
 #include <stdarg.h>
 
 #include <sys/syscall.h>
-#include <kernel-features.h>
 
-#ifndef __ASSUME_FCNTL64
-/* This variable is shared with all files that check for fcntl64.  */
-int __have_no_fcntl64;
-#endif
-
-#ifdef __ASSUME_F_GETOWN_EX
-# define miss_F_GETOWN_EX 0
-#elif !defined __ASSUME_FCNTL64
-static int miss_F_GETOWN_EX;
-#endif
-
-
-#if defined NO_CANCELLATION && !defined __ASSUME_FCNTL64
-# define __fcntl_nocancel  __libc_fcntl
-#endif
-
-#if !defined NO_CANCELLATION || !defined __ASSUME_FCNTL64
+#ifndef NO_CANCELLATION
 int
 __fcntl_nocancel (int fd, int cmd, ...)
 {
@@ -51,112 +34,11 @@ __fcntl_nocancel (int fd, int cmd, ...)
   arg = va_arg (ap, void *);
   va_end (ap);
 
-#ifndef __ASSUME_FCNTL64
-# ifdef __NR_fcntl64
-  if (! __have_no_fcntl64)
-    {
-      int result = INLINE_SYSCALL (fcntl64, 3, fd, cmd, arg);
-      if (result >= 0 || errno != ENOSYS)
-	return result;
-
-      __have_no_fcntl64 = 1;
-    }
-# endif
-  switch (cmd)
-    {
-    case F_GETLK64:
-      /* Convert arg from flock64 to flock and back.  */
-      {
-	struct flock fl;
-	struct flock64 *fl64 = arg;
-	int res;
-
-	fl.l_start = (off_t)fl64->l_start;
-	/* Check if we can represent the values with the smaller type.  */
-	if ((off64_t) fl.l_start != fl64->l_start)
-	  {
-	  eoverflow:
-	    __set_errno (EOVERFLOW);
-	    return -1;
-	  }
-	fl.l_len = (off_t) fl64->l_len;
-	/* Check if we can represent the values with the smaller type.  */
-	if ((off64_t) fl.l_len != fl64->l_len)
-	  goto eoverflow;
-
-	fl.l_type = fl64->l_type;
-	fl.l_whence = fl64->l_whence;
-	fl.l_pid = fl64->l_pid;
-
-	res = INLINE_SYSCALL (fcntl, 3, fd, F_GETLK, &fl);
-	if (res  != 0)
-	  return res;
-	/* Everything ok, convert back.  */
-	fl64->l_type = fl.l_type;
-	fl64->l_whence = fl.l_whence;
-	fl64->l_start = fl.l_start;
-	fl64->l_len = fl.l_len;
-	fl64->l_pid = fl.l_pid;
-
-	return 0;
-      }
-    case F_SETLK64:
-    case F_SETLKW64:
-      /* Try to convert arg from flock64 to flock.  */
-      {
-	struct flock fl;
-	struct flock64 *fl64 = arg;
-
-	fl.l_start = (off_t) fl64->l_start;
-	/* Check if we can represent the values with the smaller type.  */
-	if ((off64_t) fl.l_start != fl64->l_start)
-	  goto eoverflow;
-
-	fl.l_len = (off_t)fl64->l_len;
-	/* Check if we can represent the values with the smaller type.  */
-	if ((off64_t) fl.l_len != fl64->l_len)
-	  {
-	    __set_errno (EOVERFLOW);
-	    return -1;
-	  }
-	fl.l_type = fl64->l_type;
-	fl.l_whence = fl64->l_whence;
-	fl.l_pid = fl64->l_pid;
-	assert (F_SETLK - F_SETLKW == F_SETLK64 - F_SETLKW64);
-	return INLINE_SYSCALL (fcntl, 3, fd, cmd + F_SETLK - F_SETLK64, &fl);
-      }
-    case F_GETOWN:
-      if (! miss_F_GETOWN_EX)
-	{
-	  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;
-
-# ifndef __ASSUME_F_GETOWN_EX
-	  if (INTERNAL_SYSCALL_ERRNO (res, err) == EINVAL)
-	    miss_F_GETOWN_EX = 1;
-	  else
-# endif
-	    {
-	      __set_errno (INTERNAL_SYSCALL_ERRNO (res, err));
-	      return -1;
-	    }
-	}
-      /* FALLTHROUGH */
-    default:
-      return INLINE_SYSCALL (fcntl, 3, fd, cmd, arg);
-    }
-  return -1;
-#else
   return INLINE_SYSCALL (fcntl64, 3, fd, cmd, arg);
-#endif  /* !__ASSUME_FCNTL64  */
 }
-#endif /* NO_CANCELLATION || !__ASSUME_FCNTL64 */
+#endif /* NO_CANCELLATION */
 
 
-#ifndef __fcntl_nocancel
 int
 __libc_fcntl (int fd, int cmd, ...)
 {
@@ -167,27 +49,17 @@ __libc_fcntl (int fd, int cmd, ...)
   arg = va_arg (ap, void *);
   va_end (ap);
 
-# ifdef __ASSUME_FCNTL64
   if (SINGLE_THREAD_P || (cmd != F_SETLKW && cmd != F_SETLKW64))
     return INLINE_SYSCALL (fcntl64, 3, fd, cmd, arg);
 
   int oldtype = LIBC_CANCEL_ASYNC ();
 
   int result = INLINE_SYSCALL (fcntl64, 3, fd, cmd, arg);
-# else
-  if (SINGLE_THREAD_P || (cmd != F_SETLKW && cmd != F_SETLKW64))
-    return __fcntl_nocancel (fd, cmd, arg);
-
-  int oldtype = LIBC_CANCEL_ASYNC ();
-
-  int result = __fcntl_nocancel (fd, cmd, arg);
-# endif
 
   LIBC_CANCEL_RESET (oldtype);
 
   return result;
 }
-#endif
 libc_hidden_def (__libc_fcntl)
 
 weak_alias (__libc_fcntl, __fcntl)
diff --git a/sysdeps/unix/sysv/linux/i386/lockf64.c b/sysdeps/unix/sysv/linux/i386/lockf64.c
index 6e7603e..1caf977 100644
--- a/sysdeps/unix/sysv/linux/i386/lockf64.c
+++ b/sysdeps/unix/sysv/linux/i386/lockf64.c
@@ -1,5 +1,4 @@
-/* Copyright (C) 1994,1996,1997,1998,1999,2000,2003,2006
-	Free Software Foundation, Inc.
+/* Copyright (C) 1994-2012 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
@@ -23,66 +22,24 @@
 #include <string.h>
 #include <sysdep.h>
 
-#include <kernel-features.h>
-
 /* lockf is a simplified interface to fcntl's locking facilities.  */
 
-#ifdef __NR_fcntl64
-# if __ASSUME_FCNTL64 == 0
-/* This variable is shared with all files that check for fcntl64. The
-   declaration is in fcntl.c.  */
-extern int __have_no_fcntl64;
-# endif
-#endif
-
 int
 lockf64 (int fd, int cmd, off64_t len64)
 {
-#if __ASSUME_FCNTL64 == 0
-  struct flock fl;
-  off_t len = (off_t) len64;
-#endif
-#ifdef __NR_fcntl64
   struct flock64 fl64;
   int cmd64;
-#endif
-
-#if __ASSUME_FCNTL64 == 0
-  memset ((char *) &fl, '\0', sizeof (fl));
 
-  /* lockf is always relative to the current file position.  */
-  fl.l_whence = SEEK_CUR;
-  fl.l_start = 0;
-  fl.l_len = len;
-#endif
-#ifdef __NR_fcntl64
-# if __ASSUME_FCNTL64 == 0
-  if (!__have_no_fcntl64)
-    {
-# endif
-      memset ((char *) &fl64, '\0', sizeof (fl64));
-      fl64.l_whence = SEEK_CUR;
-      fl64.l_start = 0;
-      fl64.l_len = len64;
-# if __ASSUME_FCNTL64 == 0
-    }
-# endif
-#endif
+  memset ((char *) &fl64, '\0', sizeof (fl64));
+  fl64.l_whence = SEEK_CUR;
+  fl64.l_start = 0;
+  fl64.l_len = len64;
 
-#if __ASSUME_FCNTL64 == 0 && !defined __NR_fcntl64
-  if (len64 != (off64_t) len)
-    {
-      /* We can't represent the length.  */
-      __set_errno (EOVERFLOW);
-      return -1;
-    }
-#endif
   switch (cmd)
     {
     case F_TEST:
       /* Test the lock: return 0 if FD is unlocked or locked by this process;
 	 return -1, set errno to EACCES, if another process holds the lock.  */
-#if __ASSUME_FCNTL64 > 0
       fl64.l_type = F_RDLCK;
       if (INLINE_SYSCALL (fcntl64, 3, fd, F_GETLK64, &fl64) < 0)
         return -1;
@@ -90,104 +47,22 @@ lockf64 (int fd, int cmd, off64_t len64)
         return 0;
       __set_errno (EACCES);
       return -1;
-#else
-# ifdef __NR_fcntl64
-      if (!__have_no_fcntl64)
-	{
-	  int res;
-
-	  fl64.l_type = F_RDLCK;
-	  res = INLINE_SYSCALL (fcntl64, 3, fd, F_GETLK64, &fl64);
-	  /* If errno == ENOSYS try the 32bit interface if len64 can
-             be represented with 32 bits.  */
-
-	  if (res == 0)
-	    {
-	      if (fl64.l_type == F_UNLCK || fl64.l_pid == __getpid ())
-		return 0;
-	      __set_errno (EACCES);
-	      return -1;
-	    }
-	  else if (errno == ENOSYS)
-	    __have_no_fcntl64 = 1;
-	  else
-	    /* res < 0 && errno != ENOSYS.  */
-	    return -1;
-	  if (len64 != (off64_t) len)
-	    {
-	      /* We can't represent the length.  */
-	      __set_errno (EOVERFLOW);
-	      return -1;
-	    }
-	}
-# endif
-      fl.l_type = F_RDLCK;
-      if (__fcntl (fd, F_GETLK, &fl) < 0)
-	return -1;
-      if (fl.l_type == F_UNLCK || fl.l_pid == __getpid ())
-	return 0;
-      __set_errno (EACCES);
-      return -1;
-#endif
     case F_ULOCK:
-#if __ASSUME_FCNTL64 == 0
-      fl.l_type = F_UNLCK;
-      cmd = F_SETLK;
-#endif
-#ifdef __NR_fcntl64
       fl64.l_type = F_UNLCK;
       cmd64 = F_SETLK64;
-#endif
       break;
     case F_LOCK:
-#if __ASSUME_FCNTL64 == 0
-      fl.l_type = F_WRLCK;
-      cmd = F_SETLKW;
-#endif
-#ifdef __NR_fcntl64
       fl64.l_type = F_WRLCK;
       cmd64 = F_SETLKW64;
-#endif
       break;
     case F_TLOCK:
-#if __ASSUME_FCNTL64 == 0
-      fl.l_type = F_WRLCK;
-      cmd = F_SETLK;
-#endif
-#ifdef __NR_fcntl64
       fl64.l_type = F_WRLCK;
       cmd64 = F_SETLK64;
-#endif
       break;
 
     default:
       __set_errno (EINVAL);
       return -1;
     }
-#if __ASSUME_FCNTL64 > 0
   return INLINE_SYSCALL (fcntl64, 3, fd, cmd64, &fl64);
-#else
-# ifdef __NR_fcntl64
-
-  if (!__have_no_fcntl64)
-    {
-      int res = INLINE_SYSCALL (fcntl64, 3, fd, cmd64, &fl64);
-
-      /* If errno == ENOSYS try the 32bit interface if len64 can
-	 be represented with 32 bits.  */
-      if (res == 0 || errno != ENOSYS)
-	return res;
-
-      __have_no_fcntl64 = 1;
-
-      if (len64 != (off64_t) len)
-	{
-	  /* We can't represent the length.  */
-	  __set_errno (EOVERFLOW);
-	  return -1;
-	}
-    }
-# endif
-  return __fcntl (fd, cmd, &fl);
-#endif
 }
diff --git a/sysdeps/unix/sysv/linux/kernel-features.h b/sysdeps/unix/sysv/linux/kernel-features.h
index cfe335d..71ca40c 100644
--- a/sysdeps/unix/sysv/linux/kernel-features.h
+++ b/sysdeps/unix/sysv/linux/kernel-features.h
@@ -82,20 +82,6 @@
 # define __ASSUME_ST_INO_64_BIT		1
 #endif
 
-/* To support locking of large files a new fcntl() syscall was introduced
-   in 2.4.0-test7.  */
-#if defined __i386__ || defined __sparc__
-# define __ASSUME_FCNTL64		1
-#endif
-
-/* Arm got fcntl64 in 2.4.4, PowerPC and SH have it also in 2.4.4 (I
-   don't know when it got introduced).  But PowerPC64 does not support
-   separate FCNTL64 call, FCNTL is already 64-bit */
-#if (defined __powerpc__ || defined __sh__) \
-    && !defined __powerpc64__
-# define __ASSUME_FCNTL64		1
-#endif
-
 /* The getdents64 syscall was introduced in 2.4.0-test7 (but later for
    MIPS n32).  */
 #define __ASSUME_GETDENTS64_SYSCALL	1

-- 
Joseph S. Myers
joseph@codesourcery.com


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