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