yann@2438: 2009-07-25 Aurelien Jarno yann@2438: yann@2438: * sysdeps/unix/sysv/linux/kernel-features.h: define yann@2438: __ASSUME_FDATASYNC. yann@2438: * sysdeps/unix/sysv/linux/fdatasync.c: New file. yann@2438: * sysdeps/unix/sysv/linux/Makefile: compile fdatasync.c with yann@2438: -fexceptions. yann@2438: * sysdeps/unix/sysv/linux/syscalls.list: Remove fdatasync. yann@2438: yann@2438: sysdeps/unix/sysv/linux/Makefile | 1 yann@2438: sysdeps/unix/sysv/linux/fdatasync.c | 69 ++++++++++++++++++++++++++++++ yann@2438: sysdeps/unix/sysv/linux/kernel-features.h | 6 ++ yann@2438: sysdeps/unix/sysv/linux/syscalls.list | 1 yann@2438: 4 files changed, 76 insertions(+), 1 deletion(-) yann@2438: yann@2438: diff -durN glibc-2.13.orig/sysdeps/unix/sysv/linux/Makefile glibc-2.13/sysdeps/unix/sysv/linux/Makefile yann@2438: --- glibc-2.13.orig/sysdeps/unix/sysv/linux/Makefile 2009-03-02 17:15:13.000000000 +0100 yann@2438: +++ glibc-2.13/sysdeps/unix/sysv/linux/Makefile 2009-11-13 00:51:04.000000000 +0100 yann@2438: @@ -20,6 +20,7 @@ yann@2438: setfsuid setfsgid makedev epoll_pwait signalfd \ yann@2438: eventfd eventfd_read eventfd_write prlimit yann@2438: yann@2438: +CFLAGS-fdatasync.c = -fexceptions yann@2438: CFLAGS-gethostid.c = -fexceptions yann@2438: yann@2438: sysdep_headers += sys/mount.h sys/acct.h sys/sysctl.h \ yann@2438: diff -durN glibc-2.13.orig/sysdeps/unix/sysv/linux/fdatasync.c glibc-2.13/sysdeps/unix/sysv/linux/fdatasync.c yann@2438: --- glibc-2.13.orig/sysdeps/unix/sysv/linux/fdatasync.c 1970-01-01 01:00:00.000000000 +0100 yann@2438: +++ glibc-2.13/sysdeps/unix/sysv/linux/fdatasync.c 2009-11-13 00:51:04.000000000 +0100 yann@2438: @@ -0,0 +1,69 @@ yann@2438: +/* fdatasync -- synchronize at least the data part of a file with yann@2438: + the underlying media. Linux version. yann@2438: + yann@2438: + Copyright (C) 2007 Free Software Foundation, Inc. yann@2438: + This file is part of the GNU C Library. yann@2438: + yann@2438: + The GNU C Library is free software; you can redistribute it and/or yann@2438: + modify it under the terms of the GNU Lesser General Public yann@2438: + License as published by the Free Software Foundation; either yann@2438: + version 2.1 of the License, or (at your option) any later version. yann@2438: + yann@2438: + The GNU C Library is distributed in the hope that it will be useful, yann@2438: + but WITHOUT ANY WARRANTY; without even the implied warranty of yann@2438: + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU yann@2438: + Lesser General Public License for more details. yann@2438: + yann@2438: + You should have received a copy of the GNU Lesser General Public yann@2438: + License along with the GNU C Library; if not, write to the Free yann@2438: + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA yann@2438: + 02111-1307 USA. */ yann@2438: + yann@2438: +#include yann@2438: +#include yann@2438: + yann@2438: +#include yann@2438: +#include yann@2438: +#include yann@2438: + yann@2438: +#include yann@2438: + yann@2438: +#if defined __NR_fdatasync && !defined __ASSUME_FDATASYNC yann@2438: +static int __have_no_fdatasync; yann@2438: +#endif yann@2438: + yann@2438: +static int yann@2438: +do_fdatasync (int fd) yann@2438: +{ yann@2438: +#ifdef __ASSUME_FDATASYNC yann@2438: + return INLINE_SYSCALL (fdatasync, 1, fd); yann@2438: +#elif defined __NR_fdatasync yann@2438: + if (!__builtin_expect (__have_no_fdatasync, 0)) yann@2438: + { yann@2438: + int result = INLINE_SYSCALL (fdatasync, 1, fd); yann@2438: + if (__builtin_expect (result, 0) != -1 || errno != ENOSYS) yann@2438: + return result; yann@2438: + yann@2438: + __have_no_fdatasync = 1; yann@2438: + } yann@2438: +#endif yann@2438: + return INLINE_SYSCALL (fsync, 1, fd); yann@2438: +} yann@2438: + yann@2438: +int yann@2438: +__fdatasync (int fd) yann@2438: +{ yann@2438: + if (SINGLE_THREAD_P) yann@2438: + return do_fdatasync (fd); yann@2438: + yann@2438: + int oldtype = LIBC_CANCEL_ASYNC (); yann@2438: + yann@2438: + int result = do_fdatasync (fd); yann@2438: + yann@2438: + LIBC_CANCEL_RESET (oldtype); yann@2438: + yann@2438: + return result; yann@2438: +} yann@2438: + yann@2438: +weak_alias (__fdatasync, fdatasync) yann@2438: + yann@2438: 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: --- glibc-2.13.orig/sysdeps/unix/sysv/linux/kernel-features.h 2009-11-13 00:50:45.000000000 +0100 yann@2438: +++ glibc-2.13/sysdeps/unix/sysv/linux/kernel-features.h 2009-11-13 00:51:04.000000000 +0100 yann@2438: @@ -459,6 +459,12 @@ yann@2438: # define __ASSUME_FUTEX_LOCK_PI 1 yann@2438: #endif yann@2438: yann@2438: +/* Support for fsyncdata syscall was added in 2.6.22 on alpha, but it yann@2438: + was already present in 2.0 kernels on other architectures. */ yann@2438: +#if (!defined __alpha || __LINUX_KERNEL_VERSION >= 0x020616) yann@2438: +# define __ASSUME_FDATASYNC 1 yann@2438: +#endif yann@2438: + yann@2438: /* Support for utimensat syscall was added in 2.6.22, on SH yann@2438: only after 2.6.22-rc1. */ yann@2438: #if __LINUX_KERNEL_VERSION >= 0x020616 \ yann@2438: diff -durN glibc-2.13.orig/sysdeps/unix/sysv/linux/syscalls.list glibc-2.13/sysdeps/unix/sysv/linux/syscalls.list yann@2438: --- glibc-2.13.orig/sysdeps/unix/sysv/linux/syscalls.list 2008-08-02 01:29:08.000000000 +0200 yann@2438: +++ glibc-2.13/sysdeps/unix/sysv/linux/syscalls.list 2009-11-13 00:51:04.000000000 +0100 yann@2438: @@ -11,7 +11,6 @@ yann@2438: epoll_create1 EXTRA epoll_create1 i:i epoll_create1 yann@2438: epoll_ctl EXTRA epoll_ctl i:iiip epoll_ctl yann@2438: epoll_wait EXTRA epoll_wait Ci:ipii epoll_wait yann@2438: -fdatasync - fdatasync Ci:i fdatasync yann@2438: flock - flock i:ii __flock flock yann@2438: fork - fork i: __libc_fork __fork fork yann@2438: get_kernel_syms EXTRA get_kernel_syms i:p get_kernel_syms