From 748876bf1c45cd10f998f8578c434156eae53b7e Mon Sep 17 00:00:00 2001 From: Ulrich Drepper Date: Fri, 1 Apr 2011 11:15:08 -0400 Subject: [PATCH] Really implement fallocate{,64} and sync_file_range as cancellation points. --- ChangeLog | 15 +++++++- io/Makefile | 5 ++- sysdeps/unix/sysv/linux/fallocate.c | 22 +++++++++--- sysdeps/unix/sysv/linux/{i386 => }/fallocate64.c | 34 +++++++++++------- sysdeps/unix/sysv/linux/i386/fallocate.c | 16 +++++++-- sysdeps/unix/sysv/linux/i386/fallocate64.c | 16 +++++++-- sysdeps/unix/sysv/linux/sync_file_range.c | 43 ++++++++++++++++++----- sysdeps/unix/sysv/linux/wordsize-64/fallocate.c | 16 +++++++-- sysdeps/unix/sysv/linux/wordsize-64/syscalls.list | 2 +- 9 files changed, 130 insertions(+), 39 deletions(-) copy sysdeps/unix/sysv/linux/{i386 => }/fallocate64.c (62%) diff --git a/ChangeLog b/ChangeLog index 7ab2090233..806732d70e 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,7 +1,20 @@ +2011-04-01 Ulrich Drepper + + * io/Makefile: Compile fallocate.c, fallocate64.c, and + sync_file_range.c with -fexceptions. + * sysdeps/unix/sysv/linux/fallocate.c: Make cancelable. + * sysdeps/unix/sysv/linux/fallocate64.c: Likewise. + * sysdeps/unix/sysv/linux/i386/fallocate.c: Likewise. + * sysdeps/unix/sysv/linux/i386/fallocate64.c: Likewise. + * sysdeps/unix/sysv/linux/wordsize-64/fallocate.c: Likewise. + * sysdeps/unix/sysv/linux/sync_file_range.c: Likewise. + * sysdeps/unix/sysv/linux/wordsize-64/syscalls.list: Mark + sync_file_range as cancellation point. + 2011-04-01 Andreas Schwab * sysdeps/unix/sysv/linux/Makefile (sysdep_headers): Add - bits/timex.h + bits/timex.h. 2011-04-01 Ulrich Drepper diff --git a/io/Makefile b/io/Makefile index caaa51b351..0f3b555446 100644 --- a/io/Makefile +++ b/io/Makefile @@ -1,4 +1,4 @@ -# Copyright (C) 1992-2003,2005,2006,2007,2008 Free Software Foundation, Inc. +# Copyright (C) 1992-2003,2005-2008,2011 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 @@ -90,6 +90,9 @@ CFLAGS-ftw64.c = $(uses-callbacks) -fexceptions CFLAGS-lockf.c = -fexceptions CFLAGS-posix_fallocate.c = -fexceptions CFLAGS-posix_fallocate64.c = -fexceptions +CFLAGS-fallocate.c = -fexceptions +CFLAGS-fallocate64.c = -fexceptions +CFLAGS-sync_file_range.c = -fexceptions CFLAGS-test-stat.c = -D_FILE_OFFSET_BITS=64 -D_LARGEFILE64_SOURCE CFLAGS-test-lfs.c = -D_LARGEFILE64_SOURCE diff --git a/sysdeps/unix/sysv/linux/fallocate.c b/sysdeps/unix/sysv/linux/fallocate.c index dc2b4e92ca..a7d3ff079b 100644 --- a/sysdeps/unix/sysv/linux/fallocate.c +++ b/sysdeps/unix/sysv/linux/fallocate.c @@ -1,4 +1,4 @@ -/* Copyright (C) 2007, 2009 Free Software Foundation, Inc. +/* Copyright (C) 2007, 2009, 2011 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 @@ -18,7 +18,7 @@ #include #include -#include +#include /* Reserve storage for the data of the file associated with FD. */ @@ -26,9 +26,21 @@ int fallocate (int fd, int mode, __off_t offset, __off_t len) { #ifdef __NR_fallocate - return INLINE_SYSCALL (fallocate, 6, fd, mode, - __LONG_LONG_PAIR (offset >> 31, offset), - __LONG_LONG_PAIR (len >> 31, len)); + if (SINGLE_THREAD_P) + return INLINE_SYSCALL (fallocate, 6, fd, mode, + __LONG_LONG_PAIR (offset >> 31, offset), + __LONG_LONG_PAIR (len >> 31, len)); + + int result; + int oldtype = LIBC_CANCEL_ASYNC (); + + result = INLINE_SYSCALL (fallocate, 6, fd, mode, + __LONG_LONG_PAIR (offset >> 31, offset), + __LONG_LONG_PAIR (len >> 31, len)); + + LIBC_CANCEL_RESET (oldtype); + + return result; #else __set_errno (ENOSYS); return -1; diff --git a/sysdeps/unix/sysv/linux/i386/fallocate64.c b/sysdeps/unix/sysv/linux/fallocate64.c similarity index 62% copy from sysdeps/unix/sysv/linux/i386/fallocate64.c copy to sysdeps/unix/sysv/linux/fallocate64.c index 063bab06e9..5cfd76d399 100644 --- a/sysdeps/unix/sysv/linux/i386/fallocate64.c +++ b/sysdeps/unix/sysv/linux/fallocate64.c @@ -1,4 +1,4 @@ -/* Copyright (C) 2007, 2009 Free Software Foundation, Inc. +/* Copyright (C) 2007, 2009, 2011 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 @@ -18,11 +18,7 @@ #include #include -#include - - -extern int __call_fallocate (int fd, int mode, __off64_t offset, __off64_t len) - attribute_hidden; +#include /* Reserve storage for the data of the file associated with FD. */ @@ -30,13 +26,25 @@ int fallocate64 (int fd, int mode, __off64_t offset, __off64_t len) { #ifdef __NR_fallocate - int err = __call_fallocate (fd, mode, offset, len); - if (__builtin_expect (err, 0)) - { - __set_errno (err); - err = -1; - } - return err; + if (SINGLE_THREAD_P) + return INLINE_SYSCALL (fallocate, 6, fd, mode, + __LONG_LONG_PAIR ((long int) (offset >> 32), + (long int) offset), + __LONG_LONG_PAIR ((long int) (len >> 32), + (long int) len)); + + int result; + int oldtype = LIBC_CANCEL_ASYNC (); + + result = INLINE_SYSCALL (fallocate, 6, fd, mode, + __LONG_LONG_PAIR ((long int) (offset >> 32), + (long int) offset), + __LONG_LONG_PAIR ((long int) (len >> 32), + (long int) len)); + + LIBC_CANCEL_RESET (oldtype); + + return result; #else __set_errno (ENOSYS); return -1; diff --git a/sysdeps/unix/sysv/linux/i386/fallocate.c b/sysdeps/unix/sysv/linux/i386/fallocate.c index 1434a833f9..33e20753d1 100644 --- a/sysdeps/unix/sysv/linux/i386/fallocate.c +++ b/sysdeps/unix/sysv/linux/i386/fallocate.c @@ -1,4 +1,4 @@ -/* Copyright (C) 2007, 2009 Free Software Foundation, Inc. +/* Copyright (C) 2007, 2009, 2011 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 @@ -18,7 +18,7 @@ #include #include -#include +#include extern int __call_fallocate (int fd, int mode, __off64_t offset, __off64_t len) @@ -30,7 +30,17 @@ int fallocate (int fd, int mode, __off_t offset, __off_t len) { #ifdef __NR_fallocate - int err = __call_fallocate (fd, mode, offset, len); + int err; + if (SINGLE_THREAD_P) + err = __call_fallocate (fd, mode, offset, len); + else + { + int oldtype = LIBC_CANCEL_ASYNC (); + + err = __call_fallocate (fd, mode, offset, len); + + LIBC_CANCEL_RESET (oldtype); + } if (__builtin_expect (err, 0)) { __set_errno (err); diff --git a/sysdeps/unix/sysv/linux/i386/fallocate64.c b/sysdeps/unix/sysv/linux/i386/fallocate64.c index 063bab06e9..83372a92f1 100644 --- a/sysdeps/unix/sysv/linux/i386/fallocate64.c +++ b/sysdeps/unix/sysv/linux/i386/fallocate64.c @@ -1,4 +1,4 @@ -/* Copyright (C) 2007, 2009 Free Software Foundation, Inc. +/* Copyright (C) 2007, 2009, 2011 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 @@ -18,7 +18,7 @@ #include #include -#include +#include extern int __call_fallocate (int fd, int mode, __off64_t offset, __off64_t len) @@ -30,7 +30,17 @@ int fallocate64 (int fd, int mode, __off64_t offset, __off64_t len) { #ifdef __NR_fallocate - int err = __call_fallocate (fd, mode, offset, len); + int err; + if (SINGLE_THREAD_P) + err = __call_fallocate (fd, mode, offset, len); + else + { + int oldtype = LIBC_CANCEL_ASYNC (); + + err = __call_fallocate (fd, mode, offset, len); + + LIBC_CANCEL_RESET (oldtype); + } if (__builtin_expect (err, 0)) { __set_errno (err); diff --git a/sysdeps/unix/sysv/linux/sync_file_range.c b/sysdeps/unix/sysv/linux/sync_file_range.c index 41e08e0281..1b20d6ce0f 100644 --- a/sysdeps/unix/sysv/linux/sync_file_range.c +++ b/sysdeps/unix/sysv/linux/sync_file_range.c @@ -1,5 +1,5 @@ /* Selective file content synch'ing. - Copyright (C) 2006, 2007, 2009 Free Software Foundation, Inc. + Copyright (C) 2006, 2007, 2009, 2011 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 @@ -21,7 +21,7 @@ #include #include -#include +#include #include @@ -29,18 +29,43 @@ int sync_file_range (int fd, __off64_t from, __off64_t to, unsigned int flags) { - return INLINE_SYSCALL (sync_file_range, 6, fd, - __LONG_LONG_PAIR ((long) (from >> 32), (long) from), - __LONG_LONG_PAIR ((long) (to >> 32), (long) to), - flags); + if (SINGLE_THREAD_P) + return INLINE_SYSCALL (sync_file_range, 6, fd, + __LONG_LONG_PAIR ((long) (from >> 32), (long) from), + __LONG_LONG_PAIR ((long) (to >> 32), (long) to), + flags); + + int result; + int oldtype = LIBC_CANCEL_ASYNC (); + + result = INLINE_SYSCALL (sync_file_range, 6, fd, + __LONG_LONG_PAIR ((long) (from >> 32), (long) from), + __LONG_LONG_PAIR ((long) (to >> 32), (long) to), + flags); + + LIBC_CANCEL_RESET (oldtype); + + return result; } #elif defined __NR_sync_file_range2 int sync_file_range (int fd, __off64_t from, __off64_t to, unsigned int flags) { - return INLINE_SYSCALL (sync_file_range2, 6, fd, flags, - __LONG_LONG_PAIR ((long) (from >> 32), (long) from), - __LONG_LONG_PAIR ((long) (to >> 32), (long) to)); + if (SINGLE_THREAD_P) + return INLINE_SYSCALL (sync_file_range2, 6, fd, flags, + __LONG_LONG_PAIR ((long) (from >> 32), (long) from), + __LONG_LONG_PAIR ((long) (to >> 32), (long) to)); + + int result; + int oldtype = LIBC_CANCEL_ASYNC (); + + result = INLINE_SYSCALL (sync_file_range2, 6, fd, flags, + __LONG_LONG_PAIR ((long) (from >> 32), (long) from), + __LONG_LONG_PAIR ((long) (to >> 32), (long) to)); + + LIBC_CANCEL_RESET (oldtype); + + return result; } #else int diff --git a/sysdeps/unix/sysv/linux/wordsize-64/fallocate.c b/sysdeps/unix/sysv/linux/wordsize-64/fallocate.c index 3e8954f0b7..fc08b7be56 100644 --- a/sysdeps/unix/sysv/linux/wordsize-64/fallocate.c +++ b/sysdeps/unix/sysv/linux/wordsize-64/fallocate.c @@ -1,4 +1,4 @@ -/* Copyright (C) 2007, 2009 Free Software Foundation, Inc. +/* Copyright (C) 2007, 2009, 2011 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 @@ -18,7 +18,7 @@ #include #include -#include +#include /* Reserve storage for the data of the file associated with FD. */ @@ -26,7 +26,17 @@ int fallocate (int fd, int mode, __off_t offset, __off_t len) { #ifdef __NR_fallocate - return INLINE_SYSCALL (fallocate, 4, fd, mode, offset, len); + if (SINGLE_THREAD_P) + return INLINE_SYSCALL (fallocate, 4, fd, mode, offset, len); + + int result; + int oldtype = LIBC_CANCEL_ASYNC (); + + result = INLINE_SYSCALL (fallocate, 4, fd, mode, offset, len); + + LIBC_CANCEL_RESET (oldtype); + + return result; #else __set_errno (ENOSYS); return -1; diff --git a/sysdeps/unix/sysv/linux/wordsize-64/syscalls.list b/sysdeps/unix/sysv/linux/wordsize-64/syscalls.list index fda3db1ded..74732ab98b 100644 --- a/sysdeps/unix/sysv/linux/wordsize-64/syscalls.list +++ b/sysdeps/unix/sysv/linux/wordsize-64/syscalls.list @@ -14,7 +14,7 @@ getrlimit - getrlimit i:ip __getrlimit getrlimit getrlimit64 setrlimit - setrlimit i:ip __setrlimit setrlimit setrlimit64 readahead - readahead i:iii __readahead readahead sendfile - sendfile i:iipi sendfile sendfile64 -sync_file_range - sync_file_range i:iiii sync_file_range +sync_file_range - sync_file_range Ci:iiii sync_file_range creat - creat Ci:si __libc_creat creat creat64 open - open Ci:siv __libc_open __open open __open64 open64 prlimit EXTRA prlimit64 i:iipp prlimit prlimit64 -- 2.11.4.GIT