patches/glibc/ports-2.13/490-alpha_alpha-add-fdatasync-support.patch
author "Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
Tue May 03 00:19:56 2011 +0200 (2011-05-03)
changeset 2438 2ba5655f6297
permissions -rw-r--r--
libc/glibc: add 2.13

Patchset provided by "Ioannis E. Venetis" <venetis@mail.capsl.udel.edu>
http://sourceware.org/ml/crossgcc/2011-04/msg00072.html
http://sourceware.org/ml/crossgcc/2011-04/msg00073.html

Signed-off-by: "Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
yann@2438
     1
2009-07-25  Aurelien Jarno  <aurelien@aurel32.net>
yann@2438
     2
yann@2438
     3
	* sysdeps/unix/sysv/linux/kernel-features.h: define 
yann@2438
     4
	__ASSUME_FDATASYNC. 
yann@2438
     5
	* sysdeps/unix/sysv/linux/fdatasync.c: New file.
yann@2438
     6
	* sysdeps/unix/sysv/linux/Makefile: compile fdatasync.c with
yann@2438
     7
	-fexceptions.
yann@2438
     8
	* sysdeps/unix/sysv/linux/syscalls.list: Remove fdatasync.
yann@2438
     9
yann@2438
    10
 sysdeps/unix/sysv/linux/Makefile          |    1 
yann@2438
    11
 sysdeps/unix/sysv/linux/fdatasync.c       |   69 ++++++++++++++++++++++++++++++
yann@2438
    12
 sysdeps/unix/sysv/linux/kernel-features.h |    6 ++
yann@2438
    13
 sysdeps/unix/sysv/linux/syscalls.list     |    1 
yann@2438
    14
 4 files changed, 76 insertions(+), 1 deletion(-)
yann@2438
    15
yann@2438
    16
diff -durN glibc-2.13.orig/sysdeps/unix/sysv/linux/Makefile glibc-2.13/sysdeps/unix/sysv/linux/Makefile
yann@2438
    17
--- glibc-2.13.orig/sysdeps/unix/sysv/linux/Makefile	2009-03-02 17:15:13.000000000 +0100
yann@2438
    18
+++ glibc-2.13/sysdeps/unix/sysv/linux/Makefile	2009-11-13 00:51:04.000000000 +0100
yann@2438
    19
@@ -20,6 +20,7 @@
yann@2438
    20
 		   setfsuid setfsgid makedev epoll_pwait signalfd \
yann@2438
    21
 		   eventfd eventfd_read eventfd_write prlimit
yann@2438
    22
 
yann@2438
    23
+CFLAGS-fdatasync.c = -fexceptions
yann@2438
    24
 CFLAGS-gethostid.c = -fexceptions
yann@2438
    25
 
yann@2438
    26
 sysdep_headers += sys/mount.h sys/acct.h sys/sysctl.h \
yann@2438
    27
diff -durN glibc-2.13.orig/sysdeps/unix/sysv/linux/fdatasync.c glibc-2.13/sysdeps/unix/sysv/linux/fdatasync.c
yann@2438
    28
--- glibc-2.13.orig/sysdeps/unix/sysv/linux/fdatasync.c	1970-01-01 01:00:00.000000000 +0100
yann@2438
    29
+++ glibc-2.13/sysdeps/unix/sysv/linux/fdatasync.c	2009-11-13 00:51:04.000000000 +0100
yann@2438
    30
@@ -0,0 +1,69 @@
yann@2438
    31
+/* fdatasync -- synchronize at least the data part of a file with 
yann@2438
    32
+   the underlying media. Linux version. 
yann@2438
    33
+
yann@2438
    34
+   Copyright (C) 2007 Free Software Foundation, Inc.
yann@2438
    35
+   This file is part of the GNU C Library.
yann@2438
    36
+
yann@2438
    37
+   The GNU C Library is free software; you can redistribute it and/or
yann@2438
    38
+   modify it under the terms of the GNU Lesser General Public
yann@2438
    39
+   License as published by the Free Software Foundation; either
yann@2438
    40
+   version 2.1 of the License, or (at your option) any later version.
yann@2438
    41
+
yann@2438
    42
+   The GNU C Library is distributed in the hope that it will be useful,
yann@2438
    43
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
yann@2438
    44
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
yann@2438
    45
+   Lesser General Public License for more details.
yann@2438
    46
+
yann@2438
    47
+   You should have received a copy of the GNU Lesser General Public
yann@2438
    48
+   License along with the GNU C Library; if not, write to the Free
yann@2438
    49
+   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
yann@2438
    50
+   02111-1307 USA.  */
yann@2438
    51
+
yann@2438
    52
+#include <errno.h>
yann@2438
    53
+#include <unistd.h>
yann@2438
    54
+
yann@2438
    55
+#include <sysdep-cancel.h>
yann@2438
    56
+#include <sys/syscall.h>
yann@2438
    57
