Message ID | 1471617709-16267-4-git-send-email-adhemerval.zanella@linaro.org |
---|---|
State | New |
Headers | show |
On Fri, Aug 19, 2016 at 11:41:48AM -0300, Adhemerval Zanella wrote: > This patch consolidates all the posix_fallocate{64} implementation for Linux > in only one (sysdeps/unix/sysv/linux/posix_fallocate{64}.c). It also removes > the syscall from the auto-generation using assembly macros. > > The macro SYSCALL_LL{64} is used to handle the offset argument along with > the new INTERNAL_SYSCALL_CALL macro to define correct argument count for > internal INTERNAL_SYSCALL call. > > Tested on x86_64, i686, x32, aarch64, ppc64le, and armhf. > > * sysdeps/unix/sysv/linux/mips/mips64/n32/posix_fallocate.c: Remove > file. > * sysdeps/unix/sysv/linux/mips/mips64/n32/posix_fallocate64.c: > Likewise. > * sysdeps/unix/sysv/linux/mips/mips64/n64/posix_fallocate.c: Likewise. > * sysdeps/unix/sysv/linux/mips/mips64/n64/posix_fallocate64.c: > Likewise. > * sysdeps/unix/sysv/linux/wordsize-64/posix_fallocate.c: Likewise. > * sysdeps/unix/sysv/linux/wordsize-64/posix_fallocate64.c: Likewise. > * sysdeps/unix/sysv/linux/posix_fallocate.c (posix_fallocate): Use > SYSCALL_LL to pass both offset and len arguments. > * sysdeps/unix/sysv/linux/posix_fallocate64.c (posix_fallocate64): > Likewise. > --- > io/Makefile | 2 +- > io/tst-posix_fallocate-common.c | 92 ++++++++++++++++++ > io/tst-posix_fallocate.c | 107 ++++----------------- > io/tst-posix_fallocate64.c | 44 +++++++++ > .../sysv/linux/mips/mips64/n32/posix_fallocate.c | 37 ------- > .../sysv/linux/mips/mips64/n32/posix_fallocate64.c | 38 -------- > .../sysv/linux/mips/mips64/n64/posix_fallocate.c | 1 - > .../sysv/linux/mips/mips64/n64/posix_fallocate64.c | 1 - > sysdeps/unix/sysv/linux/posix_fallocate.c | 6 +- > sysdeps/unix/sysv/linux/posix_fallocate64.c | 8 +- > .../unix/sysv/linux/wordsize-64/posix_fallocate.c | 46 --------- > .../sysv/linux/wordsize-64/posix_fallocate64.c | 1 - > 13 files changed, 180 insertions(+), 222 deletions(-) > create mode 100644 io/tst-posix_fallocate-common.c > create mode 100644 io/tst-posix_fallocate64.c > delete mode 100644 sysdeps/unix/sysv/linux/mips/mips64/n32/posix_fallocate.c > delete mode 100644 sysdeps/unix/sysv/linux/mips/mips64/n32/posix_fallocate64.c > delete mode 100644 sysdeps/unix/sysv/linux/mips/mips64/n64/posix_fallocate.c > delete mode 100644 sysdeps/unix/sysv/linux/mips/mips64/n64/posix_fallocate64.c > delete mode 100644 sysdeps/unix/sysv/linux/wordsize-64/posix_fallocate.c > delete mode 100644 sysdeps/unix/sysv/linux/wordsize-64/posix_fallocate64.c > > diff --git a/io/Makefile b/io/Makefile > index deb6100..20fe3de 100644 > --- a/io/Makefile > +++ b/io/Makefile > @@ -71,7 +71,7 @@ tests := test-utime test-stat test-stat2 test-lfs tst-getcwd \ > tst-renameat tst-fchownat tst-fchmodat tst-faccessat \ > tst-symlinkat tst-linkat tst-readlinkat tst-mkdirat \ > tst-mknodat tst-mkfifoat tst-ttyname_r bug-ftw5 \ > - tst-posix_fallocate tst-fts tst-fts-lfs > + tst-posix_fallocate tst-posix_fallocate64 tst-fts tst-fts-lfs > > ifeq ($(run-built-tests),yes) > tests-special += $(objpfx)ftwtest.out > diff --git a/io/tst-posix_fallocate-common.c b/io/tst-posix_fallocate-common.c > new file mode 100644 > index 0000000..42d6ec6 > --- /dev/null > +++ b/io/tst-posix_fallocate-common.c > @@ -0,0 +1,92 @@ > +/* Common posix_fallocate tests definitions. > + Copyright (C) 2016 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 > + modify it under the terms of the GNU Lesser General Public > + License as published by the Free Software Foundation; either > + version 2.1 of the License, or (at your option) any later version. > + > + The GNU C Library is distributed in the hope that it will be useful, > + but WITHOUT ANY WARRANTY; without even the implied warranty of > + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU > + Lesser General Public License for more details. > + > + You should have received a copy of the GNU Lesser General Public > + License along with the GNU C Library; if not, see > + <http://www.gnu.org/licenses/>. */ > + > +#include <fcntl.h> > +#include <sys/types.h> > +#include <sys/stat.h> > +#include <unistd.h> > + > +static void do_prepare (void); > +#define PREPARE(argc, argv) do_prepare () Trailing whitespace > +static int do_test (void); > +#define TEST_FUNCTION do_test () > + > +#define TIMEOUT 20 /* sec. */ > + > +#include <test-skeleton.c> > + > +static char *temp_filename; > +static int temp_fd; > + > +static void > +do_prepare (void) > +{ > + temp_fd = create_temp_file ("tst-posix_fallocate.", &temp_filename); > + if (temp_fd == -1) > + { > + printf ("cannot create temporary file: %m\n"); > + exit (1); > + } > +} > + > +#define FAIL(str) \ > + do { printf ("error: %s (line %d)\n", str, __LINE__); return 1; } while (0) > + > +static int > +do_test_with_offset (off_t offset) > +{ > + struct stat st; > + > + if (posix_fallocate (temp_fd, offset, 768) != 0) > + FAIL ("1st posix_fallocate call failed"); > + > + if (fstat (temp_fd, &st) != 0) > + FAIL ("2nd fstat failed"); > + > + if (st.st_size != (offset + 768)) > + { > + printf ("file size after first posix_fallocate call is %llu, expected %u\n", > + (unsigned long long int) st.st_size, 512u + 768u); > + return 1; > + } > + > + if (posix_fallocate (temp_fd, 0, 1024) != 0) > + FAIL ("2nd posix_fallocate call failed"); > + > + if (fstat (temp_fd, &st) != 0) > + FAIL ("3rd fstat failed"); > + > + if (st.st_size != (offset) + 768) > + FAIL ("file size changed in second posix_fallocate"); > + > + offset += 2048; > + if (posix_fallocate (temp_fd, offset, 64) != 0) > + FAIL ("3rd posix_fallocate call failed"); > + > + if (fstat (temp_fd, &st) != 0) > + FAIL ("4th fstat failed"); > + > + if (st.st_size != (offset + 64)) > + { > + printf ("file size after first posix_fallocate call is %llu, expected %u\n", > + (unsigned long long int) st.st_size, 2048u + 64u); > + return 1; > + } > + > + return 0; > +} > diff --git a/io/tst-posix_fallocate.c b/io/tst-posix_fallocate.c > index 53f0704..59f3fa1 100644 > --- a/io/tst-posix_fallocate.c > +++ b/io/tst-posix_fallocate.c > @@ -1,100 +1,33 @@ > -#include <fcntl.h> > -#include <sys/stat.h> > +/* Basic posix_fallocate tests. > + Copyright (C) 2016 Free Software Foundation, Inc. > + This file is part of the GNU C Library. > > -static void do_prepare (void); > -#define PREPARE(argc, argv) do_prepare () > -static int do_test (void); > -#define TEST_FUNCTION do_test () > -#include <test-skeleton.c> > + The GNU C Library is free software; you can redistribute it and/or > + modify it under the terms of the GNU Lesser General Public > + License as published by the Free Software Foundation; either > + version 2.1 of the License, or (at your option) any later version. > > -static int fd; > + The GNU C Library is distributed in the hope that it will be useful, > + but WITHOUT ANY WARRANTY; without even the implied warranty of > + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU > + Lesser General Public License for more details. > > -static void > -do_prepare (void) > -{ > - fd = create_temp_file ("tst-posix_fallocate.", NULL); > - if (fd == -1) > - { > - printf ("cannot create temporary file: %m\n"); > - exit (1); > - } > -} > + You should have received a copy of the GNU Lesser General Public > + License along with the GNU C Library; if not, see > + <http://www.gnu.org/licenses/>. */ > > +#include "tst-posix_fallocate-common.c" > > static int > do_test (void) > { > - struct stat64 st; > + struct stat st; > > - if (fstat64 (fd, &st) != 0) > - { > - puts ("1st fstat failed"); > - return 1; > - } > + if (fstat (temp_fd, &st) != 0) > + FAIL ("1st fstat failed"); > > if (st.st_size != 0) > - { > - puts ("file not created with size 0"); > - return 1; > - } > - > - if (posix_fallocate (fd, 512, 768) != 0) > - { > - puts ("1st posix_fallocate call failed"); > - return 1; > - } > - > - if (fstat64 (fd, &st) != 0) > - { > - puts ("2nd fstat failed"); > - return 1; > - } > - > - if (st.st_size != 512 + 768) > - { > - printf ("file size after first posix_fallocate call is %llu, expected %u\n", > - (unsigned long long int) st.st_size, 512u + 768u); > - return 1; > - } > - > - if (posix_fallocate (fd, 0, 1024) != 0) > - { > - puts ("2nd posix_fallocate call failed"); > - return 1; > - } > - > - if (fstat64 (fd, &st) != 0) > - { > - puts ("3rd fstat failed"); > - return 1; > - } > - > - if (st.st_size != 512 + 768) > - { > - puts ("file size changed in second posix_fallocate"); > - return 1; > - } > - > - if (posix_fallocate (fd, 2048, 64) != 0) > - { > - puts ("3rd posix_fallocate call failed"); > - return 1; > - } > - > - if (fstat64 (fd, &st) != 0) > - { > - puts ("4th fstat failed"); > - return 1; > - } > - > - if (st.st_size != 2048 + 64) > - { > - printf ("file size after first posix_fallocate call is %llu, expected %u\n", > - (unsigned long long int) st.st_size, 2048u + 64u); > - return 1; > - } > - > - close (fd); > + FAIL ("file not created with size 0"); > > - return 0; > + return do_test_with_offset (512); > } > diff --git a/io/tst-posix_fallocate64.c b/io/tst-posix_fallocate64.c > new file mode 100644 > index 0000000..cbb57ff > --- /dev/null > +++ b/io/tst-posix_fallocate64.c > @@ -0,0 +1,44 @@ > +/* Basic posix_fallocate tests (with _FILE_OFFSET_BITS). > + Copyright (C) 2016 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 > + modify it under the terms of the GNU Lesser General Public > + License as published by the Free Software Foundation; either > + version 2.1 of the License, or (at your option) any later version. > + > + The GNU C Library is distributed in the hope that it will be useful, > + but WITHOUT ANY WARRANTY; without even the implied warranty of > + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU > + Lesser General Public License for more details. > + > + You should have received a copy of the GNU Lesser General Public > + License along with the GNU C Library; if not, see > + <http://www.gnu.org/licenses/>. */ > + > +#define _FILE_OFFSET_BITS 64 > +#include "tst-posix_fallocate-common.c" > + > +static int > +do_test (void) > +{ > + struct stat st; > + int ret; > + > + if (fstat (temp_fd, &st) != 0) > + FAIL ("1st fstat failed"); > + > + if (st.st_size != 0) > + FAIL ("file not created with size 0"); > + > + ret = do_test_with_offset (512); > + if (ret == -1) > + return -1; > + > + off_t base_offset = UINT32_MAX + 512LL; > + ret = do_test_with_offset (base_offset); > + if (ret == -1) > + return 1; > + > + return 0; > +} > diff --git a/sysdeps/unix/sysv/linux/mips/mips64/n32/posix_fallocate.c b/sysdeps/unix/sysv/linux/mips/mips64/n32/posix_fallocate.c > deleted file mode 100644 > index e652e5b..0000000 > --- a/sysdeps/unix/sysv/linux/mips/mips64/n32/posix_fallocate.c > +++ /dev/null > @@ -1,37 +0,0 @@ > -/* Copyright (C) 2007-2016 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 > - modify it under the terms of the GNU Lesser General Public > - License as published by the Free Software Foundation; either > - version 2.1 of the License, or (at your option) any later version. > - > - The GNU C Library is distributed in the hope that it will be useful, > - but WITHOUT ANY WARRANTY; without even the implied warranty of > - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU > - Lesser General Public License for more details. > - > - You should have received a copy of the GNU Lesser General Public > - License along with the GNU C Library. If not, see > - <http://www.gnu.org/licenses/>. */ > - > -#include <fcntl.h> > -#include <sysdep.h> > - > -#define posix_fallocate static internal_fallocate > -#include <sysdeps/posix/posix_fallocate.c> > -#undef posix_fallocate > - > -/* Reserve storage for the data of the file associated with FD. */ > -int > -posix_fallocate (int fd, __off_t offset, __off_t len) > -{ > - INTERNAL_SYSCALL_DECL (err); > - int res = INTERNAL_SYSCALL (fallocate, err, 4, fd, 0, offset, len); > - > - if (! INTERNAL_SYSCALL_ERROR_P (res, err)) > - return 0; > - if (INTERNAL_SYSCALL_ERRNO (res, err) != EOPNOTSUPP) > - return INTERNAL_SYSCALL_ERRNO (res, err); > - return internal_fallocate (fd, offset, len); > -} > diff --git a/sysdeps/unix/sysv/linux/mips/mips64/n32/posix_fallocate64.c b/sysdeps/unix/sysv/linux/mips/mips64/n32/posix_fallocate64.c > deleted file mode 100644 > index d5659e0..0000000 > --- a/sysdeps/unix/sysv/linux/mips/mips64/n32/posix_fallocate64.c > +++ /dev/null > @@ -1,38 +0,0 @@ > -/* Copyright (C) 2007-2016 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 > - modify it under the terms of the GNU Lesser General Public > - License as published by the Free Software Foundation; either > - version 2.1 of the License, or (at your option) any later version. > - > - The GNU C Library is distributed in the hope that it will be useful, > - but WITHOUT ANY WARRANTY; without even the implied warranty of > - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU > - Lesser General Public License for more details. > - > - You should have received a copy of the GNU Lesser General Public > - License along with the GNU C Library. If not, see > - <http://www.gnu.org/licenses/>. */ > - > -#include <fcntl.h> > -#include <sysdep.h> > - > -extern int __posix_fallocate64_l64 (int fd, __off64_t offset, __off64_t len); > -#define __posix_fallocate64_l64 static internal_fallocate64 > -#include <sysdeps/posix/posix_fallocate64.c> > -#undef __posix_fallocate64_l64 > - > -/* Reserve storage for the data of the file associated with FD. */ > -int > -__posix_fallocate64_l64 (int fd, __off64_t offset, __off64_t len) > -{ > - INTERNAL_SYSCALL_DECL (err); > - int res = INTERNAL_SYSCALL (fallocate, err, 4, fd, 0, offset, len); > - > - if (! INTERNAL_SYSCALL_ERROR_P (res, err)) > - return 0; > - if (INTERNAL_SYSCALL_ERRNO (res, err) != EOPNOTSUPP) > - return INTERNAL_SYSCALL_ERRNO (res, err); > - return internal_fallocate64 (fd, offset, len); > -} > diff --git a/sysdeps/unix/sysv/linux/mips/mips64/n64/posix_fallocate.c b/sysdeps/unix/sysv/linux/mips/mips64/n64/posix_fallocate.c > deleted file mode 100644 > index b3fe81b..0000000 > --- a/sysdeps/unix/sysv/linux/mips/mips64/n64/posix_fallocate.c > +++ /dev/null > @@ -1 +0,0 @@ > -#include <sysdeps/unix/sysv/linux/wordsize-64/posix_fallocate.c> > diff --git a/sysdeps/unix/sysv/linux/mips/mips64/n64/posix_fallocate64.c b/sysdeps/unix/sysv/linux/mips/mips64/n64/posix_fallocate64.c > deleted file mode 100644 > index f466f13..0000000 > --- a/sysdeps/unix/sysv/linux/mips/mips64/n64/posix_fallocate64.c > +++ /dev/null > @@ -1 +0,0 @@ > -/* posix_fallocate64 is in posix_fallocate.c */ > diff --git a/sysdeps/unix/sysv/linux/posix_fallocate.c b/sysdeps/unix/sysv/linux/posix_fallocate.c > index fc9ac37..139cb56 100644 > --- a/sysdeps/unix/sysv/linux/posix_fallocate.c > +++ b/sysdeps/unix/sysv/linux/posix_fallocate.c > @@ -27,10 +27,8 @@ int > posix_fallocate (int fd, __off_t offset, __off_t len) > { > INTERNAL_SYSCALL_DECL (err); > - int res = INTERNAL_SYSCALL (fallocate, err, 6, fd, 0, > - __LONG_LONG_PAIR (offset >> 31, offset), > - __LONG_LONG_PAIR (len >> 31, len)); > - > + int res = INTERNAL_SYSCALL_CALL (fallocate, err, fd, 0, > + SYSCALL_LL (offset), SYSCALL_LL (len)); > if (! INTERNAL_SYSCALL_ERROR_P (res, err)) > return 0; > if (INTERNAL_SYSCALL_ERRNO (res, err) != EOPNOTSUPP) > diff --git a/sysdeps/unix/sysv/linux/posix_fallocate64.c b/sysdeps/unix/sysv/linux/posix_fallocate64.c > index 4a0a722..8a870cb 100644 > --- a/sysdeps/unix/sysv/linux/posix_fallocate64.c > +++ b/sysdeps/unix/sysv/linux/posix_fallocate64.c > @@ -28,12 +28,8 @@ int > __posix_fallocate64_l64 (int fd, __off64_t offset, __off64_t len) > { > INTERNAL_SYSCALL_DECL (err); > - int res = INTERNAL_SYSCALL (fallocate, err, 6, fd, 0, > - __LONG_LONG_PAIR ((long int) (offset >> 32), > - (long int) offset), > - __LONG_LONG_PAIR ((long int) (len >> 32), > - (long int) len)); > - > + int res = INTERNAL_SYSCALL_CALL (fallocate, err, fd, 0, > + SYSCALL_LL64 (offset), SYSCALL_LL64 (len)); > if (! INTERNAL_SYSCALL_ERROR_P (res, err)) > return 0; > if (INTERNAL_SYSCALL_ERRNO (res, err) != EOPNOTSUPP) > diff --git a/sysdeps/unix/sysv/linux/wordsize-64/posix_fallocate.c b/sysdeps/unix/sysv/linux/wordsize-64/posix_fallocate.c > deleted file mode 100644 > index 8caee31..0000000 > --- a/sysdeps/unix/sysv/linux/wordsize-64/posix_fallocate.c > +++ /dev/null > @@ -1,46 +0,0 @@ > -/* Copyright (C) 2007-2016 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 > - modify it under the terms of the GNU Lesser General Public > - License as published by the Free Software Foundation; either > - version 2.1 of the License, or (at your option) any later version. > - > - The GNU C Library is distributed in the hope that it will be useful, > - but WITHOUT ANY WARRANTY; without even the implied warranty of > - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU > - Lesser General Public License for more details. > - > - You should have received a copy of the GNU Lesser General Public > - License along with the GNU C Library; if not, see > - <http://www.gnu.org/licenses/>. */ > - > -#include <fcntl.h> > -#include <sysdep.h> > - > -#define posix_fallocate static internal_fallocate > -#include <sysdeps/posix/posix_fallocate.c> > -#undef posix_fallocate > - > -/* Reserve storage for the data of the file associated with FD. */ > -int > -posix_fallocate (int fd, __off_t offset, __off_t len) > -{ > - INTERNAL_SYSCALL_DECL (err); > -#ifdef INTERNAL_SYSCALL_TYPES > - int res = INTERNAL_SYSCALL_TYPES (fallocate, err, 4, int, fd, > - int, 0, off_t, offset, > - off_t, len); > -#else > - int res = INTERNAL_SYSCALL (fallocate, err, 4, fd, 0, offset, len); > -#endif > - > - if (! INTERNAL_SYSCALL_ERROR_P (res, err)) > - return 0; > - > - if (INTERNAL_SYSCALL_ERRNO (res, err) != EOPNOTSUPP) > - return INTERNAL_SYSCALL_ERRNO (res, err); > - > - return internal_fallocate (fd, offset, len); > -} > -weak_alias (posix_fallocate, posix_fallocate64) > diff --git a/sysdeps/unix/sysv/linux/wordsize-64/posix_fallocate64.c b/sysdeps/unix/sysv/linux/wordsize-64/posix_fallocate64.c > deleted file mode 100644 > index f466f13..0000000 > --- a/sysdeps/unix/sysv/linux/wordsize-64/posix_fallocate64.c > +++ /dev/null > @@ -1 +0,0 @@ > -/* posix_fallocate64 is in posix_fallocate.c */ > -- > 2.7.4
Thanks for the reviews, comments below. >> diff --git a/io/tst-posix_fallocate-common.c b/io/tst-posix_fallocate-common.c >> new file mode 100644 >> index 0000000..42d6ec6 >> --- /dev/null >> +++ b/io/tst-posix_fallocate-common.c >> @@ -0,0 +1,92 @@ >> +/* Common posix_fallocate tests definitions. >> + Copyright (C) 2016 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 >> + modify it under the terms of the GNU Lesser General Public >> + License as published by the Free Software Foundation; either >> + version 2.1 of the License, or (at your option) any later version. >> + >> + The GNU C Library is distributed in the hope that it will be useful, >> + but WITHOUT ANY WARRANTY; without even the implied warranty of >> + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU >> + Lesser General Public License for more details. >> + >> + You should have received a copy of the GNU Lesser General Public >> + License along with the GNU C Library; if not, see >> + <http://www.gnu.org/licenses/>. */ >> + >> +#include <fcntl.h> >> +#include <sys/types.h> >> +#include <sys/stat.h> >> +#include <unistd.h> >> + >> +static void do_prepare (void); >> +#define PREPARE(argc, argv) do_prepare () > > Trailing whitespace Ack, I will fix it.
diff --git a/io/Makefile b/io/Makefile index deb6100..20fe3de 100644 --- a/io/Makefile +++ b/io/Makefile @@ -71,7 +71,7 @@ tests := test-utime test-stat test-stat2 test-lfs tst-getcwd \ tst-renameat tst-fchownat tst-fchmodat tst-faccessat \ tst-symlinkat tst-linkat tst-readlinkat tst-mkdirat \ tst-mknodat tst-mkfifoat tst-ttyname_r bug-ftw5 \ - tst-posix_fallocate tst-fts tst-fts-lfs + tst-posix_fallocate tst-posix_fallocate64 tst-fts tst-fts-lfs ifeq ($(run-built-tests),yes) tests-special += $(objpfx)ftwtest.out diff --git a/io/tst-posix_fallocate-common.c b/io/tst-posix_fallocate-common.c new file mode 100644 index 0000000..42d6ec6 --- /dev/null +++ b/io/tst-posix_fallocate-common.c @@ -0,0 +1,92 @@ +/* Common posix_fallocate tests definitions. + Copyright (C) 2016 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 + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#include <fcntl.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <unistd.h> + +static void do_prepare (void); +#define PREPARE(argc, argv) do_prepare () +static int do_test (void); +#define TEST_FUNCTION do_test () + +#define TIMEOUT 20 /* sec. */ + +#include <test-skeleton.c> + +static char *temp_filename; +static int temp_fd; + +static void +do_prepare (void) +{ + temp_fd = create_temp_file ("tst-posix_fallocate.", &temp_filename); + if (temp_fd == -1) + { + printf ("cannot create temporary file: %m\n"); + exit (1); + } +} + +#define FAIL(str) \ + do { printf ("error: %s (line %d)\n", str, __LINE__); return 1; } while (0) + +static int +do_test_with_offset (off_t offset) +{ + struct stat st; + + if (posix_fallocate (temp_fd, offset, 768) != 0) + FAIL ("1st posix_fallocate call failed"); + + if (fstat (temp_fd, &st) != 0) + FAIL ("2nd fstat failed"); + + if (st.st_size != (offset + 768)) + { + printf ("file size after first posix_fallocate call is %llu, expected %u\n", + (unsigned long long int) st.st_size, 512u + 768u); + return 1; + } + + if (posix_fallocate (temp_fd, 0, 1024) != 0) + FAIL ("2nd posix_fallocate call failed"); + + if (fstat (temp_fd, &st) != 0) + FAIL ("3rd fstat failed"); + + if (st.st_size != (offset) + 768) + FAIL ("file size changed in second posix_fallocate"); + + offset += 2048; + if (posix_fallocate (temp_fd, offset, 64) != 0) + FAIL ("3rd posix_fallocate call failed"); + + if (fstat (temp_fd, &st) != 0) + FAIL ("4th fstat failed"); + + if (st.st_size != (offset + 64)) + { + printf ("file size after first posix_fallocate call is %llu, expected %u\n", + (unsigned long long int) st.st_size, 2048u + 64u); + return 1; + } + + return 0; +} diff --git a/io/tst-posix_fallocate.c b/io/tst-posix_fallocate.c index 53f0704..59f3fa1 100644 --- a/io/tst-posix_fallocate.c +++ b/io/tst-posix_fallocate.c @@ -1,100 +1,33 @@ -#include <fcntl.h> -#include <sys/stat.h> +/* Basic posix_fallocate tests. + Copyright (C) 2016 Free Software Foundation, Inc. + This file is part of the GNU C Library. -static void do_prepare (void); -#define PREPARE(argc, argv) do_prepare () -static int do_test (void); -#define TEST_FUNCTION do_test () -#include <test-skeleton.c> + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. -static int fd; + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. -static void -do_prepare (void) -{ - fd = create_temp_file ("tst-posix_fallocate.", NULL); - if (fd == -1) - { - printf ("cannot create temporary file: %m\n"); - exit (1); - } -} + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ +#include "tst-posix_fallocate-common.c" static int do_test (void) { - struct stat64 st; + struct stat st; - if (fstat64 (fd, &st) != 0) - { - puts ("1st fstat failed"); - return 1; - } + if (fstat (temp_fd, &st) != 0) + FAIL ("1st fstat failed"); if (st.st_size != 0) - { - puts ("file not created with size 0"); - return 1; - } - - if (posix_fallocate (fd, 512, 768) != 0) - { - puts ("1st posix_fallocate call failed"); - return 1; - } - - if (fstat64 (fd, &st) != 0) - { - puts ("2nd fstat failed"); - return 1; - } - - if (st.st_size != 512 + 768) - { - printf ("file size after first posix_fallocate call is %llu, expected %u\n", - (unsigned long long int) st.st_size, 512u + 768u); - return 1; - } - - if (posix_fallocate (fd, 0, 1024) != 0) - { - puts ("2nd posix_fallocate call failed"); - return 1; - } - - if (fstat64 (fd, &st) != 0) - { - puts ("3rd fstat failed"); - return 1; - } - - if (st.st_size != 512 + 768) - { - puts ("file size changed in second posix_fallocate"); - return 1; - } - - if (posix_fallocate (fd, 2048, 64) != 0) - { - puts ("3rd posix_fallocate call failed"); - return 1; - } - - if (fstat64 (fd, &st) != 0) - { - puts ("4th fstat failed"); - return 1; - } - - if (st.st_size != 2048 + 64) - { - printf ("file size after first posix_fallocate call is %llu, expected %u\n", - (unsigned long long int) st.st_size, 2048u + 64u); - return 1; - } - - close (fd); + FAIL ("file not created with size 0"); - return 0; + return do_test_with_offset (512); } diff --git a/io/tst-posix_fallocate64.c b/io/tst-posix_fallocate64.c new file mode 100644 index 0000000..cbb57ff --- /dev/null +++ b/io/tst-posix_fallocate64.c @@ -0,0 +1,44 @@ +/* Basic posix_fallocate tests (with _FILE_OFFSET_BITS). + Copyright (C) 2016 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 + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#define _FILE_OFFSET_BITS 64 +#include "tst-posix_fallocate-common.c" + +static int +do_test (void) +{ + struct stat st; + int ret; + + if (fstat (temp_fd, &st) != 0) + FAIL ("1st fstat failed"); + + if (st.st_size != 0) + FAIL ("file not created with size 0"); + + ret = do_test_with_offset (512); + if (ret == -1) + return -1; + + off_t base_offset = UINT32_MAX + 512LL; + ret = do_test_with_offset (base_offset); + if (ret == -1) + return 1; + + return 0; +} diff --git a/sysdeps/unix/sysv/linux/mips/mips64/n32/posix_fallocate.c b/sysdeps/unix/sysv/linux/mips/mips64/n32/posix_fallocate.c deleted file mode 100644 index e652e5b..0000000 --- a/sysdeps/unix/sysv/linux/mips/mips64/n32/posix_fallocate.c +++ /dev/null @@ -1,37 +0,0 @@ -/* Copyright (C) 2007-2016 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 - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library. If not, see - <http://www.gnu.org/licenses/>. */ - -#include <fcntl.h> -#include <sysdep.h> - -#define posix_fallocate static internal_fallocate -#include <sysdeps/posix/posix_fallocate.c> -#undef posix_fallocate - -/* Reserve storage for the data of the file associated with FD. */ -int -posix_fallocate (int fd, __off_t offset, __off_t len) -{ - INTERNAL_SYSCALL_DECL (err); - int res = INTERNAL_SYSCALL (fallocate, err, 4, fd, 0, offset, len); - - if (! INTERNAL_SYSCALL_ERROR_P (res, err)) - return 0; - if (INTERNAL_SYSCALL_ERRNO (res, err) != EOPNOTSUPP) - return INTERNAL_SYSCALL_ERRNO (res, err); - return internal_fallocate (fd, offset, len); -} diff --git a/sysdeps/unix/sysv/linux/mips/mips64/n32/posix_fallocate64.c b/sysdeps/unix/sysv/linux/mips/mips64/n32/posix_fallocate64.c deleted file mode 100644 index d5659e0..0000000 --- a/sysdeps/unix/sysv/linux/mips/mips64/n32/posix_fallocate64.c +++ /dev/null @@ -1,38 +0,0 @@ -/* Copyright (C) 2007-2016 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 - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library. If not, see - <http://www.gnu.org/licenses/>. */ - -#include <fcntl.h> -#include <sysdep.h> - -extern int __posix_fallocate64_l64 (int fd, __off64_t offset, __off64_t len); -#define __posix_fallocate64_l64 static internal_fallocate64 -#include <sysdeps/posix/posix_fallocate64.c> -#undef __posix_fallocate64_l64 - -/* Reserve storage for the data of the file associated with FD. */ -int -__posix_fallocate64_l64 (int fd, __off64_t offset, __off64_t len) -{ - INTERNAL_SYSCALL_DECL (err); - int res = INTERNAL_SYSCALL (fallocate, err, 4, fd, 0, offset, len); - - if (! INTERNAL_SYSCALL_ERROR_P (res, err)) - return 0; - if (INTERNAL_SYSCALL_ERRNO (res, err) != EOPNOTSUPP) - return INTERNAL_SYSCALL_ERRNO (res, err); - return internal_fallocate64 (fd, offset, len); -} diff --git a/sysdeps/unix/sysv/linux/mips/mips64/n64/posix_fallocate.c b/sysdeps/unix/sysv/linux/mips/mips64/n64/posix_fallocate.c deleted file mode 100644 index b3fe81b..0000000 --- a/sysdeps/unix/sysv/linux/mips/mips64/n64/posix_fallocate.c +++ /dev/null @@ -1 +0,0 @@ -#include <sysdeps/unix/sysv/linux/wordsize-64/posix_fallocate.c> diff --git a/sysdeps/unix/sysv/linux/mips/mips64/n64/posix_fallocate64.c b/sysdeps/unix/sysv/linux/mips/mips64/n64/posix_fallocate64.c deleted file mode 100644 index f466f13..0000000 --- a/sysdeps/unix/sysv/linux/mips/mips64/n64/posix_fallocate64.c +++ /dev/null @@ -1 +0,0 @@ -/* posix_fallocate64 is in posix_fallocate.c */ diff --git a/sysdeps/unix/sysv/linux/posix_fallocate.c b/sysdeps/unix/sysv/linux/posix_fallocate.c index fc9ac37..139cb56 100644 --- a/sysdeps/unix/sysv/linux/posix_fallocate.c +++ b/sysdeps/unix/sysv/linux/posix_fallocate.c @@ -27,10 +27,8 @@ int posix_fallocate (int fd, __off_t offset, __off_t len) { INTERNAL_SYSCALL_DECL (err); - int res = INTERNAL_SYSCALL (fallocate, err, 6, fd, 0, - __LONG_LONG_PAIR (offset >> 31, offset), - __LONG_LONG_PAIR (len >> 31, len)); - + int res = INTERNAL_SYSCALL_CALL (fallocate, err, fd, 0, + SYSCALL_LL (offset), SYSCALL_LL (len)); if (! INTERNAL_SYSCALL_ERROR_P (res, err)) return 0; if (INTERNAL_SYSCALL_ERRNO (res, err) != EOPNOTSUPP) diff --git a/sysdeps/unix/sysv/linux/posix_fallocate64.c b/sysdeps/unix/sysv/linux/posix_fallocate64.c index 4a0a722..8a870cb 100644 --- a/sysdeps/unix/sysv/linux/posix_fallocate64.c +++ b/sysdeps/unix/sysv/linux/posix_fallocate64.c @@ -28,12 +28,8 @@ int __posix_fallocate64_l64 (int fd, __off64_t offset, __off64_t len) { INTERNAL_SYSCALL_DECL (err); - int res = INTERNAL_SYSCALL (fallocate, err, 6, fd, 0, - __LONG_LONG_PAIR ((long int) (offset >> 32), - (long int) offset), - __LONG_LONG_PAIR ((long int) (len >> 32), - (long int) len)); - + int res = INTERNAL_SYSCALL_CALL (fallocate, err, fd, 0, + SYSCALL_LL64 (offset), SYSCALL_LL64 (len)); if (! INTERNAL_SYSCALL_ERROR_P (res, err)) return 0; if (INTERNAL_SYSCALL_ERRNO (res, err) != EOPNOTSUPP) diff --git a/sysdeps/unix/sysv/linux/wordsize-64/posix_fallocate.c b/sysdeps/unix/sysv/linux/wordsize-64/posix_fallocate.c deleted file mode 100644 index 8caee31..0000000 --- a/sysdeps/unix/sysv/linux/wordsize-64/posix_fallocate.c +++ /dev/null @@ -1,46 +0,0 @@ -/* Copyright (C) 2007-2016 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 - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#include <fcntl.h> -#include <sysdep.h> - -#define posix_fallocate static internal_fallocate -#include <sysdeps/posix/posix_fallocate.c> -#undef posix_fallocate - -/* Reserve storage for the data of the file associated with FD. */ -int -posix_fallocate (int fd, __off_t offset, __off_t len) -{ - INTERNAL_SYSCALL_DECL (err); -#ifdef INTERNAL_SYSCALL_TYPES - int res = INTERNAL_SYSCALL_TYPES (fallocate, err, 4, int, fd, - int, 0, off_t, offset, - off_t, len); -#else - int res = INTERNAL_SYSCALL (fallocate, err, 4, fd, 0, offset, len); -#endif - - if (! INTERNAL_SYSCALL_ERROR_P (res, err)) - return 0; - - if (INTERNAL_SYSCALL_ERRNO (res, err) != EOPNOTSUPP) - return INTERNAL_SYSCALL_ERRNO (res, err); - - return internal_fallocate (fd, offset, len); -} -weak_alias (posix_fallocate, posix_fallocate64) diff --git a/sysdeps/unix/sysv/linux/wordsize-64/posix_fallocate64.c b/sysdeps/unix/sysv/linux/wordsize-64/posix_fallocate64.c deleted file mode 100644 index f466f13..0000000 --- a/sysdeps/unix/sysv/linux/wordsize-64/posix_fallocate64.c +++ /dev/null @@ -1 +0,0 @@ -/* posix_fallocate64 is in posix_fallocate.c */