+#include <bp-checks.h>
yann@2438
    58
+
yann@2438
    59
+#include <kernel-features.h>
yann@2438
    60
+
yann@2438
    61
+#if defined __NR_fdatasync && !defined __ASSUME_FDATASYNC
yann@2438
    62
+static int __have_no_fdatasync;
yann@2438
    63
+#endif
yann@2438
    64
+
yann@2438
    65
+static int
yann@2438
    66
+do_fdatasync (int fd)
yann@2438
    67
+{
yann@2438
    68
+#ifdef __ASSUME_FDATASYNC
yann@2438
    69
+  return INLINE_SYSCALL (fdatasync, 1, fd);
yann@2438
    70
+#elif defined __NR_fdatasync
yann@2438
    71
+  if (!__builtin_expect (__have_no_fdatasync, 0))
yann@2438
    72
+    {
yann@2438
    73
+      int result = INLINE_SYSCALL (fdatasync, 1, fd);
yann@2438
    74
+      if (__builtin_expect (result, 0) != -1 || errno != ENOSYS)
yann@2438
    75
+	return result;
yann@2438
    76
+
yann@2438
    77
+      __have_no_fdatasync = 1;
yann@2438
    78
+    }
yann@2438
    79
+#endif
yann@2438
    80
+  return INLINE_SYSCALL (fsync, 1, fd);
yann@2438
    81
+}
yann@2438
    82
+
yann@2438
    83
+int
yann@2438
    84
+__fdatasync (int fd)
yann@2438
    85
+{
yann@2438
    86
+  if (SINGLE_THREAD_P)
yann@2438
    87
+    return do_fdatasync (fd);
yann@2438
    88
+
yann@2438
    89
+  int oldtype = LIBC_CANCEL_ASYNC ();
yann@2438
    90
+
yann@2438
    91
+  int result = do_fdatasync (fd);
yann@2438
    92
+
yann@2438
    93
+  LIBC_CANCEL_RESET (oldtype);
yann@2438
    94
+
yann@2438
    95
+  return result;
yann@2438
    96
+}
yann@2438
    97
+
yann@2438
    98
+weak_alias (__fdatasync, fdatasync)
yann@2438
    99
+
yann@2438
   100
diff -durN glibc-2.13.orig/sysdeps/unix/sysv/linux/kernel-features.h glibc-2.13/sysdeps/unix/sysv/linux/kernel-features.h
yann@2438
   101
--- glibc-2.13.orig/sysdeps/unix/sysv/linux/kernel-features.h	2009-11-13 00:50:45.000000000 +0100
yann@2438
   102
+++ glibc-2.13/sysdeps/unix/sysv/linux/kernel-features.h	2009-11-13 00:51:04.000000000 +0100
yann@2438
   103
@@ -459,6 +459,12 @@
yann@2438
   104
 # define __ASSUME_FUTEX_LOCK_PI	1
yann@2438
   105
 #endif
yann@2438
   106
 
yann@2438
   107
+/* Support for fsyncdata syscall was added in 2.6.22 on alpha, but it
yann@2438
   108
+   was already present in 2.0 kernels on other architectures.  */
yann@2438
   109
+#if (!defined __alpha || __LINUX_KERNEL_VERSION >= 0x020616)
yann@2438
   110
+# define __ASSUME_FDATASYNC	1
yann@2438
   111
+#endif
yann@2438
   112
+
yann@2438
   113
 /* Support for utimensat syscall was added in 2.6.22, on SH
yann@2438
   114
    only after 2.6.22-rc1.  */
yann@2438
   115
 #if __LINUX_KERNEL_VERSION >= 0x020616 \
yann@2438
   116
diff -durN glibc-2.13.orig/sysdeps/unix/sysv/linux/syscalls.list glibc-2.13/sysdeps/unix/sysv/linux/syscalls.list
yann@2438
   117
--- glibc-2.13.orig/sysdeps/unix/sysv/linux/syscalls.list	2008-08-02 01:29:08.000000000 +0200
yann@2438
   118
+++ glibc-2.13/sysdeps/unix/sysv/linux/syscalls.list	2009-11-13 00:51:04.000000000 +0100
yann@2438
   119
@@ -11,7 +11,6 @@
yann@2438
   120
 epoll_create1	EXTRA	epoll_create1	i:i	epoll_create1
yann@2438
   121
 epoll_ctl	EXTRA	epoll_ctl	i:iiip	epoll_ctl
yann@2438
   122
 epoll_wait	EXTRA	epoll_wait	Ci:ipii	epoll_wait
yann@2438
   123
-fdatasync	-	fdatasync	Ci:i	fdatasync
yann@2438
   124
 flock		-	flock		i:ii	__flock		flock
yann@2438
   125
 fork		-	fork		i:	__libc_fork	__fork fork
yann@2438
   126
 get_kernel_syms	EXTRA	get_kernel_syms	i:p	get_kernel_syms