* [PATCH v2 1/3] Consolidate fallocate{64} implementations @ 2016-09-28 0:15 Adhemerval Zanella 2016-09-28 0:15 ` [PATCH v2 2/3] Consolidate posix_fallocate{64} implementations Adhemerval Zanella ` (2 more replies) 0 siblings, 3 replies; 27+ messages in thread From: Adhemerval Zanella @ 2016-09-28 0:15 UTC (permalink / raw) To: libc-alpha; +Cc: Adhemerval Zanella From: Adhemerval Zanella <adhemerval.zanella@linaro.org> Changes from previous version: - Add back x32 use of syscalls.list until x32 {INTERNAL,INLINE}_SYSCALL is not yet fixed [1]. - Fix trailing whitespace -- This patch consolidates all the fallocate{64} implementation for Linux in only one (sysdeps/unix/sysv/linux/fallocate{64}.c). It also removes the syscall from the auto-generation using assembly macros. The new macro SYSCALL_LL{64} is used to handle the offset argument. Checked on x86_64, x32, i386, aarch64, and ppc64le. * sysdeps/unix/sysv/linux/Makefile (test): Add tst-fallocate and tst-fallocate64. * sysdeps/unix/sysv/linux/tst-fallocate.c: New file. * sysdeps/unix/sysv/linux/tst-fallocate64.c: Likewise. * sysdeps/unix/sysv/linux/tst-fallocate-common.c: Likewise. * sysdeps/unix/sysv/linux/mips/mips64/n32/fallocate.c: Remove file. * sysdeps/unix/sysv/linux/mips/mips64/n32/fallocate64.c: Likewise. * sysdeps/unix/sysv/linux/mips/mips64/n64/fallocate.c: Likewise. * sysdeps/unix/sysv/linux/mips/mips64/n64/fallocate64.c: Likewise. * sysdeps/unix/sysv/linux/wordsize-64/fallocate.c: Likewise. * sysdeps/unix/sysv/linux/wordsize-64/fallocate64.c: Likewise. * sysdeps/unix/sysv/linux/fallocate.c (fallocate): Use SYSCALL_LL macro on offset argument. * sysdeps/unix/sysv/linux/fallocate64.c (fallocate64): Use SYSCALL_LL64 on offset argument. [1] https://sourceware.org/ml/libc-alpha/2016-08/msg00443.html --- sysdeps/unix/sysv/linux/Makefile | 3 +- sysdeps/unix/sysv/linux/fallocate.c | 11 +-- sysdeps/unix/sysv/linux/fallocate64.c | 14 ++-- .../unix/sysv/linux/mips/mips64/n32/fallocate.c | 33 -------- .../unix/sysv/linux/mips/mips64/n32/fallocate64.c | 33 -------- .../unix/sysv/linux/mips/mips64/n64/fallocate.c | 1 - .../unix/sysv/linux/mips/mips64/n64/fallocate64.c | 1 - sysdeps/unix/sysv/linux/tst-fallocate-common.c | 88 ++++++++++++++++++++++ sysdeps/unix/sysv/linux/tst-fallocate.c | 25 ++++++ sysdeps/unix/sysv/linux/tst-fallocate64.c | 54 +++++++++++++ sysdeps/unix/sysv/linux/wordsize-64/fallocate.c | 34 --------- sysdeps/unix/sysv/linux/wordsize-64/fallocate64.c | 1 - 13 files changed, 195 insertions(+), 121 deletions(-) delete mode 100644 sysdeps/unix/sysv/linux/mips/mips64/n32/fallocate.c delete mode 100644 sysdeps/unix/sysv/linux/mips/mips64/n32/fallocate64.c delete mode 100644 sysdeps/unix/sysv/linux/mips/mips64/n64/fallocate.c delete mode 100644 sysdeps/unix/sysv/linux/mips/mips64/n64/fallocate64.c create mode 100644 sysdeps/unix/sysv/linux/tst-fallocate-common.c create mode 100644 sysdeps/unix/sysv/linux/tst-fallocate.c create mode 100644 sysdeps/unix/sysv/linux/tst-fallocate64.c delete mode 100644 sysdeps/unix/sysv/linux/wordsize-64/fallocate.c delete mode 100644 sysdeps/unix/sysv/linux/wordsize-64/fallocate64.c diff --git a/sysdeps/unix/sysv/linux/Makefile b/sysdeps/unix/sysv/linux/Makefile index 9a0423e..f8f778b 100644 --- a/sysdeps/unix/sysv/linux/Makefile +++ b/sysdeps/unix/sysv/linux/Makefile @@ -42,7 +42,8 @@ sysdep_headers += sys/mount.h sys/acct.h sys/sysctl.h \ bits/socket_type.h bits/syscall.h bits/sysctl.h \ bits/mman-linux.h -tests += tst-clone tst-clone2 tst-fanotify tst-personality tst-quota +tests += tst-clone tst-clone2 tst-fanotify tst-personality tst-quota \ + tst-fallocate tst-fallocate64 # Generate the list of SYS_* macros for the system calls (__NR_* macros). diff --git a/sysdeps/unix/sysv/linux/fallocate.c b/sysdeps/unix/sysv/linux/fallocate.c index 6a58a5f..a38e9a6 100644 --- a/sysdeps/unix/sysv/linux/fallocate.c +++ b/sysdeps/unix/sysv/linux/fallocate.c @@ -19,17 +19,12 @@ #include <fcntl.h> #include <sysdep-cancel.h> - +#ifndef __OFF_T_MATCHES_OFF64_T /* Reserve storage for the data of the file associated with FD. */ int fallocate (int fd, int mode, __off_t offset, __off_t len) { -#ifdef __NR_fallocate return SYSCALL_CANCEL (fallocate, fd, mode, - __LONG_LONG_PAIR (offset >> 31, offset), - __LONG_LONG_PAIR (len >> 31, len)); -#else - __set_errno (ENOSYS); - return -1; -#endif + SYSCALL_LL (offset), SYSCALL_LL (len)); } +#endif diff --git a/sysdeps/unix/sysv/linux/fallocate64.c b/sysdeps/unix/sysv/linux/fallocate64.c index 8e76d6f..d466095 100644 --- a/sysdeps/unix/sysv/linux/fallocate64.c +++ b/sysdeps/unix/sysv/linux/fallocate64.c @@ -24,14 +24,10 @@ int fallocate64 (int fd, int mode, __off64_t offset, __off64_t len) { -#ifdef __NR_fallocate return SYSCALL_CANCEL (fallocate, fd, mode, - __LONG_LONG_PAIR ((long int) (offset >> 32), - (long int) offset), - __LONG_LONG_PAIR ((long int) (len >> 32), - (long int) len)); -#else - __set_errno (ENOSYS); - return -1; -#endif + SYSCALL_LL64 (offset), SYSCALL_LL64 (len)); } + +#ifdef __OFF_T_MATCHES_OFF64_T +weak_alias (fallocate64, fallocate) +#endif diff --git a/sysdeps/unix/sysv/linux/mips/mips64/n32/fallocate.c b/sysdeps/unix/sysv/linux/mips/mips64/n32/fallocate.c deleted file mode 100644 index 4e432f4..0000000 --- a/sysdeps/unix/sysv/linux/mips/mips64/n32/fallocate.c +++ /dev/null @@ -1,33 +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 <errno.h> -#include <fcntl.h> -#include <sysdep-cancel.h> - - -/* Reserve storage for the data of the file associated with FD. */ -int -fallocate (int fd, int mode, __off_t offset, __off_t len) -{ -#ifdef __NR_fallocate - return SYSCALL_CANCEL (fallocate, fd, mode, offset, len); -#else - __set_errno (ENOSYS); - return -1; -#endif -} diff --git a/sysdeps/unix/sysv/linux/mips/mips64/n32/fallocate64.c b/sysdeps/unix/sysv/linux/mips/mips64/n32/fallocate64.c deleted file mode 100644 index 95c9eab..0000000 --- a/sysdeps/unix/sysv/linux/mips/mips64/n32/fallocate64.c +++ /dev/null @@ -1,33 +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 <errno.h> -#include <fcntl.h> -#include <sysdep-cancel.h> - - -/* Reserve storage for the data of the file associated with FD. */ -int -fallocate64 (int fd, int mode, __off64_t offset, __off64_t len) -{ -#ifdef __NR_fallocate - return SYSCALL_CANCEL (fallocate, fd, mode, offset, len); -#else - __set_errno (ENOSYS); - return -1; -#endif -} diff --git a/sysdeps/unix/sysv/linux/mips/mips64/n64/fallocate.c b/sysdeps/unix/sysv/linux/mips/mips64/n64/fallocate.c deleted file mode 100644 index d3b7218..0000000 --- a/sysdeps/unix/sysv/linux/mips/mips64/n64/fallocate.c +++ /dev/null @@ -1 +0,0 @@ -#include <sysdeps/unix/sysv/linux/wordsize-64/fallocate.c> diff --git a/sysdeps/unix/sysv/linux/mips/mips64/n64/fallocate64.c b/sysdeps/unix/sysv/linux/mips/mips64/n64/fallocate64.c deleted file mode 100644 index fb2b681..0000000 --- a/sysdeps/unix/sysv/linux/mips/mips64/n64/fallocate64.c +++ /dev/null @@ -1 +0,0 @@ -/* fallocate64 is in fallocate.c */ diff --git a/sysdeps/unix/sysv/linux/tst-fallocate-common.c b/sysdeps/unix/sysv/linux/tst-fallocate-common.c new file mode 100644 index 0000000..5ef66be --- /dev/null +++ b/sysdeps/unix/sysv/linux/tst-fallocate-common.c @@ -0,0 +1,88 @@ +/* Basic fallocate test (no specific flags is checked). + 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; + +void +do_prepare (void) +{ + temp_fd = create_temp_file ("tst-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) +{ + int ret; + struct stat finfo; + char bwrite[1024] = { 0xf0 }; + char bread[1024]; + + /* It tries to fallocate 1024 bytes from 'offset' and then write 1024 bytes. + After both operation rewind the file descriptor and read 1024 bytes + and check if both buffer have the same contents. */ + ret = fallocate (temp_fd, 0, offset, 1024); + if (ret == -1) + FAIL ("fallocate failed"); + + ret = fstat (temp_fd, &finfo); + if (ret == -1) + FAIL ("fstat failed"); + + if (finfo.st_size < (offset + 1024)) + FAIL ("size of first fallocate less than expected (1024)"); + + if (lseek (temp_fd, offset, SEEK_SET) == (off_t) -1) + FAIL ("fseek (0, SEEK_SET) failed"); + + if (write (temp_fd, bwrite, 1024) != 1024) + FAIL ("fail trying to write 1024 bytes"); + + if (lseek (temp_fd, offset, SEEK_SET) == (off_t) -1) + FAIL ("fseek (0, SEEK_SET) failed"); + + if (read (temp_fd, bread, 1024) != 1024) + FAIL ("fail trying to read 1024 bytes"); + + if (memcmp (bwrite, bread, 1024) != 0) + FAIL ("buffer writted different than buffer readed"); + + return 0; +} diff --git a/sysdeps/unix/sysv/linux/tst-fallocate.c b/sysdeps/unix/sysv/linux/tst-fallocate.c new file mode 100644 index 0000000..ec3867c --- /dev/null +++ b/sysdeps/unix/sysv/linux/tst-fallocate.c @@ -0,0 +1,25 @@ +/* Basic fallocate test (no specific flags is checked). + 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 "tst-fallocate-common.c" + +static int +do_test (void) +{ + return do_test_with_offset (0); +} diff --git a/sysdeps/unix/sysv/linux/tst-fallocate64.c b/sysdeps/unix/sysv/linux/tst-fallocate64.c new file mode 100644 index 0000000..78bcb8c --- /dev/null +++ b/sysdeps/unix/sysv/linux/tst-fallocate64.c @@ -0,0 +1,54 @@ +/* Basic fallocate64 test (no specific flags is checked). + 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-fallocate-common.c" + +static int +do_test (void) +{ + ssize_t ret; + + ret = do_test_with_offset (0); + if (ret == -1) + return 1; + + off_t base_offset = UINT32_MAX + 2048LL; + ret = do_test_with_offset (base_offset); + if (ret == -1) + return 1; + + struct stat st; + if (fstat (temp_fd, &st) == -1) + { + printf ("error: fstat on temporary file failed: %m"); + return 1; + } + + /* The file size should >= base_offset plus bytes written. */ + off_t expected_value = base_offset + ret; + if (st.st_size < expected_value) + { + printf ("error: file size less than expected (%jd > %jd)\n", + (intmax_t) expected_value, (intmax_t) st.st_size); + return 1; + } + + return 0; +} + diff --git a/sysdeps/unix/sysv/linux/wordsize-64/fallocate.c b/sysdeps/unix/sysv/linux/wordsize-64/fallocate.c deleted file mode 100644 index c1dd0b4..0000000 --- a/sysdeps/unix/sysv/linux/wordsize-64/fallocate.c +++ /dev/null @@ -1,34 +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 <errno.h> -#include <fcntl.h> -#include <sysdep-cancel.h> - - -/* Reserve storage for the data of the file associated with FD. */ -int -fallocate (int fd, int mode, __off_t offset, __off_t len) -{ -#ifdef __NR_fallocate - return SYSCALL_CANCEL (fallocate, fd, mode, offset, len); -#else - __set_errno (ENOSYS); - return -1; -#endif -} -strong_alias (fallocate, fallocate64) diff --git a/sysdeps/unix/sysv/linux/wordsize-64/fallocate64.c b/sysdeps/unix/sysv/linux/wordsize-64/fallocate64.c deleted file mode 100644 index df33112..0000000 --- a/sysdeps/unix/sysv/linux/wordsize-64/fallocate64.c +++ /dev/null @@ -1 +0,0 @@ -/* fallocate64 is in posix_fallocate.c */ -- 2.7.4 ^ permalink raw reply [flat|nested] 27+ messages in thread
* [PATCH v2 2/3] Consolidate posix_fallocate{64} implementations 2016-09-28 0:15 [PATCH v2 1/3] Consolidate fallocate{64} implementations Adhemerval Zanella @ 2016-09-28 0:15 ` Adhemerval Zanella 2016-10-05 17:02 ` Siddhesh Poyarekar 2016-09-28 0:15 ` [PATCH v2 3/3] Consolidate posix_fadvise implementations Adhemerval Zanella 2016-09-30 0:51 ` [PATCH v2 1/3] Consolidate fallocate{64} implementations Siddhesh Poyarekar 2 siblings, 1 reply; 27+ messages in thread From: Adhemerval Zanella @ 2016-09-28 0:15 UTC (permalink / raw) To: libc-alpha; +Cc: Adhemerval Zanella From: Adhemerval Zanella <adhemerval.zanella@linaro.org> Changes from previous version: - Add back x32 use of syscalls.list until x32 {INTERNAL,INLINE}_SYSCALL is not yet fixed [1]. - Added a __libc_pwrite64 alias to pread64 for x86_64 (since now posix_fallocate64 will be use and it will call __libc_pread64). -- 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. [1] https://sourceware.org/ml/libc-alpha/2016-08/msg00443.html --- ChangeLog | 21 ++++ io/Makefile | 4 +- 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 - sysdeps/unix/sysv/linux/x86_64/syscalls.list | 2 +- 14 files changed, 184 insertions(+), 224 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 f5977af..e5493b3 100644 --- a/io/Makefile +++ b/io/Makefile @@ -71,8 +71,8 @@ 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-open-tmpfile + tst-posix_fallocate tst-posix_fallocate64 \ + tst-fts tst-fts-lfs tst-open-tmpfile 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..268ccce --- /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 */ diff --git a/sysdeps/unix/sysv/linux/x86_64/syscalls.list b/sysdeps/unix/sysv/linux/x86_64/syscalls.list index bcf6370..8aed2f4 100644 --- a/sysdeps/unix/sysv/linux/x86_64/syscalls.list +++ b/sysdeps/unix/sysv/linux/x86_64/syscalls.list @@ -8,7 +8,7 @@ msgrcv - msgrcv Ci:ibnii __msgrcv msgrcv msgsnd - msgsnd Ci:ibni __msgsnd msgsnd pread64 - pread64 Ci:ipii __libc_pread __libc_pread64 __pread64 pread64 __pread pread preadv64 - preadv Ci:ipii preadv64 preadv -pwrite64 - pwrite64 Ci:ipii __libc_pwrite __pwrite64 pwrite64 __pwrite pwrite +pwrite64 - pwrite64 Ci:ipii __libc_pwrite __libc_pwrite64 __pwrite64 pwrite64 __pwrite pwrite pwritev64 - pwritev Ci:ipii pwritev64 pwritev shmat - shmat i:ipi __shmat shmat shmctl - shmctl i:iip __shmctl shmctl -- 2.7.4 ^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: [PATCH v2 2/3] Consolidate posix_fallocate{64} implementations 2016-09-28 0:15 ` [PATCH v2 2/3] Consolidate posix_fallocate{64} implementations Adhemerval Zanella @ 2016-10-05 17:02 ` Siddhesh Poyarekar 2016-10-05 17:51 ` Adhemerval Zanella 0 siblings, 1 reply; 27+ messages in thread From: Siddhesh Poyarekar @ 2016-10-05 17:02 UTC (permalink / raw) To: Adhemerval Zanella, libc-alpha On Wednesday 28 September 2016 05:45 AM, Adhemerval Zanella wrote: > From: Adhemerval Zanella <adhemerval.zanella@linaro.org> > > Changes from previous version: > > - Add back x32 use of syscalls.list until x32 {INTERNAL,INLINE}_SYSCALL > is not yet fixed [1]. > - Added a __libc_pwrite64 alias to pread64 for x86_64 (since now > posix_fallocate64 will be use and it will call __libc_pread64). > > -- > > 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. > > [1] https://sourceware.org/ml/libc-alpha/2016-08/msg00443.html > > --- > ChangeLog | 21 ++++ > io/Makefile | 4 +- > 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 - > sysdeps/unix/sysv/linux/x86_64/syscalls.list | 2 +- > 14 files changed, 184 insertions(+), 224 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 f5977af..e5493b3 100644 > --- a/io/Makefile > +++ b/io/Makefile > @@ -71,8 +71,8 @@ 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-open-tmpfile > + tst-posix_fallocate tst-posix_fallocate64 \ > + tst-fts tst-fts-lfs tst-open-tmpfile > > 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..268ccce > --- /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) Move the definition from tst-fallocate-common.c out into test-skeleton.c and use that one instead of this. > + > +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; Use the new FAIL macro from tst-fallocate-common.c (or rather, in test-skeleton.c after you have moved it). > + } > + > + 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); Likewise. > + 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; do_test_with_offset returns 1, not -1. > + > + off_t base_offset = UINT32_MAX + 512LL; > + ret = do_test_with_offset (base_offset); > + if (ret == -1) > + return 1; Likewise. > + > + 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 */ > diff --git a/sysdeps/unix/sysv/linux/x86_64/syscalls.list b/sysdeps/unix/sysv/linux/x86_64/syscalls.list > index bcf6370..8aed2f4 100644 > --- a/sysdeps/unix/sysv/linux/x86_64/syscalls.list > +++ b/sysdeps/unix/sysv/linux/x86_64/syscalls.list > @@ -8,7 +8,7 @@ msgrcv - msgrcv Ci:ibnii __msgrcv msgrcv > msgsnd - msgsnd Ci:ibni __msgsnd msgsnd > pread64 - pread64 Ci:ipii __libc_pread __libc_pread64 __pread64 pread64 __pread pread > preadv64 - preadv Ci:ipii preadv64 preadv > -pwrite64 - pwrite64 Ci:ipii __libc_pwrite __pwrite64 pwrite64 __pwrite pwrite > +pwrite64 - pwrite64 Ci:ipii __libc_pwrite __libc_pwrite64 __pwrite64 pwrite64 __pwrite pwrite > pwritev64 - pwritev Ci:ipii pwritev64 pwritev > shmat - shmat i:ipi __shmat shmat > shmctl - shmctl i:iip __shmctl shmctl > ^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: [PATCH v2 2/3] Consolidate posix_fallocate{64} implementations 2016-10-05 17:02 ` Siddhesh Poyarekar @ 2016-10-05 17:51 ` Adhemerval Zanella 2016-10-05 18:19 ` Siddhesh Poyarekar 0 siblings, 1 reply; 27+ messages in thread From: Adhemerval Zanella @ 2016-10-05 17:51 UTC (permalink / raw) To: Siddhesh Poyarekar, libc-alpha On 05/10/2016 14:02, Siddhesh Poyarekar wrote: >> + >> +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) > > Move the definition from tst-fallocate-common.c out into test-skeleton.c > and use that one instead of this. What about the new definition I sent with fallocate update patch: #define FAIL(...) \ ({ \ printf ("error: line %d: ", __LINE__); \ printf (__VA_ARGS__); \ printf ("\n"); \ return 1; \ }) I think I can rename to FAIL_RET to explicit state it returns and maybe add a RET_EXIT with same logic but calling exit. >> + >> +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; > > Use the new FAIL macro from tst-fallocate-common.c (or rather, in > test-skeleton.c after you have moved it). Ack. > >> + } >> + >> + 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); > > Likewise. Ack. > >> + 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; > > do_test_with_offset returns 1, not -1. > Ack. >> + >> + off_t base_offset = UINT32_MAX + 512LL; >> + ret = do_test_with_offset (base_offset); >> + if (ret == -1) >> + return 1; > > Likewise. > Ack. ^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: [PATCH v2 2/3] Consolidate posix_fallocate{64} implementations 2016-10-05 17:51 ` Adhemerval Zanella @ 2016-10-05 18:19 ` Siddhesh Poyarekar 0 siblings, 0 replies; 27+ messages in thread From: Siddhesh Poyarekar @ 2016-10-05 18:19 UTC (permalink / raw) To: Adhemerval Zanella, libc-alpha On Wednesday 05 October 2016 11:20 PM, Adhemerval Zanella wrote: > What about the new definition I sent with fallocate update patch: > > #define FAIL(...) \ > ({ \ > printf ("error: line %d: ", __LINE__); \ > printf (__VA_ARGS__); \ > printf ("\n"); \ > return 1; \ > }) > > I think I can rename to FAIL_RET to explicit state it returns and maybe > add a RET_EXIT with same logic but calling exit. Yeah, this is the one I was referring to. FAIL_RET sounds good along with a FAIL_EXIT. Siddhesh ^ permalink raw reply [flat|nested] 27+ messages in thread
* [PATCH v2 3/3] Consolidate posix_fadvise implementations 2016-09-28 0:15 [PATCH v2 1/3] Consolidate fallocate{64} implementations Adhemerval Zanella 2016-09-28 0:15 ` [PATCH v2 2/3] Consolidate posix_fallocate{64} implementations Adhemerval Zanella @ 2016-09-28 0:15 ` Adhemerval Zanella 2016-10-05 17:15 ` Siddhesh Poyarekar 2016-09-30 0:51 ` [PATCH v2 1/3] Consolidate fallocate{64} implementations Siddhesh Poyarekar 2 siblings, 1 reply; 27+ messages in thread From: Adhemerval Zanella @ 2016-09-28 0:15 UTC (permalink / raw) To: libc-alpha; +Cc: Adhemerval Zanella From: Adhemerval Zanella <adhemerval.zanella@linaro.org> This patch consolidates mostly of the Linux posix_fallocate{64} implementations on sysdeps/unix/sysv/linux/posix_fallocate{64}.c. It still keeps arch-specific files for: * S390-32: it uses a packed structure to pass all the arguments on syscall. It is the only supported port that implements __NR_fadvise64_64 in this way. * ARM: it does not implement __NR_fadvise64 (as other 32-bits ports), so posix_fadvise calls internal posix_fadvise64 symbol. * MIPS64 n64: it requires a different version number that other ports. The new macro SYSCALL_LL{64} is used to handle the offset argument and INTERNAL_SYSCALL_CALL to handle passing the correct number of expect arguments. The default Linux adds two new defines a port can use to control how __NR_fadvise64_64 passes the kernel arguments: * __ASSUME_FADVISE64_64_6ARG: the 'advise' argument is moved on second position. This is the case of powerpc32 and arm to avoid implement 7 argument syscall. * __ASSUME_FADVISE64_64_NO_ALIGN: for ABIs that defines __ASSUME_ALIGNED_REGISTER_PAIRS packs the offset without the leading '0'. This is the case of tile 32 bits. ARM also defines __NR_fadvise64_64 as __NR_arm_fadvise64_64 (which is also handled on arch kernel-feature.h). Tested on x86_64, x32, i686, armhf, and aarch64. * posix/Makefile (tests): Add tst-posix_fadvise and tst-posix_fadvise64. * posix/tst-posix_fadvise.c: New file. * posix/tst-posix_fadvise64.c: Likewise. * posix/tst-posix_fadvise-common.c: Likewise. * sysdeps/unix/sysv/linux/arm/kernel-features.h (__ASSUME_FADVISE64_64_6ARG): Define. * sysdeps/unix/sysv/linux/powerpc/kernel-features.h [!__powerpc64__] (__ASSUME_FADVISE64_64_6ARG): Add define. * sysdeps/unix/sysv/linux/arm/posix_fadvise64.c: Remove file. * sysdeps/unix/sysv/linux/generic/wordsize-32/posix_fadvise.c: Likewise. * sysdeps/unix/sysv/linux/i386/posix_fadvise64.S: Likewise. * sysdeps/unix/sysv/linux/mips/mips32/posix_fadvise.c: Likewise. * sysdeps/unix/sysv/linux/mips/mips32/posix_fadvise64.c: Likewise. * sysdeps/unix/sysv/linux/mips/mips64/n32/posix_fadvise.c: Likewise. * sysdeps/unix/sysv/linux/mips/mips64/n32/posix_fadvise64.c: Likewise. * sysdeps/unix/sysv/linux/mips/mips64/n64/posix_fadvise.c: Likewise. * sysdeps/unix/sysv/linux/powerpc/powerpc32/posix_fadvise.c: Likewise. * sysdeps/unix/sysv/linux/powerpc/powerpc32/posix_fadvise64.c: Likewise. * sysdeps/unix/sysv/linux/wordsize-64/posix_fadvise.c: Likewise. * sysdeps/unix/sysv/linux/wordsize-64/posix_fadvise64.c: Likewise. * sysdeps/unix/sysv/linux/mips/mips64/n64/posix_fadvise64.c (SHLIB_COMPAT(libc, GLIBC_2_2, GLIBC_2_3_3) [__posix_fadvise64_l64]: Alias to __posix_fadvise64_l32. (SHLIB_COMPAT(libc, GLIBC_2_2, GLIBC_2_3_3) [__posix_fadvise64_l32]: Add compat definition to posix_fadvise64. (SHLIB_COMPAT(libc, GLIBC_2_2, GLIBC_2_3_3) [__posix_fadvise64_l64]: Add versioned definition to posix_fadvise64. * sysdeps/unix/sysv/linux/posix_fadvise.c (posix_fadvise): Build iff __OFF_T_MATCHES_OFF64_T is defined, use INTERNAL_SYSCALL_CALL, add __ASSUME_FADVISE64_64_6ARG/__ASSUME_FADVISE64_64_NO_ALIGN support. * sysdeps/unix/sysv/linux/posix_fadvise64.c (posix_fadvise64): Add __ASSUME_FADVISE64_64_NO_ALIGN support and use INTERNAL_SYSCALL_CALL. --- ChangeLog | 36 +++++++ posix/Makefile | 3 +- posix/tst-posix_fadvise-common.c | 116 +++++++++++++++++++++ posix/tst-posix_fadvise.c | 25 +++++ posix/tst-posix_fadvise64.c | 44 ++++++++ sysdeps/unix/sysv/linux/arm/kernel-features.h | 7 ++ sysdeps/unix/sysv/linux/arm/posix_fadvise64.c | 38 ------- .../sysv/linux/generic/wordsize-32/posix_fadvise.c | 37 ------- sysdeps/unix/sysv/linux/i386/posix_fadvise64.S | 92 ---------------- .../unix/sysv/linux/mips/mips32/posix_fadvise.c | 41 -------- .../unix/sysv/linux/mips/mips32/posix_fadvise64.c | 60 ----------- .../sysv/linux/mips/mips64/n32/posix_fadvise.c | 37 ------- .../sysv/linux/mips/mips64/n32/posix_fadvise64.c | 55 ---------- .../sysv/linux/mips/mips64/n64/posix_fadvise.c | 50 --------- .../sysv/linux/mips/mips64/n64/posix_fadvise64.c | 29 +++++- sysdeps/unix/sysv/linux/posix_fadvise.c | 45 +++++--- sysdeps/unix/sysv/linux/posix_fadvise64.c | 51 ++++++--- sysdeps/unix/sysv/linux/powerpc/kernel-features.h | 5 + .../sysv/linux/powerpc/powerpc32/posix_fadvise.c | 39 ------- .../sysv/linux/powerpc/powerpc32/posix_fadvise64.c | 55 ---------- sysdeps/unix/sysv/linux/tile/kernel-features.h | 1 + .../unix/sysv/linux/wordsize-64/posix_fadvise.c | 40 ------- .../unix/sysv/linux/wordsize-64/posix_fadvise64.c | 1 - 23 files changed, 335 insertions(+), 572 deletions(-) create mode 100644 posix/tst-posix_fadvise-common.c create mode 100644 posix/tst-posix_fadvise.c create mode 100644 posix/tst-posix_fadvise64.c delete mode 100644 sysdeps/unix/sysv/linux/arm/posix_fadvise64.c delete mode 100644 sysdeps/unix/sysv/linux/generic/wordsize-32/posix_fadvise.c delete mode 100644 sysdeps/unix/sysv/linux/i386/posix_fadvise64.S delete mode 100644 sysdeps/unix/sysv/linux/mips/mips32/posix_fadvise.c delete mode 100644 sysdeps/unix/sysv/linux/mips/mips32/posix_fadvise64.c delete mode 100644 sysdeps/unix/sysv/linux/mips/mips64/n32/posix_fadvise.c delete mode 100644 sysdeps/unix/sysv/linux/mips/mips64/n32/posix_fadvise64.c delete mode 100644 sysdeps/unix/sysv/linux/mips/mips64/n64/posix_fadvise.c delete mode 100644 sysdeps/unix/sysv/linux/powerpc/powerpc32/posix_fadvise.c delete mode 100644 sysdeps/unix/sysv/linux/powerpc/powerpc32/posix_fadvise64.c delete mode 100644 sysdeps/unix/sysv/linux/wordsize-64/posix_fadvise.c delete mode 100644 sysdeps/unix/sysv/linux/wordsize-64/posix_fadvise64.c diff --git a/ChangeLog b/ChangeLog index c75ae77..3a9785c 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,41 @@ 2016-09-26 Adhemerval Zanella <adhemerval.zanella@linaro.org> + * posix/Makefile (tests): Add tst-posix_fadvise and tst-posix_fadvise64. + * posix/tst-posix_fadvise.c: New file. + * posix/tst-posix_fadvise64.c: Likewise. + * posix/tst-posix_fadvise-common.c: Likewise. + * sysdeps/unix/sysv/linux/arm/kernel-features.h + (__ASSUME_FADVISE64_64_6ARG): Define. + * sysdeps/unix/sysv/linux/powerpc/kernel-features.h + [!__powerpc64__] (__ASSUME_FADVISE64_64_6ARG): Define. + * sysdeps/unix/sysv/linux/tile/kernel-features.h + [!LP64] (__ASSUME_FADVISE64_64_NO_ALIGN): Define. + * sysdeps/unix/sysv/linux/arm/posix_fadvise64.c: Remove file. + * sysdeps/unix/sysv/linux/generic/wordsize-32/posix_fadvise.c: Likewise. + * sysdeps/unix/sysv/linux/i386/posix_fadvise64.S: Likewise. + * sysdeps/unix/sysv/linux/mips/mips32/posix_fadvise.c: Likewise. + * sysdeps/unix/sysv/linux/mips/mips32/posix_fadvise64.c: Likewise. + * sysdeps/unix/sysv/linux/mips/mips64/n32/posix_fadvise.c: Likewise. + * sysdeps/unix/sysv/linux/mips/mips64/n32/posix_fadvise64.c: Likewise. + * sysdeps/unix/sysv/linux/mips/mips64/n64/posix_fadvise.c: Likewise. + * sysdeps/unix/sysv/linux/powerpc/powerpc32/posix_fadvise.c: Likewise. + * sysdeps/unix/sysv/linux/powerpc/powerpc32/posix_fadvise64.c: + Likewise. + * sysdeps/unix/sysv/linux/wordsize-64/posix_fadvise.c: Likewise. + * sysdeps/unix/sysv/linux/wordsize-64/posix_fadvise64.c: Likewise. + * sysdeps/unix/sysv/linux/mips/mips64/n64/posix_fadvise64.c + (SHLIB_COMPAT(libc, GLIBC_2_2, GLIBC_2_3_3) [__posix_fadvise64_l64]: + Alias to __posix_fadvise64_l32. + (SHLIB_COMPAT(libc, GLIBC_2_2, GLIBC_2_3_3) [__posix_fadvise64_l32]: + Add compat definition to posix_fadvise64. + (SHLIB_COMPAT(libc, GLIBC_2_2, GLIBC_2_3_3) [__posix_fadvise64_l64]: + Add versioned definition to posix_fadvise64. + * sysdeps/unix/sysv/linux/posix_fadvise.c (posix_fadvise): Build iff + __OFF_T_MATCHES_OFF64_T is defined, use INTERNAL_SYSCALL_CALL, add + __ASSUME_FADVISE64_64_6ARG/__ASSUME_FADVISE64_64_NO_ALIGN support. + * sysdeps/unix/sysv/linux/posix_fadvise64.c (posix_fadvise64): Add + __ASSUME_FADVISE64_64_NO_ALIGN support and use INTERNAL_SYSCALL_CALL. + * io/Makefile (tests): Add tst-posix_fallocate and tst-posix_fallocate64. * io/tst-posix_fallocate-common.c: New file. diff --git a/posix/Makefile b/posix/Makefile index 3a7719e..97867ca 100644 --- a/posix/Makefile +++ b/posix/Makefile @@ -90,7 +90,8 @@ tests := tstgetopt testfnm runtests runptests \ bug-getopt5 tst-getopt_long1 bug-regex34 bug-regex35 \ tst-pathconf tst-getaddrinfo4 tst-rxspencer-no-utf8 \ tst-fnmatch3 bug-regex36 tst-getaddrinfo5 \ - tst-posix_spawn-fd + tst-posix_spawn-fd \ + tst-posix_fadvise tst-posix_fadvise64 xtests := bug-ga2 ifeq (yes,$(build-shared)) test-srcs := globtest diff --git a/posix/tst-posix_fadvise-common.c b/posix/tst-posix_fadvise-common.c new file mode 100644 index 0000000..7bbf9d9 --- /dev/null +++ b/posix/tst-posix_fadvise-common.c @@ -0,0 +1,116 @@ +/* Common posix_fadvise 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 () + +#include <test-skeleton.c> + +static char *temp_filename; +static int temp_fd; +static char fifoname[] = "/tmp/tst-posix_fadvise-fifo-XXXXXX"; +static int fifofd; + +static void +do_prepare (void) +{ + temp_fd = create_temp_file ("tst-posix_fadvise.", &temp_filename); + if (temp_fd == -1) + { + printf ("cannot create temporary file: %m\n"); + exit (1); + } + + if (mktemp (fifoname) == NULL) + { + printf ("%s: cannot generate temp file name: %m\n", __func__); + exit (1); + } + add_temp_file (fifoname); + + if (mkfifo (fifoname, S_IWUSR | S_IRUSR) != 0) + { + printf ("%s: cannot create fifo: %m\n", __func__); + exit (1); + } + + fifofd = open (fifoname, O_RDONLY | O_NONBLOCK); + if (fifofd == -1) + { + printf ("%s: cannot open fifo: %m\n", __func__); + exit (1); + } +} + +#define FAIL(str) \ + do { \ + printf ("error: %s (line %d)\n", str, __LINE__); \ + return 1; \ + } while (0) + +/* Effectivelly testing posix_fadvise is hard because side effects are not + observed without checking either performance or any kernel specific + supplied information. Also, the syscall is meant to be an advisory, + so kernel is free to use these information in which way it seems as + fit (even ignoring it). + + This test check for some invalid returned operation to check argument + passing and if implementation follows POSIX error definition. */ +static int +do_test_common (void) +{ + /* Add some data to file and ensure it is written down on disk. */ + char buffer[2048] = { 0xcd }; + + if (write (temp_fd, buffer, 2048) != 2048) + FAIL ("write returned a value different than expected 2048"); + + if (fsync (temp_fd) != 0) + FAIL ("fsync failed"); + + /* Test passing an invalid fd. */ + if (posix_fadvise (-1, 0, 0, POSIX_FADV_NORMAL) != EBADF) + FAIL ("posix_fadvise with invalid fd did not return EBADF"); + + /* Test passing an invalid operation. */ + if (posix_fadvise (temp_fd, 0, 0, -1) != EINVAL) + FAIL ("posix_fadvise with invalid advise did not return EINVAL"); + + /* Test passing a FIFO fd. */ + if (posix_fadvise (fifofd, 0, 0, POSIX_FADV_NORMAL) != ESPIPE) + FAIL ("posix_advise with PIPE fd did not return ESPIPE"); + + /* Default fadvise on all file starting at initial position. */ + if (posix_fadvise (temp_fd, 0, 0, POSIX_FADV_NORMAL) != 0) + FAIL ("default posix_fadvise failed"); + + if (posix_fadvise (temp_fd, 0, 4096, POSIX_FADV_NORMAL) != 0) + FAIL ("posix_fadvise failed (offset = 0, len = 4096) failed"); + + if (posix_fadvise (temp_fd, 4096, 0, POSIX_FADV_NORMAL) != 0) + FAIL ("posix_fadvise failed (offset = 4096, len = 0) failed"); + + return 0; +} diff --git a/posix/tst-posix_fadvise.c b/posix/tst-posix_fadvise.c new file mode 100644 index 0000000..6ee0936 --- /dev/null +++ b/posix/tst-posix_fadvise.c @@ -0,0 +1,25 @@ +/* Basic posix_fadvise tests. + 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 "tst-posix_fadvise-common.c" + +static int +do_test (void) +{ + return do_test_common (); +} diff --git a/posix/tst-posix_fadvise64.c b/posix/tst-posix_fadvise64.c new file mode 100644 index 0000000..91d1860 --- /dev/null +++ b/posix/tst-posix_fadvise64.c @@ -0,0 +1,44 @@ +/* Basic posix_fadvise64 tests. + 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_fadvise-common.c" + +static int +do_test (void) +{ + int ret = do_test_common (); + if (ret == -1) + return -1; + + /* Test passing a negative length. The compat fadvise64 might use + off64_t for size argument passing, so using -1 for len without + _FILE_OFFSET_BITS might not trigger the length issue. */ + if (posix_fadvise (temp_fd, 0, -1, POSIX_FADV_NORMAL) != EINVAL) + FAIL ("posix_fadvise with negative length did not return EINVAL"); + + /* Check with some offset values larger than 32-bits. */ + off_t offset = UINT32_MAX + 2048LL; + if (posix_fadvise (temp_fd, 0, offset, POSIX_FADV_NORMAL) != 0) + FAIL ("posix_fadvise failed (offset = 0, len = 4096) failed"); + + if (posix_fadvise (temp_fd, offset, 0, POSIX_FADV_NORMAL) != 0) + FAIL ("posix_fadvise failed (offset = 4096, len = 0) failed"); + + return 0; +} diff --git a/sysdeps/unix/sysv/linux/arm/kernel-features.h b/sysdeps/unix/sysv/linux/arm/kernel-features.h index 6ca607e..628d27f 100644 --- a/sysdeps/unix/sysv/linux/arm/kernel-features.h +++ b/sysdeps/unix/sysv/linux/arm/kernel-features.h @@ -27,6 +27,13 @@ # undef __ASSUME_SET_ROBUST_LIST #endif +/* ARM fadvise64_64 reorganize the syscall arguments. */ +#define __ASSUME_FADVISE64_64_6ARG 1 + /* Define this if your 32-bit syscall API requires 64-bit register pairs to start with an even-number register. */ #define __ASSUME_ALIGNED_REGISTER_PAIRS 1 + +/* ARM only has a syscall for fadvise64{_64} and it defined with a + non-standard name. */ +#define __NR_fadvise64_64 __NR_arm_fadvise64_64 diff --git a/sysdeps/unix/sysv/linux/arm/posix_fadvise64.c b/sysdeps/unix/sysv/linux/arm/posix_fadvise64.c deleted file mode 100644 index ffb3ecd..0000000 --- a/sysdeps/unix/sysv/linux/arm/posix_fadvise64.c +++ /dev/null @@ -1,38 +0,0 @@ -/* Copyright (C) 2003-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 <errno.h> -#include <fcntl.h> -#include <sysdep.h> - -int __posix_fadvise64_l64 (int fd, off64_t offset, off64_t len, int advise); - -/* Advice the system about the expected behaviour of the application with - respect to the file associated with FD. */ - -int -__posix_fadvise64_l64 (int fd, off64_t offset, off64_t len, int advise) -{ - INTERNAL_SYSCALL_DECL (err); - int ret = INTERNAL_SYSCALL (arm_fadvise64_64, err, 6, fd, advise, - __LONG_LONG_PAIR ((long)(offset >> 32), (long)offset), - __LONG_LONG_PAIR ((long)(len >> 32), (long)len)); - if (!INTERNAL_SYSCALL_ERROR_P (ret, err)) - return 0; - return INTERNAL_SYSCALL_ERRNO (ret, err); -} -weak_alias (__posix_fadvise64_l64, posix_fadvise64); diff --git a/sysdeps/unix/sysv/linux/generic/wordsize-32/posix_fadvise.c b/sysdeps/unix/sysv/linux/generic/wordsize-32/posix_fadvise.c deleted file mode 100644 index 7c93a8f..0000000 --- a/sysdeps/unix/sysv/linux/generic/wordsize-32/posix_fadvise.c +++ /dev/null @@ -1,37 +0,0 @@ -/* Copyright (C) 2011-2016 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Chris Metcalf <cmetcalf@tilera.com>, 2011. - - 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 <errno.h> -#include <fcntl.h> -#include <sysdep.h> - -/* Advice the system about the expected behaviour of the application with - respect to the file associated with FD. */ - -int -posix_fadvise (int fd, off_t offset, off_t len, int advise) -{ - INTERNAL_SYSCALL_DECL (err); - int ret = INTERNAL_SYSCALL (fadvise64_64, err, 6, fd, - __LONG_LONG_PAIR (offset >> 31, offset), - __LONG_LONG_PAIR (len >> 31, len), - advise); - if (INTERNAL_SYSCALL_ERROR_P (ret, err)) - return INTERNAL_SYSCALL_ERRNO (ret, err); - return 0; -} diff --git a/sysdeps/unix/sysv/linux/i386/posix_fadvise64.S b/sysdeps/unix/sysv/linux/i386/posix_fadvise64.S deleted file mode 100644 index 4b5d65c..0000000 --- a/sysdeps/unix/sysv/linux/i386/posix_fadvise64.S +++ /dev/null @@ -1,92 +0,0 @@ -/* Copyright (C) 1995-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 <sysdep.h> - -#define EINVAL 22 -#define ENOSYS 38 -#define EOVERFLOW 75 - -#define SVRSP 16 /* saved register space */ -#define PARMS 4+SVRSP /* space for 4 saved regs */ -#define FD PARMS -#define OFFLO FD+4 -#define OFFHI OFFLO+4 -#define LENLO OFFHI+4 -#define LENHI LENLO+4 -#define FLAGS LENHI+4 - - .text -ENTRY (__posix_fadvise64_l64) - - /* Save registers. */ - pushl %ebp - cfi_adjust_cfa_offset (4) - pushl %ebx - cfi_adjust_cfa_offset (4) - pushl %esi - cfi_adjust_cfa_offset (4) - pushl %edi - cfi_adjust_cfa_offset (4) - - movl FD(%esp), %ebx - cfi_rel_offset (ebx, 8) - movl OFFLO(%esp), %ecx - movl OFFHI(%esp), %edx - movl LENLO(%esp), %esi - cfi_rel_offset (esi, 4) - movl LENHI(%esp), %edi - cfi_rel_offset (edi, 0) - movl FLAGS(%esp), %ebp - cfi_rel_offset (ebp, 12) - - movl $SYS_ify(fadvise64_64), %eax - ENTER_KERNEL - - /* Restore registers. */ - popl %edi - cfi_adjust_cfa_offset (-4) - cfi_restore (edi) - popl %esi - cfi_adjust_cfa_offset (-4) - cfi_restore (esi) - popl %ebx - cfi_adjust_cfa_offset (-4) - cfi_restore (ebx) - popl %ebp - cfi_adjust_cfa_offset (-4) - cfi_restore (ebp) - - /* The function returns zero, or the error number. So all we - have to do is negate the value passed back from the kernel. */ - /* If 0 > %eax > -4096 there was an error. */ - negl %eax - - /* Successful; return the syscall's value. */ - ret - -END (__posix_fadvise64_l64) - - .section .text.compat, "ax" -ENTRY (__posix_fadvise64_l32) - DO_CALL (fadvise64, 5) - negl %eax - ret -PSEUDO_END_ERRVAL (__posix_fadvise64_l32) - -default_symbol_version (__posix_fadvise64_l64, posix_fadvise64, GLIBC_2.3.3) -symbol_version (__posix_fadvise64_l32, posix_fadvise64, GLIBC_2.2) diff --git a/sysdeps/unix/sysv/linux/mips/mips32/posix_fadvise.c b/sysdeps/unix/sysv/linux/mips/mips32/posix_fadvise.c deleted file mode 100644 index 705c0c7..0000000 --- a/sysdeps/unix/sysv/linux/mips/mips32/posix_fadvise.c +++ /dev/null @@ -1,41 +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 <errno.h> -#include <fcntl.h> -#include <sysdep.h> - -/* Advice the system about the expected behaviour of the application with - respect to the file associated with FD. */ - -int -posix_fadvise (int fd, off_t offset, off_t len, int advise) -{ -/* MIPS kernel only has NR_fadvise64 which acts as NR_fadvise64_64 */ -#ifdef __NR_fadvise64 - INTERNAL_SYSCALL_DECL (err); - int ret = INTERNAL_SYSCALL (fadvise64, err, 7, fd, 0, - __LONG_LONG_PAIR (offset >> 31, offset), - __LONG_LONG_PAIR (len >> 31, len), - advise); - if (INTERNAL_SYSCALL_ERROR_P (ret, err)) - return INTERNAL_SYSCALL_ERRNO (ret, err); - return 0; -#else - return ENOSYS; -#endif -} diff --git a/sysdeps/unix/sysv/linux/mips/mips32/posix_fadvise64.c b/sysdeps/unix/sysv/linux/mips/mips32/posix_fadvise64.c deleted file mode 100644 index 0ded3c3..0000000 --- a/sysdeps/unix/sysv/linux/mips/mips32/posix_fadvise64.c +++ /dev/null @@ -1,60 +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 <errno.h> -#include <fcntl.h> -#include <sysdep.h> - -/* Advice the system about the expected behaviour of the application with - respect to the file associated with FD. */ - -int -__posix_fadvise64_l64 (int fd, off64_t offset, off64_t len, int advise) -{ -/* MIPS kernel only has NR_fadvise64 which acts as NR_fadvise64_64 */ -#ifdef __NR_fadvise64 - INTERNAL_SYSCALL_DECL (err); - int ret = INTERNAL_SYSCALL (fadvise64, err, 7, fd, 0, - __LONG_LONG_PAIR ((long) (offset >> 32), - (long) offset), - __LONG_LONG_PAIR ((long) (len >> 32), - (long) len), - advise); - if (INTERNAL_SYSCALL_ERROR_P (ret, err)) - return INTERNAL_SYSCALL_ERRNO (ret, err); - return 0; -#else - return ENOSYS; -#endif -} - -#include <shlib-compat.h> - -#if SHLIB_COMPAT(libc, GLIBC_2_2, GLIBC_2_3_3) - -int -attribute_compat_text_section -__posix_fadvise64_l32 (int fd, off64_t offset, size_t len, int advise) -{ - return __posix_fadvise64_l64 (fd, offset, len, advise); -} - -versioned_symbol (libc, __posix_fadvise64_l64, posix_fadvise64, GLIBC_2_3_3); -compat_symbol (libc, __posix_fadvise64_l32, posix_fadvise64, GLIBC_2_2); -#else -strong_alias (__posix_fadvise64_l64, posix_fadvise64); -#endif diff --git a/sysdeps/unix/sysv/linux/mips/mips64/n32/posix_fadvise.c b/sysdeps/unix/sysv/linux/mips/mips64/n32/posix_fadvise.c deleted file mode 100644 index 3b1ef7e..0000000 --- a/sysdeps/unix/sysv/linux/mips/mips64/n32/posix_fadvise.c +++ /dev/null @@ -1,37 +0,0 @@ -/* Copyright (C) 2003-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 <errno.h> -#include <fcntl.h> -#include <sysdep.h> - -/* Advice the system about the expected behaviour of the application with - respect to the file associated with FD. */ - -int -posix_fadvise (int fd, off_t offset, off_t len, int advise) -{ -#ifdef __NR_fadvise64 - INTERNAL_SYSCALL_DECL (err); - int ret = INTERNAL_SYSCALL (fadvise64, err, 4, fd, offset, len, advise); - if (INTERNAL_SYSCALL_ERROR_P (ret, err)) - return INTERNAL_SYSCALL_ERRNO (ret, err); - return 0; -#else - return ENOSYS; -#endif -} diff --git a/sysdeps/unix/sysv/linux/mips/mips64/n32/posix_fadvise64.c b/sysdeps/unix/sysv/linux/mips/mips64/n32/posix_fadvise64.c deleted file mode 100644 index e7ddc87..0000000 --- a/sysdeps/unix/sysv/linux/mips/mips64/n32/posix_fadvise64.c +++ /dev/null @@ -1,55 +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 <errno.h> -#include <fcntl.h> -#include <sysdep.h> - -/* Advice the system about the expected behaviour of the application with - respect to the file associated with FD. */ - -int -__posix_fadvise64_l64 (int fd, off64_t offset, off64_t len, int advise) -{ -/* MIPS kernel only has NR_fadvise64 which acts as NR_fadvise64_64 */ -#ifdef __NR_fadvise64 - INTERNAL_SYSCALL_DECL (err); - int ret = INTERNAL_SYSCALL (fadvise64, err, 4, fd, offset, len, advise); - if (INTERNAL_SYSCALL_ERROR_P (ret, err)) - return INTERNAL_SYSCALL_ERRNO (ret, err); - return 0; -#else - return ENOSYS; -#endif -} - -#include <shlib-compat.h> - -#if SHLIB_COMPAT(libc, GLIBC_2_2, GLIBC_2_3_3) - -int -attribute_compat_text_section -__posix_fadvise64_l32 (int fd, off64_t offset, size_t len, int advise) -{ - return __posix_fadvise64_l64 (fd, offset, len, advise); -} - -versioned_symbol (libc, __posix_fadvise64_l64, posix_fadvise64, GLIBC_2_3_3); -compat_symbol (libc, __posix_fadvise64_l32, posix_fadvise64, GLIBC_2_2); -#else -strong_alias (__posix_fadvise64_l64, posix_fadvise64); -#endif diff --git a/sysdeps/unix/sysv/linux/mips/mips64/n64/posix_fadvise.c b/sysdeps/unix/sysv/linux/mips/mips64/n64/posix_fadvise.c deleted file mode 100644 index 86ff6ef..0000000 --- a/sysdeps/unix/sysv/linux/mips/mips64/n64/posix_fadvise.c +++ /dev/null @@ -1,50 +0,0 @@ -/* Copyright (C) 2003-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 posix_fadvise64 __no_posix_fadvise64 -#include <errno.h> -#include <fcntl.h> -#include <sysdep.h> -#undef posix_fadvise64 - -/* Advice the system about the expected behaviour of the application with - respect to the file associated with FD. */ - -int -posix_fadvise (int fd, off_t offset, off_t len, int advise) -{ -#ifdef __NR_fadvise64 - INTERNAL_SYSCALL_DECL (err); - int ret = INTERNAL_SYSCALL (fadvise64, err, 4, fd, offset, len, advise); - if (INTERNAL_SYSCALL_ERROR_P (ret, err)) - return INTERNAL_SYSCALL_ERRNO (ret, err); - return 0; -#else - return ENOSYS; -#endif -} - -#include <shlib-compat.h> - -#if SHLIB_COMPAT(libc, GLIBC_2_2, GLIBC_2_3_3) -strong_alias (posix_fadvise, __posix_fadvise64_l32); -compat_symbol (libc, __posix_fadvise64_l32, posix_fadvise64, GLIBC_2_2); -strong_alias (posix_fadvise, __posix_fadvise64_l64); -versioned_symbol (libc, __posix_fadvise64_l64, posix_fadvise64, GLIBC_2_3_3); -#else -weak_alias (posix_fadvise, posix_fadvise64); -#endif diff --git a/sysdeps/unix/sysv/linux/mips/mips64/n64/posix_fadvise64.c b/sysdeps/unix/sysv/linux/mips/mips64/n64/posix_fadvise64.c index c9f72c4..d7aab25 100644 --- a/sysdeps/unix/sysv/linux/mips/mips64/n64/posix_fadvise64.c +++ b/sysdeps/unix/sysv/linux/mips/mips64/n64/posix_fadvise64.c @@ -1 +1,28 @@ -/* posix_fadvise64 is in posix_fadvise.c */ +/* Copyright (C) 2003-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/>. */ + +#undef strong_alias +#define strong_alias(a, b) + +#include <sysdeps/unix/sysv/linux/posix_fadvise64.c> + +#if SHLIB_COMPAT(libc, GLIBC_2_2, GLIBC_2_3_3) +_strong_alias (__posix_fadvise64_l64, __posix_fadvise64_l32); +compat_symbol (libc, __posix_fadvise64_l32, posix_fadvise64, GLIBC_2_2); +versioned_symbol (libc, __posix_fadvise64_l64, posix_fadvise64, GLIBC_2_3_3); +#endif +_strong_alias (__posix_fadvise64_l64, posix_fadvise); diff --git a/sysdeps/unix/sysv/linux/posix_fadvise.c b/sysdeps/unix/sysv/linux/posix_fadvise.c index 093d707..869a642 100644 --- a/sysdeps/unix/sysv/linux/posix_fadvise.c +++ b/sysdeps/unix/sysv/linux/posix_fadvise.c @@ -22,27 +22,46 @@ /* Advice the system about the expected behaviour of the application with respect to the file associated with FD. */ +#ifndef __OFF_T_MATCHES_OFF64_T + +/* Both arm and powerpc implements fadvise64_64 with last 'advise' argument + just after 'fd' to avoid the requirement of implementing 7-arg syscalls. + ARM also defines __NR_fadvise64_64 as __NR_arm_fadvise64_64. + + tile requires __ASSUME_ALIGNED_REGISTER_PAIRS but implements the 32-bit + fadvise64_64 without the padding 0 after fd. + + s390 implements fadvice64_64 using a specific struct with arguments + packed inside. This is the only implementation handled in arch-specific + code. */ + int posix_fadvise (int fd, off_t offset, off_t len, int advise) { -#if defined(__NR_fadvise64) || defined(__NR_fadvise64_64) INTERNAL_SYSCALL_DECL (err); # ifdef __NR_fadvise64 - int ret = INTERNAL_SYSCALL (fadvise64, err, 5, fd, - __LONG_LONG_PAIR (offset >> 31, offset), len, - advise); + int ret = INTERNAL_SYSCALL_CALL (fadvise64, err, fd, + __ALIGNMENT_ARG SYSCALL_LL (offset), + len, advise); # else - int ret = INTERNAL_SYSCALL (fadvise64_64, err, 6, fd, - __LONG_LONG_PAIR ((long) (offset >> 31), - (long) offset), - __LONG_LONG_PAIR ((long) (len >> 31), - (long) len), - advise); +# ifdef __ASSUME_FADVISE64_64_6ARG + int ret = INTERNAL_SYSCALL_CALL (fadvise64_64, err, fd, advise, + __ALIGNMENT_ARG SYSCALL_LL (offset), + SYSCALL_LL (len)); +# else + +# ifdef __ASSUME_FADVISE64_64_NO_ALIGN +# undef __ALIGNMENT_ARG +# define __ALIGNMENT_ARG +# endif + + int ret = INTERNAL_SYSCALL_CALL (fadvise64_64, err, fd, + __ALIGNMENT_ARG SYSCALL_LL (offset), + SYSCALL_LL (len), advise); +# endif # endif if (INTERNAL_SYSCALL_ERROR_P (ret, err)) return INTERNAL_SYSCALL_ERRNO (ret, err); return 0; -#else - return ENOSYS; -#endif } +#endif /* __OFF_T_MATCHES_OFF64_T */ diff --git a/sysdeps/unix/sysv/linux/posix_fadvise64.c b/sysdeps/unix/sysv/linux/posix_fadvise64.c index 6d10558..b4adb5f 100644 --- a/sysdeps/unix/sysv/linux/posix_fadvise64.c +++ b/sysdeps/unix/sysv/linux/posix_fadvise64.c @@ -17,10 +17,29 @@ #include <errno.h> #include <fcntl.h> -#include <sysdep.h> +#include <shlib-compat.h> int __posix_fadvise64_l64 (int fd, off64_t offset, off64_t len, int advise); -int __posix_fadvise64_l32 (int fd, off64_t offset, size_t len, int advise); + +/* Both arm and powerpc implements fadvise64_64 with last 'advise' argument + just after 'fd' to avoid the requirement of implementing 7-arg syscalls. + ARM also defines __NR_fadvise64_64 as __NR_arm_fadvise64_64. + + tile requires __ASSUME_ALIGNED_REGISTER_PAIRS but implements the 32-bit + fadvise64_64 without the padding 0 after fd. + + s390 implements fadvice64_64 using a specific struct with arguments + packed inside. This is the only implementation handled in arch-specific + code. */ + +#ifdef __ASSUME_FADVISE64_64_NO_ALIGN +# undef __ALIGNMENT_ARG +# define __ALIGNMENT_ARG +#endif + +#ifndef __NR_fadvise64_64 +# define __NR_fadvise64_64 __NR_fadvise64 +#endif /* Advice the system about the expected behaviour of the application with respect to the file associated with FD. */ @@ -29,20 +48,24 @@ int __posix_fadvise64_l64 (int fd, off64_t offset, off64_t len, int advise) { INTERNAL_SYSCALL_DECL (err); - int ret = INTERNAL_SYSCALL (fadvise64_64, err, 6, fd, - __LONG_LONG_PAIR ((long) (offset >> 32), - (long) offset), - __LONG_LONG_PAIR ((long) (len >> 32), - (long) len), - advise); +#ifdef __ASSUME_FADVISE64_64_6ARG + int ret = INTERNAL_SYSCALL_CALL (fadvise64_64, err, fd, advise, + SYSCALL_LL64 (offset), SYSCALL_LL64 (len)); +#else + int ret = INTERNAL_SYSCALL_CALL (fadvise64_64, err, fd, + __ALIGNMENT_ARG SYSCALL_LL64 (offset), + SYSCALL_LL64 (len), advise); +#endif if (!INTERNAL_SYSCALL_ERROR_P (ret, err)) return 0; return INTERNAL_SYSCALL_ERRNO (ret, err); } -#include <shlib-compat.h> - -#if SHLIB_COMPAT(libc, GLIBC_2_2, GLIBC_2_3_3) +/* The type of the len argument was changed from size_t to off_t in + POSIX.1-2003 TC1. */ +#ifndef __OFF_T_MATCHES_OFF64_T +# if SHLIB_COMPAT(libc, GLIBC_2_2, GLIBC_2_3_3) +int __posix_fadvise64_l32 (int fd, off64_t offset, size_t len, int advise); int attribute_compat_text_section @@ -53,6 +76,10 @@ __posix_fadvise64_l32 (int fd, off64_t offset, size_t len, int advise) versioned_symbol (libc, __posix_fadvise64_l64, posix_fadvise64, GLIBC_2_3_3); compat_symbol (libc, __posix_fadvise64_l32, posix_fadvise64, GLIBC_2_2); +# else +weak_alias (__posix_fadvise64_l64, posix_fadvise64); +# endif #else -strong_alias (__posix_fadvise64_l64, posix_fadvise64); +weak_alias (__posix_fadvise64_l64, posix_fadvise64); +strong_alias (__posix_fadvise64_l64, posix_fadvise); #endif diff --git a/sysdeps/unix/sysv/linux/powerpc/kernel-features.h b/sysdeps/unix/sysv/linux/powerpc/kernel-features.h index 996535f..42a53f2 100644 --- a/sysdeps/unix/sysv/linux/powerpc/kernel-features.h +++ b/sysdeps/unix/sysv/linux/powerpc/kernel-features.h @@ -46,4 +46,9 @@ # define __ASSUME_ALIGNED_REGISTER_PAIRS 1 #endif +/* powerpc compat fadvise64_64 reorganize the syscall argument. */ +#ifndef __powerpc64__ +# define __ASSUME_FADVISE64_64_6ARG 1 +#endif + #include_next <kernel-features.h> diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/posix_fadvise.c b/sysdeps/unix/sysv/linux/powerpc/powerpc32/posix_fadvise.c deleted file mode 100644 index e846bf5..0000000 --- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/posix_fadvise.c +++ /dev/null @@ -1,39 +0,0 @@ -/* Copyright (C) 2003-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 <errno.h> -#include <fcntl.h> -#include <sysdep.h> - -/* Advice the system about the expected behaviour of the application with - respect to the file associated with FD. */ - -int -posix_fadvise (int fd, off_t offset, off_t len, int advise) -{ -#ifdef __NR_fadvise64 - INTERNAL_SYSCALL_DECL (err); - int ret = INTERNAL_SYSCALL (fadvise64, err, 6, fd, 0, - __LONG_LONG_PAIR (offset >> 31, offset), len, - advise); - if (INTERNAL_SYSCALL_ERROR_P (ret, err)) - return INTERNAL_SYSCALL_ERRNO (ret, err); - return 0; -#else - return ENOSYS; -#endif -} diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/posix_fadvise64.c b/sysdeps/unix/sysv/linux/powerpc/powerpc32/posix_fadvise64.c deleted file mode 100644 index c26206f..0000000 --- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/posix_fadvise64.c +++ /dev/null @@ -1,55 +0,0 @@ -/* Copyright (C) 2003-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 <errno.h> -#include <fcntl.h> -#include <sysdep.h> - -int __posix_fadvise64_l64 (int fd, off64_t offset, off64_t len, int advise); -int __posix_fadvise64_l32 (int fd, off64_t offset, size_t len, int advise); - -/* Advice the system about the expected behaviour of the application with - respect to the file associated with FD. */ - -int -__posix_fadvise64_l64 (int fd, off64_t offset, off64_t len, int advise) -{ - INTERNAL_SYSCALL_DECL (err); - int ret = INTERNAL_SYSCALL (fadvise64_64, err, 6, fd, advise, - __LONG_LONG_PAIR ((long)(offset >> 32), (long)offset), - __LONG_LONG_PAIR ((long)(len >> 32), (long)len)); - if (!INTERNAL_SYSCALL_ERROR_P (ret, err)) - return 0; - return INTERNAL_SYSCALL_ERRNO (ret, err); -} - -#include <shlib-compat.h> - -#if SHLIB_COMPAT(libc, GLIBC_2_2, GLIBC_2_3_3) - -int -attribute_compat_text_section -__posix_fadvise64_l32 (int fd, off64_t offset, size_t len, int advise) -{ - return __posix_fadvise64_l64 (fd, offset, len, advise); -} - -versioned_symbol (libc, __posix_fadvise64_l64, posix_fadvise64, GLIBC_2_3_3); -compat_symbol (libc, __posix_fadvise64_l32, posix_fadvise64, GLIBC_2_2); -#else -strong_alias (__posix_fadvise64_l64, posix_fadvise64); -#endif diff --git a/sysdeps/unix/sysv/linux/tile/kernel-features.h b/sysdeps/unix/sysv/linux/tile/kernel-features.h index 9425e1c..ded0e43 100644 --- a/sysdeps/unix/sysv/linux/tile/kernel-features.h +++ b/sysdeps/unix/sysv/linux/tile/kernel-features.h @@ -23,4 +23,5 @@ pairs to start with an even-number register. */ #ifndef _LP64 # define __ASSUME_ALIGNED_REGISTER_PAIRS 1 +# define __ASSUME_FADVISE64_64_NO_ALIGN 1 #endif diff --git a/sysdeps/unix/sysv/linux/wordsize-64/posix_fadvise.c b/sysdeps/unix/sysv/linux/wordsize-64/posix_fadvise.c deleted file mode 100644 index 137b591..0000000 --- a/sysdeps/unix/sysv/linux/wordsize-64/posix_fadvise.c +++ /dev/null @@ -1,40 +0,0 @@ -/* Copyright (C) 2003-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 posix_fadvise64 __no_posix_fadvise64 -#include <errno.h> -#include <fcntl.h> -#include <sysdep.h> -#undef posix_fadvise64 - -/* Advice the system about the expected behaviour of the application with - respect to the file associated with FD. */ - -int -posix_fadvise (int fd, off_t offset, off_t len, int advise) -{ -#ifdef __NR_fadvise64 - INTERNAL_SYSCALL_DECL (err); - int ret = INTERNAL_SYSCALL (fadvise64, err, 4, fd, offset, len, advise); - if (INTERNAL_SYSCALL_ERROR_P (ret, err)) - return INTERNAL_SYSCALL_ERRNO (ret, err); - return 0; -#else - return ENOSYS; -#endif -} -weak_alias (posix_fadvise, posix_fadvise64) diff --git a/sysdeps/unix/sysv/linux/wordsize-64/posix_fadvise64.c b/sysdeps/unix/sysv/linux/wordsize-64/posix_fadvise64.c deleted file mode 100644 index c9f72c4..0000000 --- a/sysdeps/unix/sysv/linux/wordsize-64/posix_fadvise64.c +++ /dev/null @@ -1 +0,0 @@ -/* posix_fadvise64 is in posix_fadvise.c */ -- 2.7.4 ^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: [PATCH v2 3/3] Consolidate posix_fadvise implementations 2016-09-28 0:15 ` [PATCH v2 3/3] Consolidate posix_fadvise implementations Adhemerval Zanella @ 2016-10-05 17:15 ` Siddhesh Poyarekar 2016-10-06 20:50 ` Adhemerval Zanella 2016-10-11 23:47 ` Joseph Myers 0 siblings, 2 replies; 27+ messages in thread From: Siddhesh Poyarekar @ 2016-10-05 17:15 UTC (permalink / raw) To: Adhemerval Zanella, libc-alpha On Wednesday 28 September 2016 05:45 AM, Adhemerval Zanella wrote: > From: Adhemerval Zanella <adhemerval.zanella@linaro.org> > > This patch consolidates mostly of the Linux posix_fallocate{64} implementations > on sysdeps/unix/sysv/linux/posix_fallocate{64}.c. It still keeps arch-specific > files for: I guess you mean posix_fadvise :) > > * S390-32: it uses a packed structure to pass all the arguments on syscall. > It is the only supported port that implements __NR_fadvise64_64 in this > way. > > * ARM: it does not implement __NR_fadvise64 (as other 32-bits ports), so > posix_fadvise calls internal posix_fadvise64 symbol. > > * MIPS64 n64: it requires a different version number that other ports. > > The new macro SYSCALL_LL{64} is used to handle the offset argument and > INTERNAL_SYSCALL_CALL to handle passing the correct number of expect > arguments. > > The default Linux adds two new defines a port can use to control how > __NR_fadvise64_64 passes the kernel arguments: > > * __ASSUME_FADVISE64_64_6ARG: the 'advise' argument is moved on second > position. This is the case of powerpc32 and arm to avoid implement > 7 argument syscall. > > * __ASSUME_FADVISE64_64_NO_ALIGN: for ABIs that defines > __ASSUME_ALIGNED_REGISTER_PAIRS packs the offset without the leading > '0'. This is the case of tile 32 bits. > > ARM also defines __NR_fadvise64_64 as __NR_arm_fadvise64_64 (which is also > handled on arch kernel-feature.h). > > Tested on x86_64, x32, i686, armhf, and aarch64. > > * posix/Makefile (tests): Add tst-posix_fadvise and tst-posix_fadvise64. > * posix/tst-posix_fadvise.c: New file. > * posix/tst-posix_fadvise64.c: Likewise. > * posix/tst-posix_fadvise-common.c: Likewise. > * sysdeps/unix/sysv/linux/arm/kernel-features.h > (__ASSUME_FADVISE64_64_6ARG): Define. > * sysdeps/unix/sysv/linux/powerpc/kernel-features.h > [!__powerpc64__] (__ASSUME_FADVISE64_64_6ARG): Add define. > * sysdeps/unix/sysv/linux/arm/posix_fadvise64.c: Remove file. > * sysdeps/unix/sysv/linux/generic/wordsize-32/posix_fadvise.c: Likewise. > * sysdeps/unix/sysv/linux/i386/posix_fadvise64.S: Likewise. > * sysdeps/unix/sysv/linux/mips/mips32/posix_fadvise.c: Likewise. > * sysdeps/unix/sysv/linux/mips/mips32/posix_fadvise64.c: Likewise. > * sysdeps/unix/sysv/linux/mips/mips64/n32/posix_fadvise.c: Likewise. > * sysdeps/unix/sysv/linux/mips/mips64/n32/posix_fadvise64.c: Likewise. > * sysdeps/unix/sysv/linux/mips/mips64/n64/posix_fadvise.c: Likewise. > * sysdeps/unix/sysv/linux/powerpc/powerpc32/posix_fadvise.c: Likewise. > * sysdeps/unix/sysv/linux/powerpc/powerpc32/posix_fadvise64.c: > Likewise. > * sysdeps/unix/sysv/linux/wordsize-64/posix_fadvise.c: Likewise. > * sysdeps/unix/sysv/linux/wordsize-64/posix_fadvise64.c: Likewise. > * sysdeps/unix/sysv/linux/mips/mips64/n64/posix_fadvise64.c > (SHLIB_COMPAT(libc, GLIBC_2_2, GLIBC_2_3_3) [__posix_fadvise64_l64]: > Alias to __posix_fadvise64_l32. > (SHLIB_COMPAT(libc, GLIBC_2_2, GLIBC_2_3_3) [__posix_fadvise64_l32]: > Add compat definition to posix_fadvise64. > (SHLIB_COMPAT(libc, GLIBC_2_2, GLIBC_2_3_3) [__posix_fadvise64_l64]: > Add versioned definition to posix_fadvise64. > * sysdeps/unix/sysv/linux/posix_fadvise.c (posix_fadvise): Build iff > __OFF_T_MATCHES_OFF64_T is defined, use INTERNAL_SYSCALL_CALL, add > __ASSUME_FADVISE64_64_6ARG/__ASSUME_FADVISE64_64_NO_ALIGN support. > * sysdeps/unix/sysv/linux/posix_fadvise64.c (posix_fadvise64): Add > __ASSUME_FADVISE64_64_NO_ALIGN support and use INTERNAL_SYSCALL_CALL. > --- > ChangeLog | 36 +++++++ > posix/Makefile | 3 +- > posix/tst-posix_fadvise-common.c | 116 +++++++++++++++++++++ > posix/tst-posix_fadvise.c | 25 +++++ > posix/tst-posix_fadvise64.c | 44 ++++++++ > sysdeps/unix/sysv/linux/arm/kernel-features.h | 7 ++ > sysdeps/unix/sysv/linux/arm/posix_fadvise64.c | 38 ------- > .../sysv/linux/generic/wordsize-32/posix_fadvise.c | 37 ------- > sysdeps/unix/sysv/linux/i386/posix_fadvise64.S | 92 ---------------- > .../unix/sysv/linux/mips/mips32/posix_fadvise.c | 41 -------- > .../unix/sysv/linux/mips/mips32/posix_fadvise64.c | 60 ----------- > .../sysv/linux/mips/mips64/n32/posix_fadvise.c | 37 ------- > .../sysv/linux/mips/mips64/n32/posix_fadvise64.c | 55 ---------- > .../sysv/linux/mips/mips64/n64/posix_fadvise.c | 50 --------- > .../sysv/linux/mips/mips64/n64/posix_fadvise64.c | 29 +++++- > sysdeps/unix/sysv/linux/posix_fadvise.c | 45 +++++--- > sysdeps/unix/sysv/linux/posix_fadvise64.c | 51 ++++++--- > sysdeps/unix/sysv/linux/powerpc/kernel-features.h | 5 + > .../sysv/linux/powerpc/powerpc32/posix_fadvise.c | 39 ------- > .../sysv/linux/powerpc/powerpc32/posix_fadvise64.c | 55 ---------- > sysdeps/unix/sysv/linux/tile/kernel-features.h | 1 + > .../unix/sysv/linux/wordsize-64/posix_fadvise.c | 40 ------- > .../unix/sysv/linux/wordsize-64/posix_fadvise64.c | 1 - > 23 files changed, 335 insertions(+), 572 deletions(-) > create mode 100644 posix/tst-posix_fadvise-common.c > create mode 100644 posix/tst-posix_fadvise.c > create mode 100644 posix/tst-posix_fadvise64.c > delete mode 100644 sysdeps/unix/sysv/linux/arm/posix_fadvise64.c > delete mode 100644 sysdeps/unix/sysv/linux/generic/wordsize-32/posix_fadvise.c > delete mode 100644 sysdeps/unix/sysv/linux/i386/posix_fadvise64.S > delete mode 100644 sysdeps/unix/sysv/linux/mips/mips32/posix_fadvise.c > delete mode 100644 sysdeps/unix/sysv/linux/mips/mips32/posix_fadvise64.c > delete mode 100644 sysdeps/unix/sysv/linux/mips/mips64/n32/posix_fadvise.c > delete mode 100644 sysdeps/unix/sysv/linux/mips/mips64/n32/posix_fadvise64.c > delete mode 100644 sysdeps/unix/sysv/linux/mips/mips64/n64/posix_fadvise.c > delete mode 100644 sysdeps/unix/sysv/linux/powerpc/powerpc32/posix_fadvise.c > delete mode 100644 sysdeps/unix/sysv/linux/powerpc/powerpc32/posix_fadvise64.c > delete mode 100644 sysdeps/unix/sysv/linux/wordsize-64/posix_fadvise.c > delete mode 100644 sysdeps/unix/sysv/linux/wordsize-64/posix_fadvise64.c > > diff --git a/ChangeLog b/ChangeLog > index c75ae77..3a9785c 100644 > --- a/ChangeLog > +++ b/ChangeLog > @@ -1,5 +1,41 @@ > 2016-09-26 Adhemerval Zanella <adhemerval.zanella@linaro.org> > > + * posix/Makefile (tests): Add tst-posix_fadvise and tst-posix_fadvise64. > + * posix/tst-posix_fadvise.c: New file. > + * posix/tst-posix_fadvise64.c: Likewise. > + * posix/tst-posix_fadvise-common.c: Likewise. > + * sysdeps/unix/sysv/linux/arm/kernel-features.h > + (__ASSUME_FADVISE64_64_6ARG): Define. > + * sysdeps/unix/sysv/linux/powerpc/kernel-features.h > + [!__powerpc64__] (__ASSUME_FADVISE64_64_6ARG): Define. > + * sysdeps/unix/sysv/linux/tile/kernel-features.h > + [!LP64] (__ASSUME_FADVISE64_64_NO_ALIGN): Define. > + * sysdeps/unix/sysv/linux/arm/posix_fadvise64.c: Remove file. > + * sysdeps/unix/sysv/linux/generic/wordsize-32/posix_fadvise.c: Likewise. > + * sysdeps/unix/sysv/linux/i386/posix_fadvise64.S: Likewise. > + * sysdeps/unix/sysv/linux/mips/mips32/posix_fadvise.c: Likewise. > + * sysdeps/unix/sysv/linux/mips/mips32/posix_fadvise64.c: Likewise. > + * sysdeps/unix/sysv/linux/mips/mips64/n32/posix_fadvise.c: Likewise. > + * sysdeps/unix/sysv/linux/mips/mips64/n32/posix_fadvise64.c: Likewise. > + * sysdeps/unix/sysv/linux/mips/mips64/n64/posix_fadvise.c: Likewise. > + * sysdeps/unix/sysv/linux/powerpc/powerpc32/posix_fadvise.c: Likewise. > + * sysdeps/unix/sysv/linux/powerpc/powerpc32/posix_fadvise64.c: > + Likewise. > + * sysdeps/unix/sysv/linux/wordsize-64/posix_fadvise.c: Likewise. > + * sysdeps/unix/sysv/linux/wordsize-64/posix_fadvise64.c: Likewise. > + * sysdeps/unix/sysv/linux/mips/mips64/n64/posix_fadvise64.c > + (SHLIB_COMPAT(libc, GLIBC_2_2, GLIBC_2_3_3) [__posix_fadvise64_l64]: > + Alias to __posix_fadvise64_l32. > + (SHLIB_COMPAT(libc, GLIBC_2_2, GLIBC_2_3_3) [__posix_fadvise64_l32]: > + Add compat definition to posix_fadvise64. > + (SHLIB_COMPAT(libc, GLIBC_2_2, GLIBC_2_3_3) [__posix_fadvise64_l64]: > + Add versioned definition to posix_fadvise64. > + * sysdeps/unix/sysv/linux/posix_fadvise.c (posix_fadvise): Build iff > + __OFF_T_MATCHES_OFF64_T is defined, use INTERNAL_SYSCALL_CALL, add > + __ASSUME_FADVISE64_64_6ARG/__ASSUME_FADVISE64_64_NO_ALIGN support. > + * sysdeps/unix/sysv/linux/posix_fadvise64.c (posix_fadvise64): Add > + __ASSUME_FADVISE64_64_NO_ALIGN support and use INTERNAL_SYSCALL_CALL. > + > * io/Makefile (tests): Add tst-posix_fallocate and > tst-posix_fallocate64. > * io/tst-posix_fallocate-common.c: New file. > diff --git a/posix/Makefile b/posix/Makefile > index 3a7719e..97867ca 100644 > --- a/posix/Makefile > +++ b/posix/Makefile > @@ -90,7 +90,8 @@ tests := tstgetopt testfnm runtests runptests \ > bug-getopt5 tst-getopt_long1 bug-regex34 bug-regex35 \ > tst-pathconf tst-getaddrinfo4 tst-rxspencer-no-utf8 \ > tst-fnmatch3 bug-regex36 tst-getaddrinfo5 \ > - tst-posix_spawn-fd > + tst-posix_spawn-fd \ > + tst-posix_fadvise tst-posix_fadvise64 > xtests := bug-ga2 > ifeq (yes,$(build-shared)) > test-srcs := globtest > diff --git a/posix/tst-posix_fadvise-common.c b/posix/tst-posix_fadvise-common.c > new file mode 100644 > index 0000000..7bbf9d9 > --- /dev/null > +++ b/posix/tst-posix_fadvise-common.c > @@ -0,0 +1,116 @@ > +/* Common posix_fadvise 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 () > + > +#include <test-skeleton.c> > + > +static char *temp_filename; > +static int temp_fd; > +static char fifoname[] = "/tmp/tst-posix_fadvise-fifo-XXXXXX"; > +static int fifofd; > + > +static void > +do_prepare (void) > +{ > + temp_fd = create_temp_file ("tst-posix_fadvise.", &temp_filename); > + if (temp_fd == -1) > + { > + printf ("cannot create temporary file: %m\n"); > + exit (1); > + } > + > + if (mktemp (fifoname) == NULL) > + { > + printf ("%s: cannot generate temp file name: %m\n", __func__); > + exit (1); > + } > + add_temp_file (fifoname); > + > + if (mkfifo (fifoname, S_IWUSR | S_IRUSR) != 0) > + { > + printf ("%s: cannot create fifo: %m\n", __func__); > + exit (1); > + } > + > + fifofd = open (fifoname, O_RDONLY | O_NONBLOCK); > + if (fifofd == -1) > + { > + printf ("%s: cannot open fifo: %m\n", __func__); > + exit (1); > + } > +} > + > +#define FAIL(str) \ > + do { \ > + printf ("error: %s (line %d)\n", str, __LINE__); \ > + return 1; \ > + } while (0) Use the new FAIL definition in test-skeleton.c that you'll add from 1/3. > + > +/* Effectivelly testing posix_fadvise is hard because side effects are not > + observed without checking either performance or any kernel specific > + supplied information. Also, the syscall is meant to be an advisory, > + so kernel is free to use these information in which way it seems as > + fit (even ignoring it). "so the kernel is free to use this information in any way it deems fit, including ignoring it." > + > + This test check for some invalid returned operation to check argument > + passing and if implementation follows POSIX error definition. */ > +static int > +do_test_common (void) > +{ > + /* Add some data to file and ensure it is written down on disk. */ "written to disk". > + char buffer[2048] = { 0xcd }; > + > + if (write (temp_fd, buffer, 2048) != 2048) > + FAIL ("write returned a value different than expected 2048"); > + > + if (fsync (temp_fd) != 0) > + FAIL ("fsync failed"); > + > + /* Test passing an invalid fd. */ > + if (posix_fadvise (-1, 0, 0, POSIX_FADV_NORMAL) != EBADF) > + FAIL ("posix_fadvise with invalid fd did not return EBADF"); > + > + /* Test passing an invalid operation. */ > + if (posix_fadvise (temp_fd, 0, 0, -1) != EINVAL) > + FAIL ("posix_fadvise with invalid advise did not return EINVAL"); > + > + /* Test passing a FIFO fd. */ > + if (posix_fadvise (fifofd, 0, 0, POSIX_FADV_NORMAL) != ESPIPE) > + FAIL ("posix_advise with PIPE fd did not return ESPIPE"); > + > + /* Default fadvise on all file starting at initial position. */ > + if (posix_fadvise (temp_fd, 0, 0, POSIX_FADV_NORMAL) != 0) > + FAIL ("default posix_fadvise failed"); > + > + if (posix_fadvise (temp_fd, 0, 4096, POSIX_FADV_NORMAL) != 0) > + FAIL ("posix_fadvise failed (offset = 0, len = 4096) failed"); > + > + if (posix_fadvise (temp_fd, 4096, 0, POSIX_FADV_NORMAL) != 0) > + FAIL ("posix_fadvise failed (offset = 4096, len = 0) failed"); > + > + return 0; > +} > diff --git a/posix/tst-posix_fadvise.c b/posix/tst-posix_fadvise.c > new file mode 100644 > index 0000000..6ee0936 > --- /dev/null > +++ b/posix/tst-posix_fadvise.c > @@ -0,0 +1,25 @@ > +/* Basic posix_fadvise tests. > + 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 "tst-posix_fadvise-common.c" > + > +static int > +do_test (void) > +{ > + return do_test_common (); > +} > diff --git a/posix/tst-posix_fadvise64.c b/posix/tst-posix_fadvise64.c > new file mode 100644 > index 0000000..91d1860 > --- /dev/null > +++ b/posix/tst-posix_fadvise64.c > @@ -0,0 +1,44 @@ > +/* Basic posix_fadvise64 tests. > + 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_fadvise-common.c" > + > +static int > +do_test (void) > +{ > + int ret = do_test_common (); > + if (ret == -1) > + return -1; do_test_common returns 1, not -1. > + > + /* Test passing a negative length. The compat fadvise64 might use > + off64_t for size argument passing, so using -1 for len without > + _FILE_OFFSET_BITS might not trigger the length issue. */ > + if (posix_fadvise (temp_fd, 0, -1, POSIX_FADV_NORMAL) != EINVAL) > + FAIL ("posix_fadvise with negative length did not return EINVAL"); > + > + /* Check with some offset values larger than 32-bits. */ > + off_t offset = UINT32_MAX + 2048LL; > + if (posix_fadvise (temp_fd, 0, offset, POSIX_FADV_NORMAL) != 0) > + FAIL ("posix_fadvise failed (offset = 0, len = 4096) failed"); > + > + if (posix_fadvise (temp_fd, offset, 0, POSIX_FADV_NORMAL) != 0) > + FAIL ("posix_fadvise failed (offset = 4096, len = 0) failed"); > + > + return 0; > +} > diff --git a/sysdeps/unix/sysv/linux/arm/kernel-features.h b/sysdeps/unix/sysv/linux/arm/kernel-features.h > index 6ca607e..628d27f 100644 > --- a/sysdeps/unix/sysv/linux/arm/kernel-features.h > +++ b/sysdeps/unix/sysv/linux/arm/kernel-features.h > @@ -27,6 +27,13 @@ > # undef __ASSUME_SET_ROBUST_LIST > #endif > > +/* ARM fadvise64_64 reorganize the syscall arguments. */ > +#define __ASSUME_FADVISE64_64_6ARG 1 > + > /* Define this if your 32-bit syscall API requires 64-bit register > pairs to start with an even-number register. */ > #define __ASSUME_ALIGNED_REGISTER_PAIRS 1 > + > +/* ARM only has a syscall for fadvise64{_64} and it defined with a > + non-standard name. */ "it is defined" > +#define __NR_fadvise64_64 __NR_arm_fadvise64_64 > diff --git a/sysdeps/unix/sysv/linux/arm/posix_fadvise64.c b/sysdeps/unix/sysv/linux/arm/posix_fadvise64.c > deleted file mode 100644 > index ffb3ecd..0000000 > --- a/sysdeps/unix/sysv/linux/arm/posix_fadvise64.c > +++ /dev/null > @@ -1,38 +0,0 @@ > -/* Copyright (C) 2003-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 <errno.h> > -#include <fcntl.h> > -#include <sysdep.h> > - > -int __posix_fadvise64_l64 (int fd, off64_t offset, off64_t len, int advise); > - > -/* Advice the system about the expected behaviour of the application with > - respect to the file associated with FD. */ > - > -int > -__posix_fadvise64_l64 (int fd, off64_t offset, off64_t len, int advise) > -{ > - INTERNAL_SYSCALL_DECL (err); > - int ret = INTERNAL_SYSCALL (arm_fadvise64_64, err, 6, fd, advise, > - __LONG_LONG_PAIR ((long)(offset >> 32), (long)offset), > - __LONG_LONG_PAIR ((long)(len >> 32), (long)len)); > - if (!INTERNAL_SYSCALL_ERROR_P (ret, err)) > - return 0; > - return INTERNAL_SYSCALL_ERRNO (ret, err); > -} > -weak_alias (__posix_fadvise64_l64, posix_fadvise64); > diff --git a/sysdeps/unix/sysv/linux/generic/wordsize-32/posix_fadvise.c b/sysdeps/unix/sysv/linux/generic/wordsize-32/posix_fadvise.c > deleted file mode 100644 > index 7c93a8f..0000000 > --- a/sysdeps/unix/sysv/linux/generic/wordsize-32/posix_fadvise.c > +++ /dev/null > @@ -1,37 +0,0 @@ > -/* Copyright (C) 2011-2016 Free Software Foundation, Inc. > - This file is part of the GNU C Library. > - Contributed by Chris Metcalf <cmetcalf@tilera.com>, 2011. > - > - 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 <errno.h> > -#include <fcntl.h> > -#include <sysdep.h> > - > -/* Advice the system about the expected behaviour of the application with > - respect to the file associated with FD. */ > - > -int > -posix_fadvise (int fd, off_t offset, off_t len, int advise) > -{ > - INTERNAL_SYSCALL_DECL (err); > - int ret = INTERNAL_SYSCALL (fadvise64_64, err, 6, fd, > - __LONG_LONG_PAIR (offset >> 31, offset), > - __LONG_LONG_PAIR (len >> 31, len), > - advise); > - if (INTERNAL_SYSCALL_ERROR_P (ret, err)) > - return INTERNAL_SYSCALL_ERRNO (ret, err); > - return 0; > -} > diff --git a/sysdeps/unix/sysv/linux/i386/posix_fadvise64.S b/sysdeps/unix/sysv/linux/i386/posix_fadvise64.S > deleted file mode 100644 > index 4b5d65c..0000000 > --- a/sysdeps/unix/sysv/linux/i386/posix_fadvise64.S > +++ /dev/null > @@ -1,92 +0,0 @@ > -/* Copyright (C) 1995-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 <sysdep.h> > - > -#define EINVAL 22 > -#define ENOSYS 38 > -#define EOVERFLOW 75 > - > -#define SVRSP 16 /* saved register space */ > -#define PARMS 4+SVRSP /* space for 4 saved regs */ > -#define FD PARMS > -#define OFFLO FD+4 > -#define OFFHI OFFLO+4 > -#define LENLO OFFHI+4 > -#define LENHI LENLO+4 > -#define FLAGS LENHI+4 > - > - .text > -ENTRY (__posix_fadvise64_l64) > - > - /* Save registers. */ > - pushl %ebp > - cfi_adjust_cfa_offset (4) > - pushl %ebx > - cfi_adjust_cfa_offset (4) > - pushl %esi > - cfi_adjust_cfa_offset (4) > - pushl %edi > - cfi_adjust_cfa_offset (4) > - > - movl FD(%esp), %ebx > - cfi_rel_offset (ebx, 8) > - movl OFFLO(%esp), %ecx > - movl OFFHI(%esp), %edx > - movl LENLO(%esp), %esi > - cfi_rel_offset (esi, 4) > - movl LENHI(%esp), %edi > - cfi_rel_offset (edi, 0) > - movl FLAGS(%esp), %ebp > - cfi_rel_offset (ebp, 12) > - > - movl $SYS_ify(fadvise64_64), %eax > - ENTER_KERNEL > - > - /* Restore registers. */ > - popl %edi > - cfi_adjust_cfa_offset (-4) > - cfi_restore (edi) > - popl %esi > - cfi_adjust_cfa_offset (-4) > - cfi_restore (esi) > - popl %ebx > - cfi_adjust_cfa_offset (-4) > - cfi_restore (ebx) > - popl %ebp > - cfi_adjust_cfa_offset (-4) > - cfi_restore (ebp) > - > - /* The function returns zero, or the error number. So all we > - have to do is negate the value passed back from the kernel. */ > - /* If 0 > %eax > -4096 there was an error. */ > - negl %eax > - > - /* Successful; return the syscall's value. */ > - ret > - > -END (__posix_fadvise64_l64) > - > - .section .text.compat, "ax" > -ENTRY (__posix_fadvise64_l32) > - DO_CALL (fadvise64, 5) > - negl %eax > - ret > -PSEUDO_END_ERRVAL (__posix_fadvise64_l32) > - > -default_symbol_version (__posix_fadvise64_l64, posix_fadvise64, GLIBC_2.3.3) > -symbol_version (__posix_fadvise64_l32, posix_fadvise64, GLIBC_2.2) > diff --git a/sysdeps/unix/sysv/linux/mips/mips32/posix_fadvise.c b/sysdeps/unix/sysv/linux/mips/mips32/posix_fadvise.c > deleted file mode 100644 > index 705c0c7..0000000 > --- a/sysdeps/unix/sysv/linux/mips/mips32/posix_fadvise.c > +++ /dev/null > @@ -1,41 +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 <errno.h> > -#include <fcntl.h> > -#include <sysdep.h> > - > -/* Advice the system about the expected behaviour of the application with > - respect to the file associated with FD. */ > - > -int > -posix_fadvise (int fd, off_t offset, off_t len, int advise) > -{ > -/* MIPS kernel only has NR_fadvise64 which acts as NR_fadvise64_64 */ > -#ifdef __NR_fadvise64 > - INTERNAL_SYSCALL_DECL (err); > - int ret = INTERNAL_SYSCALL (fadvise64, err, 7, fd, 0, > - __LONG_LONG_PAIR (offset >> 31, offset), > - __LONG_LONG_PAIR (len >> 31, len), > - advise); > - if (INTERNAL_SYSCALL_ERROR_P (ret, err)) > - return INTERNAL_SYSCALL_ERRNO (ret, err); > - return 0; > -#else > - return ENOSYS; > -#endif > -} > diff --git a/sysdeps/unix/sysv/linux/mips/mips32/posix_fadvise64.c b/sysdeps/unix/sysv/linux/mips/mips32/posix_fadvise64.c > deleted file mode 100644 > index 0ded3c3..0000000 > --- a/sysdeps/unix/sysv/linux/mips/mips32/posix_fadvise64.c > +++ /dev/null > @@ -1,60 +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 <errno.h> > -#include <fcntl.h> > -#include <sysdep.h> > - > -/* Advice the system about the expected behaviour of the application with > - respect to the file associated with FD. */ > - > -int > -__posix_fadvise64_l64 (int fd, off64_t offset, off64_t len, int advise) > -{ > -/* MIPS kernel only has NR_fadvise64 which acts as NR_fadvise64_64 */ > -#ifdef __NR_fadvise64 > - INTERNAL_SYSCALL_DECL (err); > - int ret = INTERNAL_SYSCALL (fadvise64, err, 7, fd, 0, > - __LONG_LONG_PAIR ((long) (offset >> 32), > - (long) offset), > - __LONG_LONG_PAIR ((long) (len >> 32), > - (long) len), > - advise); > - if (INTERNAL_SYSCALL_ERROR_P (ret, err)) > - return INTERNAL_SYSCALL_ERRNO (ret, err); > - return 0; > -#else > - return ENOSYS; > -#endif > -} > - > -#include <shlib-compat.h> > - > -#if SHLIB_COMPAT(libc, GLIBC_2_2, GLIBC_2_3_3) > - > -int > -attribute_compat_text_section > -__posix_fadvise64_l32 (int fd, off64_t offset, size_t len, int advise) > -{ > - return __posix_fadvise64_l64 (fd, offset, len, advise); > -} > - > -versioned_symbol (libc, __posix_fadvise64_l64, posix_fadvise64, GLIBC_2_3_3); > -compat_symbol (libc, __posix_fadvise64_l32, posix_fadvise64, GLIBC_2_2); > -#else > -strong_alias (__posix_fadvise64_l64, posix_fadvise64); > -#endif > diff --git a/sysdeps/unix/sysv/linux/mips/mips64/n32/posix_fadvise.c b/sysdeps/unix/sysv/linux/mips/mips64/n32/posix_fadvise.c > deleted file mode 100644 > index 3b1ef7e..0000000 > --- a/sysdeps/unix/sysv/linux/mips/mips64/n32/posix_fadvise.c > +++ /dev/null > @@ -1,37 +0,0 @@ > -/* Copyright (C) 2003-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 <errno.h> > -#include <fcntl.h> > -#include <sysdep.h> > - > -/* Advice the system about the expected behaviour of the application with > - respect to the file associated with FD. */ > - > -int > -posix_fadvise (int fd, off_t offset, off_t len, int advise) > -{ > -#ifdef __NR_fadvise64 > - INTERNAL_SYSCALL_DECL (err); > - int ret = INTERNAL_SYSCALL (fadvise64, err, 4, fd, offset, len, advise); > - if (INTERNAL_SYSCALL_ERROR_P (ret, err)) > - return INTERNAL_SYSCALL_ERRNO (ret, err); > - return 0; > -#else > - return ENOSYS; > -#endif > -} > diff --git a/sysdeps/unix/sysv/linux/mips/mips64/n32/posix_fadvise64.c b/sysdeps/unix/sysv/linux/mips/mips64/n32/posix_fadvise64.c > deleted file mode 100644 > index e7ddc87..0000000 > --- a/sysdeps/unix/sysv/linux/mips/mips64/n32/posix_fadvise64.c > +++ /dev/null > @@ -1,55 +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 <errno.h> > -#include <fcntl.h> > -#include <sysdep.h> > - > -/* Advice the system about the expected behaviour of the application with > - respect to the file associated with FD. */ > - > -int > -__posix_fadvise64_l64 (int fd, off64_t offset, off64_t len, int advise) > -{ > -/* MIPS kernel only has NR_fadvise64 which acts as NR_fadvise64_64 */ > -#ifdef __NR_fadvise64 > - INTERNAL_SYSCALL_DECL (err); > - int ret = INTERNAL_SYSCALL (fadvise64, err, 4, fd, offset, len, advise); > - if (INTERNAL_SYSCALL_ERROR_P (ret, err)) > - return INTERNAL_SYSCALL_ERRNO (ret, err); > - return 0; > -#else > - return ENOSYS; > -#endif > -} > - > -#include <shlib-compat.h> > - > -#if SHLIB_COMPAT(libc, GLIBC_2_2, GLIBC_2_3_3) > - > -int > -attribute_compat_text_section > -__posix_fadvise64_l32 (int fd, off64_t offset, size_t len, int advise) > -{ > - return __posix_fadvise64_l64 (fd, offset, len, advise); > -} > - > -versioned_symbol (libc, __posix_fadvise64_l64, posix_fadvise64, GLIBC_2_3_3); > -compat_symbol (libc, __posix_fadvise64_l32, posix_fadvise64, GLIBC_2_2); > -#else > -strong_alias (__posix_fadvise64_l64, posix_fadvise64); > -#endif > diff --git a/sysdeps/unix/sysv/linux/mips/mips64/n64/posix_fadvise.c b/sysdeps/unix/sysv/linux/mips/mips64/n64/posix_fadvise.c > deleted file mode 100644 > index 86ff6ef..0000000 > --- a/sysdeps/unix/sysv/linux/mips/mips64/n64/posix_fadvise.c > +++ /dev/null > @@ -1,50 +0,0 @@ > -/* Copyright (C) 2003-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 posix_fadvise64 __no_posix_fadvise64 > -#include <errno.h> > -#include <fcntl.h> > -#include <sysdep.h> > -#undef posix_fadvise64 > - > -/* Advice the system about the expected behaviour of the application with > - respect to the file associated with FD. */ > - > -int > -posix_fadvise (int fd, off_t offset, off_t len, int advise) > -{ > -#ifdef __NR_fadvise64 > - INTERNAL_SYSCALL_DECL (err); > - int ret = INTERNAL_SYSCALL (fadvise64, err, 4, fd, offset, len, advise); > - if (INTERNAL_SYSCALL_ERROR_P (ret, err)) > - return INTERNAL_SYSCALL_ERRNO (ret, err); > - return 0; > -#else > - return ENOSYS; > -#endif > -} > - > -#include <shlib-compat.h> > - > -#if SHLIB_COMPAT(libc, GLIBC_2_2, GLIBC_2_3_3) > -strong_alias (posix_fadvise, __posix_fadvise64_l32); > -compat_symbol (libc, __posix_fadvise64_l32, posix_fadvise64, GLIBC_2_2); > -strong_alias (posix_fadvise, __posix_fadvise64_l64); > -versioned_symbol (libc, __posix_fadvise64_l64, posix_fadvise64, GLIBC_2_3_3); > -#else > -weak_alias (posix_fadvise, posix_fadvise64); > -#endif > diff --git a/sysdeps/unix/sysv/linux/mips/mips64/n64/posix_fadvise64.c b/sysdeps/unix/sysv/linux/mips/mips64/n64/posix_fadvise64.c > index c9f72c4..d7aab25 100644 > --- a/sysdeps/unix/sysv/linux/mips/mips64/n64/posix_fadvise64.c > +++ b/sysdeps/unix/sysv/linux/mips/mips64/n64/posix_fadvise64.c > @@ -1 +1,28 @@ > -/* posix_fadvise64 is in posix_fadvise.c */ > +/* Copyright (C) 2003-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/>. */ > + > +#undef strong_alias > +#define strong_alias(a, b) > + > +#include <sysdeps/unix/sysv/linux/posix_fadvise64.c> > + > +#if SHLIB_COMPAT(libc, GLIBC_2_2, GLIBC_2_3_3) > +_strong_alias (__posix_fadvise64_l64, __posix_fadvise64_l32); > +compat_symbol (libc, __posix_fadvise64_l32, posix_fadvise64, GLIBC_2_2); > +versioned_symbol (libc, __posix_fadvise64_l64, posix_fadvise64, GLIBC_2_3_3); > +#endif > +_strong_alias (__posix_fadvise64_l64, posix_fadvise); > diff --git a/sysdeps/unix/sysv/linux/posix_fadvise.c b/sysdeps/unix/sysv/linux/posix_fadvise.c > index 093d707..869a642 100644 > --- a/sysdeps/unix/sysv/linux/posix_fadvise.c > +++ b/sysdeps/unix/sysv/linux/posix_fadvise.c > @@ -22,27 +22,46 @@ > /* Advice the system about the expected behaviour of the application with > respect to the file associated with FD. */ > > +#ifndef __OFF_T_MATCHES_OFF64_T > + > +/* Both arm and powerpc implements fadvise64_64 with last 'advise' argument > + just after 'fd' to avoid the requirement of implementing 7-arg syscalls. > + ARM also defines __NR_fadvise64_64 as __NR_arm_fadvise64_64. > + > + tile requires __ASSUME_ALIGNED_REGISTER_PAIRS but implements the 32-bit > + fadvise64_64 without the padding 0 after fd. > + > + s390 implements fadvice64_64 using a specific struct with arguments > + packed inside. This is the only implementation handled in arch-specific > + code. */ > + > int > posix_fadvise (int fd, off_t offset, off_t len, int advise) > { > -#if defined(__NR_fadvise64) || defined(__NR_fadvise64_64) > INTERNAL_SYSCALL_DECL (err); > # ifdef __NR_fadvise64 > - int ret = INTERNAL_SYSCALL (fadvise64, err, 5, fd, > - __LONG_LONG_PAIR (offset >> 31, offset), len, > - advise); > + int ret = INTERNAL_SYSCALL_CALL (fadvise64, err, fd, > + __ALIGNMENT_ARG SYSCALL_LL (offset), > + len, advise); > # else > - int ret = INTERNAL_SYSCALL (fadvise64_64, err, 6, fd, > - __LONG_LONG_PAIR ((long) (offset >> 31), > - (long) offset), > - __LONG_LONG_PAIR ((long) (len >> 31), > - (long) len), > - advise); > +# ifdef __ASSUME_FADVISE64_64_6ARG > + int ret = INTERNAL_SYSCALL_CALL (fadvise64_64, err, fd, advise, > + __ALIGNMENT_ARG SYSCALL_LL (offset), > + SYSCALL_LL (len)); > +# else > + > +# ifdef __ASSUME_FADVISE64_64_NO_ALIGN > +# undef __ALIGNMENT_ARG > +# define __ALIGNMENT_ARG > +# endif > + > + int ret = INTERNAL_SYSCALL_CALL (fadvise64_64, err, fd, > + __ALIGNMENT_ARG SYSCALL_LL (offset), > + SYSCALL_LL (len), advise); > +# endif > # endif > if (INTERNAL_SYSCALL_ERROR_P (ret, err)) > return INTERNAL_SYSCALL_ERRNO (ret, err); > return 0; > -#else > - return ENOSYS; > -#endif > } > +#endif /* __OFF_T_MATCHES_OFF64_T */ > diff --git a/sysdeps/unix/sysv/linux/posix_fadvise64.c b/sysdeps/unix/sysv/linux/posix_fadvise64.c > index 6d10558..b4adb5f 100644 > --- a/sysdeps/unix/sysv/linux/posix_fadvise64.c > +++ b/sysdeps/unix/sysv/linux/posix_fadvise64.c > @@ -17,10 +17,29 @@ > > #include <errno.h> > #include <fcntl.h> > -#include <sysdep.h> > +#include <shlib-compat.h> > > int __posix_fadvise64_l64 (int fd, off64_t offset, off64_t len, int advise); > -int __posix_fadvise64_l32 (int fd, off64_t offset, size_t len, int advise); > + > +/* Both arm and powerpc implements fadvise64_64 with last 'advise' argument > + just after 'fd' to avoid the requirement of implementing 7-arg syscalls. > + ARM also defines __NR_fadvise64_64 as __NR_arm_fadvise64_64. > + > + tile requires __ASSUME_ALIGNED_REGISTER_PAIRS but implements the 32-bit > + fadvise64_64 without the padding 0 after fd. > + > + s390 implements fadvice64_64 using a specific struct with arguments > + packed inside. This is the only implementation handled in arch-specific > + code. */ > + > +#ifdef __ASSUME_FADVISE64_64_NO_ALIGN > +# undef __ALIGNMENT_ARG > +# define __ALIGNMENT_ARG > +#endif > + > +#ifndef __NR_fadvise64_64 > +# define __NR_fadvise64_64 __NR_fadvise64 > +#endif > > /* Advice the system about the expected behaviour of the application with > respect to the file associated with FD. */ > @@ -29,20 +48,24 @@ int > __posix_fadvise64_l64 (int fd, off64_t offset, off64_t len, int advise) > { > INTERNAL_SYSCALL_DECL (err); > - int ret = INTERNAL_SYSCALL (fadvise64_64, err, 6, fd, > - __LONG_LONG_PAIR ((long) (offset >> 32), > - (long) offset), > - __LONG_LONG_PAIR ((long) (len >> 32), > - (long) len), > - advise); > +#ifdef __ASSUME_FADVISE64_64_6ARG > + int ret = INTERNAL_SYSCALL_CALL (fadvise64_64, err, fd, advise, > + SYSCALL_LL64 (offset), SYSCALL_LL64 (len)); > +#else > + int ret = INTERNAL_SYSCALL_CALL (fadvise64_64, err, fd, > + __ALIGNMENT_ARG SYSCALL_LL64 (offset), > + SYSCALL_LL64 (len), advise); > +#endif > if (!INTERNAL_SYSCALL_ERROR_P (ret, err)) > return 0; > return INTERNAL_SYSCALL_ERRNO (ret, err); > } > > -#include <shlib-compat.h> > - > -#if SHLIB_COMPAT(libc, GLIBC_2_2, GLIBC_2_3_3) > +/* The type of the len argument was changed from size_t to off_t in > + POSIX.1-2003 TC1. */ > +#ifndef __OFF_T_MATCHES_OFF64_T > +# if SHLIB_COMPAT(libc, GLIBC_2_2, GLIBC_2_3_3) > +int __posix_fadvise64_l32 (int fd, off64_t offset, size_t len, int advise); > > int > attribute_compat_text_section > @@ -53,6 +76,10 @@ __posix_fadvise64_l32 (int fd, off64_t offset, size_t len, int advise) > > versioned_symbol (libc, __posix_fadvise64_l64, posix_fadvise64, GLIBC_2_3_3); > compat_symbol (libc, __posix_fadvise64_l32, posix_fadvise64, GLIBC_2_2); > +# else > +weak_alias (__posix_fadvise64_l64, posix_fadvise64); > +# endif > #else > -strong_alias (__posix_fadvise64_l64, posix_fadvise64); > +weak_alias (__posix_fadvise64_l64, posix_fadvise64); > +strong_alias (__posix_fadvise64_l64, posix_fadvise); > #endif > diff --git a/sysdeps/unix/sysv/linux/powerpc/kernel-features.h b/sysdeps/unix/sysv/linux/powerpc/kernel-features.h > index 996535f..42a53f2 100644 > --- a/sysdeps/unix/sysv/linux/powerpc/kernel-features.h > +++ b/sysdeps/unix/sysv/linux/powerpc/kernel-features.h > @@ -46,4 +46,9 @@ > # define __ASSUME_ALIGNED_REGISTER_PAIRS 1 > #endif > > +/* powerpc compat fadvise64_64 reorganize the syscall argument. */ > +#ifndef __powerpc64__ > +# define __ASSUME_FADVISE64_64_6ARG 1 > +#endif > + > #include_next <kernel-features.h> > diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/posix_fadvise.c b/sysdeps/unix/sysv/linux/powerpc/powerpc32/posix_fadvise.c > deleted file mode 100644 > index e846bf5..0000000 > --- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/posix_fadvise.c > +++ /dev/null > @@ -1,39 +0,0 @@ > -/* Copyright (C) 2003-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 <errno.h> > -#include <fcntl.h> > -#include <sysdep.h> > - > -/* Advice the system about the expected behaviour of the application with > - respect to the file associated with FD. */ > - > -int > -posix_fadvise (int fd, off_t offset, off_t len, int advise) > -{ > -#ifdef __NR_fadvise64 > - INTERNAL_SYSCALL_DECL (err); > - int ret = INTERNAL_SYSCALL (fadvise64, err, 6, fd, 0, > - __LONG_LONG_PAIR (offset >> 31, offset), len, > - advise); > - if (INTERNAL_SYSCALL_ERROR_P (ret, err)) > - return INTERNAL_SYSCALL_ERRNO (ret, err); > - return 0; > -#else > - return ENOSYS; > -#endif > -} > diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/posix_fadvise64.c b/sysdeps/unix/sysv/linux/powerpc/powerpc32/posix_fadvise64.c > deleted file mode 100644 > index c26206f..0000000 > --- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/posix_fadvise64.c > +++ /dev/null > @@ -1,55 +0,0 @@ > -/* Copyright (C) 2003-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 <errno.h> > -#include <fcntl.h> > -#include <sysdep.h> > - > -int __posix_fadvise64_l64 (int fd, off64_t offset, off64_t len, int advise); > -int __posix_fadvise64_l32 (int fd, off64_t offset, size_t len, int advise); > - > -/* Advice the system about the expected behaviour of the application with > - respect to the file associated with FD. */ > - > -int > -__posix_fadvise64_l64 (int fd, off64_t offset, off64_t len, int advise) > -{ > - INTERNAL_SYSCALL_DECL (err); > - int ret = INTERNAL_SYSCALL (fadvise64_64, err, 6, fd, advise, > - __LONG_LONG_PAIR ((long)(offset >> 32), (long)offset), > - __LONG_LONG_PAIR ((long)(len >> 32), (long)len)); > - if (!INTERNAL_SYSCALL_ERROR_P (ret, err)) > - return 0; > - return INTERNAL_SYSCALL_ERRNO (ret, err); > -} > - > -#include <shlib-compat.h> > - > -#if SHLIB_COMPAT(libc, GLIBC_2_2, GLIBC_2_3_3) > - > -int > -attribute_compat_text_section > -__posix_fadvise64_l32 (int fd, off64_t offset, size_t len, int advise) > -{ > - return __posix_fadvise64_l64 (fd, offset, len, advise); > -} > - > -versioned_symbol (libc, __posix_fadvise64_l64, posix_fadvise64, GLIBC_2_3_3); > -compat_symbol (libc, __posix_fadvise64_l32, posix_fadvise64, GLIBC_2_2); > -#else > -strong_alias (__posix_fadvise64_l64, posix_fadvise64); > -#endif > diff --git a/sysdeps/unix/sysv/linux/tile/kernel-features.h b/sysdeps/unix/sysv/linux/tile/kernel-features.h > index 9425e1c..ded0e43 100644 > --- a/sysdeps/unix/sysv/linux/tile/kernel-features.h > +++ b/sysdeps/unix/sysv/linux/tile/kernel-features.h > @@ -23,4 +23,5 @@ > pairs to start with an even-number register. */ > #ifndef _LP64 > # define __ASSUME_ALIGNED_REGISTER_PAIRS 1 > +# define __ASSUME_FADVISE64_64_NO_ALIGN 1 > #endif > diff --git a/sysdeps/unix/sysv/linux/wordsize-64/posix_fadvise.c b/sysdeps/unix/sysv/linux/wordsize-64/posix_fadvise.c > deleted file mode 100644 > index 137b591..0000000 > --- a/sysdeps/unix/sysv/linux/wordsize-64/posix_fadvise.c > +++ /dev/null > @@ -1,40 +0,0 @@ > -/* Copyright (C) 2003-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 posix_fadvise64 __no_posix_fadvise64 > -#include <errno.h> > -#include <fcntl.h> > -#include <sysdep.h> > -#undef posix_fadvise64 > - > -/* Advice the system about the expected behaviour of the application with > - respect to the file associated with FD. */ > - > -int > -posix_fadvise (int fd, off_t offset, off_t len, int advise) > -{ > -#ifdef __NR_fadvise64 > - INTERNAL_SYSCALL_DECL (err); > - int ret = INTERNAL_SYSCALL (fadvise64, err, 4, fd, offset, len, advise); > - if (INTERNAL_SYSCALL_ERROR_P (ret, err)) > - return INTERNAL_SYSCALL_ERRNO (ret, err); > - return 0; > -#else > - return ENOSYS; > -#endif > -} > -weak_alias (posix_fadvise, posix_fadvise64) > diff --git a/sysdeps/unix/sysv/linux/wordsize-64/posix_fadvise64.c b/sysdeps/unix/sysv/linux/wordsize-64/posix_fadvise64.c > deleted file mode 100644 > index c9f72c4..0000000 > --- a/sysdeps/unix/sysv/linux/wordsize-64/posix_fadvise64.c > +++ /dev/null > @@ -1 +0,0 @@ > -/* posix_fadvise64 is in posix_fadvise.c */ > ^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: [PATCH v2 3/3] Consolidate posix_fadvise implementations 2016-10-05 17:15 ` Siddhesh Poyarekar @ 2016-10-06 20:50 ` Adhemerval Zanella 2016-10-11 23:47 ` Joseph Myers 1 sibling, 0 replies; 27+ messages in thread From: Adhemerval Zanella @ 2016-10-06 20:50 UTC (permalink / raw) To: Siddhesh Poyarekar, libc-alpha Thanks for the review. On 05/10/2016 14:14, Siddhesh Poyarekar wrote: > On Wednesday 28 September 2016 05:45 AM, Adhemerval Zanella wrote: >> From: Adhemerval Zanella <adhemerval.zanella@linaro.org> >> >> This patch consolidates mostly of the Linux posix_fallocate{64} implementations >> on sysdeps/unix/sysv/linux/posix_fallocate{64}.c. It still keeps arch-specific >> files for: > > I guess you mean posix_fadvise :) Oops... >> +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> >> + >> +static char *temp_filename; >> +static int temp_fd; >> +static char fifoname[] = "/tmp/tst-posix_fadvise-fifo-XXXXXX"; >> +static int fifofd; >> + >> +static void >> +do_prepare (void) >> +{ >> + temp_fd = create_temp_file ("tst-posix_fadvise.", &temp_filename); >> + if (temp_fd == -1) >> + { >> + printf ("cannot create temporary file: %m\n"); >> + exit (1); >> + } >> + >> + if (mktemp (fifoname) == NULL) >> + { >> + printf ("%s: cannot generate temp file name: %m\n", __func__); >> + exit (1); >> + } >> + add_temp_file (fifoname); >> + >> + if (mkfifo (fifoname, S_IWUSR | S_IRUSR) != 0) >> + { >> + printf ("%s: cannot create fifo: %m\n", __func__); >> + exit (1); >> + } >> + >> + fifofd = open (fifoname, O_RDONLY | O_NONBLOCK); >> + if (fifofd == -1) >> + { >> + printf ("%s: cannot open fifo: %m\n", __func__); >> + exit (1); >> + } >> +} >> + >> +#define FAIL(str) \ >> + do { \ >> + printf ("error: %s (line %d)\n", str, __LINE__); \ >> + return 1; \ >> + } while (0) > > Use the new FAIL definition in test-skeleton.c that you'll add from 1/3. Ack. > >> + >> +/* Effectivelly testing posix_fadvise is hard because side effects are not >> + observed without checking either performance or any kernel specific >> + supplied information. Also, the syscall is meant to be an advisory, >> + so kernel is free to use these information in which way it seems as >> + fit (even ignoring it). > > "so the kernel is free to use this information in any way it deems fit, > including ignoring it." Ack. > >> + >> + This test check for some invalid returned operation to check argument >> + passing and if implementation follows POSIX error definition. */ >> +static int >> +do_test_common (void) >> +{ >> + /* Add some data to file and ensure it is written down on disk. */ > > "written to disk". Ack. > >> + char buffer[2048] = { 0xcd }; >> + >> + if (write (temp_fd, buffer, 2048) != 2048) >> + FAIL ("write returned a value different than expected 2048"); >> + >> + if (fsync (temp_fd) != 0) >> + FAIL ("fsync failed"); >> + >> + /* Test passing an invalid fd. */ >> + if (posix_fadvise (-1, 0, 0, POSIX_FADV_NORMAL) != EBADF) >> + FAIL ("posix_fadvise with invalid fd did not return EBADF"); >> + >> + /* Test passing an invalid operation. */ >> + if (posix_fadvise (temp_fd, 0, 0, -1) != EINVAL) >> + FAIL ("posix_fadvise with invalid advise did not return EINVAL"); >> + >> + /* Test passing a FIFO fd. */ >> + if (posix_fadvise (fifofd, 0, 0, POSIX_FADV_NORMAL) != ESPIPE) >> + FAIL ("posix_advise with PIPE fd did not return ESPIPE"); >> + >> + /* Default fadvise on all file starting at initial position. */ >> + if (posix_fadvise (temp_fd, 0, 0, POSIX_FADV_NORMAL) != 0) >> + FAIL ("default posix_fadvise failed"); >> + >> + if (posix_fadvise (temp_fd, 0, 4096, POSIX_FADV_NORMAL) != 0) >> + FAIL ("posix_fadvise failed (offset = 0, len = 4096) failed"); >> + >> + if (posix_fadvise (temp_fd, 4096, 0, POSIX_FADV_NORMAL) != 0) >> + FAIL ("posix_fadvise failed (offset = 4096, len = 0) failed"); >> + >> + return 0; >> +} >> diff --git a/posix/tst-posix_fadvise.c b/posix/tst-posix_fadvise.c >> new file mode 100644 >> index 0000000..6ee0936 >> --- /dev/null >> +++ b/posix/tst-posix_fadvise.c >> @@ -0,0 +1,25 @@ >> +/* Basic posix_fadvise tests. >> + 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 "tst-posix_fadvise-common.c" >> + >> +static int >> +do_test (void) >> +{ >> + return do_test_common (); >> +} >> diff --git a/posix/tst-posix_fadvise64.c b/posix/tst-posix_fadvise64.c >> new file mode 100644 >> index 0000000..91d1860 >> --- /dev/null >> +++ b/posix/tst-posix_fadvise64.c >> @@ -0,0 +1,44 @@ >> +/* Basic posix_fadvise64 tests. >> + 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_fadvise-common.c" >> + >> +static int >> +do_test (void) >> +{ >> + int ret = do_test_common (); >> + if (ret == -1) >> + return -1; > > do_test_common returns 1, not -1. Ack. > >> + >> + /* Test passing a negative length. The compat fadvise64 might use >> + off64_t for size argument passing, so using -1 for len without >> + _FILE_OFFSET_BITS might not trigger the length issue. */ >> + if (posix_fadvise (temp_fd, 0, -1, POSIX_FADV_NORMAL) != EINVAL) >> + FAIL ("posix_fadvise with negative length did not return EINVAL"); >> + >> + /* Check with some offset values larger than 32-bits. */ >> + off_t offset = UINT32_MAX + 2048LL; >> + if (posix_fadvise (temp_fd, 0, offset, POSIX_FADV_NORMAL) != 0) >> + FAIL ("posix_fadvise failed (offset = 0, len = 4096) failed"); >> + >> + if (posix_fadvise (temp_fd, offset, 0, POSIX_FADV_NORMAL) != 0) >> + FAIL ("posix_fadvise failed (offset = 4096, len = 0) failed"); >> + >> + return 0; >> +} >> diff --git a/sysdeps/unix/sysv/linux/arm/kernel-features.h b/sysdeps/unix/sysv/linux/arm/kernel-features.h >> index 6ca607e..628d27f 100644 >> --- a/sysdeps/unix/sysv/linux/arm/kernel-features.h >> +++ b/sysdeps/unix/sysv/linux/arm/kernel-features.h >> @@ -27,6 +27,13 @@ >> # undef __ASSUME_SET_ROBUST_LIST >> #endif >> >> +/* ARM fadvise64_64 reorganize the syscall arguments. */ >> +#define __ASSUME_FADVISE64_64_6ARG 1 >> + >> /* Define this if your 32-bit syscall API requires 64-bit register >> pairs to start with an even-number register. */ >> #define __ASSUME_ALIGNED_REGISTER_PAIRS 1 >> + >> +/* ARM only has a syscall for fadvise64{_64} and it defined with a >> + non-standard name. */ > > "it is defined" Ack. ^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: [PATCH v2 3/3] Consolidate posix_fadvise implementations 2016-10-05 17:15 ` Siddhesh Poyarekar 2016-10-06 20:50 ` Adhemerval Zanella @ 2016-10-11 23:47 ` Joseph Myers 2016-10-12 13:51 ` Adhemerval Zanella 1 sibling, 1 reply; 27+ messages in thread From: Joseph Myers @ 2016-10-11 23:47 UTC (permalink / raw) To: Adhemerval Zanella; +Cc: libc-alpha I'm now seeing a build failure for MIPS n64: libc.so:(*IND*+0x0): multiple definition of `posix_fadvise64@GLIBC_2.2' libc.so::(.text+0xcf940): first defined here libc.so:(*IND*+0x0): multiple definition of `posix_fadvise64' collect2: error: ld returned 1 exit status -- Joseph S. Myers joseph@codesourcery.com ^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: [PATCH v2 3/3] Consolidate posix_fadvise implementations 2016-10-11 23:47 ` Joseph Myers @ 2016-10-12 13:51 ` Adhemerval Zanella 2016-10-12 15:39 ` Joseph Myers 0 siblings, 1 reply; 27+ messages in thread From: Adhemerval Zanella @ 2016-10-12 13:51 UTC (permalink / raw) To: Joseph Myers; +Cc: libc-alpha On 11/10/2016 20:46, Joseph Myers wrote: > I'm now seeing a build failure for MIPS n64: > > libc.so:(*IND*+0x0): multiple definition of `posix_fadvise64@GLIBC_2.2' > libc.so::(.text+0xcf940): first defined here > libc.so:(*IND*+0x0): multiple definition of `posix_fadvise64' > collect2: error: ld returned 1 exit status > For some reason I am not seeing this issue with my mips64n64 toolchain (gcc 5.3.1, binutils 2.26.0.20160331). Checking the objects, I am seeing that posix_advise64 is defined only on posix_fadvise64.os: $ /opt/cross/bin/mips64-linux-gnuabi64-objdump -t ./io/posix_fadvise64.os | grep posix_fadvise64 ./io/posix_fadvise64.os: file format elf64-tradbigmips 0000000000000000 g F .text 000000000000001c __posix_fadvise64_l32 0000000000000000 g F .text 000000000000001c __posix_fadvise64_l64 0000000000000000 w F .text 000000000000001c posix_fadvise64 0000000000000000 g F .text 000000000000001c posix_fadvise64@GLIBC_2.2 0000000000000000 g F .text 000000000000001c posix_fadvise64@@GLIBC_2.3.3 $ /opt/cross/bin/mips64-linux-gnuabi64-objdump -t ./io/posix_fadvise.os | grep posix_fadvise64 $ So could this be a non-empty build directory? I usually clean the folder completely before restarting a new build. For this consolidations patches I am doing a full build on all supported architectures before pushing them (aarch64, alpha, armeabi, armeabihf, hppa, ia64, i686, m68k, microblaze, mips{32,64,n32}, nios2, powerpc{32, 64,64le}, s390{x}, sh4, sparc{64}, tile{pro,x64}, and x86_64). ^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: [PATCH v2 3/3] Consolidate posix_fadvise implementations 2016-10-12 13:51 ` Adhemerval Zanella @ 2016-10-12 15:39 ` Joseph Myers 2016-10-12 16:05 ` Adhemerval Zanella 0 siblings, 1 reply; 27+ messages in thread From: Joseph Myers @ 2016-10-12 15:39 UTC (permalink / raw) To: Adhemerval Zanella; +Cc: libc-alpha On Wed, 12 Oct 2016, Adhemerval Zanella wrote: > For some reason I am not seeing this issue with my mips64n64 toolchain > (gcc 5.3.1, binutils 2.26.0.20160331). I was using GCC 5.4.1 20160810 and binutils 2.27.51.20160810. I've now updated to today's GCC 5 branch and binutils master, and still see the same issue, in a clean build from scratch. The error is complaining about libc.so when linking sotruss-lib.so. libc.so has (readelf --dyn-syms) 262: 000000000010b950 28 FUNC GLOBAL DEFAULT 12 posix_fadvise64@GLIBC_2.2 417: 000000000010b950 28 FUNC WEAK DEFAULT 12 posix_fadvise64@@GLIBC_2.2 1505: 000000000010b950 28 FUNC GLOBAL DEFAULT 12 posix_fadvise64@@GLIBC_2.3.3 that is, two separate definitions at version GLIBC_2.2. It looks to me like sysdeps/unix/sysv/linux/posix_fadvise64.c would create a posix_fadvise64 weak_alias, while sysdeps/unix/sysv/linux/mips/mips64/n64/posix_fadvise64.c then adds compat_symbol / versioned_symbol calls. If a symbol is being created with explicit versioning, direct weak_alias / strong_alias calls for it should be disabled. -- Joseph S. Myers joseph@codesourcery.com ^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: [PATCH v2 3/3] Consolidate posix_fadvise implementations 2016-10-12 15:39 ` Joseph Myers @ 2016-10-12 16:05 ` Adhemerval Zanella 2016-10-12 16:11 ` Joseph Myers 0 siblings, 1 reply; 27+ messages in thread From: Adhemerval Zanella @ 2016-10-12 16:05 UTC (permalink / raw) To: Joseph Myers; +Cc: libc-alpha On 12/10/2016 12:39, Joseph Myers wrote: > On Wed, 12 Oct 2016, Adhemerval Zanella wrote: > >> For some reason I am not seeing this issue with my mips64n64 toolchain >> (gcc 5.3.1, binutils 2.26.0.20160331). > > I was using GCC 5.4.1 20160810 and binutils 2.27.51.20160810. I've now > updated to today's GCC 5 branch and binutils master, and still see the > same issue, in a clean build from scratch. I updated the binutils in my mips64 toolchain to master (2.27.51.20161012) and now I am see this behaviour. > > The error is complaining about libc.so when linking sotruss-lib.so. > libc.so has (readelf --dyn-syms) > > 262: 000000000010b950 28 FUNC GLOBAL DEFAULT 12 posix_fadvise64@GLIBC_2.2 > 417: 000000000010b950 28 FUNC WEAK DEFAULT 12 posix_fadvise64@@GLIBC_2.2 > 1505: 000000000010b950 28 FUNC GLOBAL DEFAULT 12 posix_fadvise64@@GLIBC_2.3.3 > > that is, two separate definitions at version GLIBC_2.2. It looks to me > like sysdeps/unix/sysv/linux/posix_fadvise64.c would create a > posix_fadvise64 weak_alias, while > sysdeps/unix/sysv/linux/mips/mips64/n64/posix_fadvise64.c then adds > compat_symbol / versioned_symbol calls. If a symbol is being created with > explicit versioning, direct weak_alias / strong_alias calls for it should > be disabled. Yes, it seems the case. The patch below disable the weak_alias for mips64 and I could complete the build without issues with check-abi clean. By the way, do you know exactly why mips64n64 requires this symbol versioning? I noted MIPS64 sets __OFF_T_MATCHES_OFF64_T and it is ILP64 (so size_t is 8 bytes), so -- diff --git a/sysdeps/unix/sysv/linux/mips/mips64/n64/posix_fadvise64.c b/sysdeps/unix/sysv/linux/mips/mips64/n64/posix_fadvise64.c index d7aab25..0af3c38 100644 --- a/sysdeps/unix/sysv/linux/mips/mips64/n64/posix_fadvise64.c +++ b/sysdeps/unix/sysv/linux/mips/mips64/n64/posix_fadvise64.c @@ -15,6 +15,8 @@ License along with the GNU C Library; if not, see <http://www.gnu.org/licenses/>. */ +#undef weak_alias +#define weak_alias(a, b) #undef strong_alias #define strong_alias(a, b) ^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: [PATCH v2 3/3] Consolidate posix_fadvise implementations 2016-10-12 16:05 ` Adhemerval Zanella @ 2016-10-12 16:11 ` Joseph Myers 2016-10-12 16:14 ` Adhemerval Zanella 0 siblings, 1 reply; 27+ messages in thread From: Joseph Myers @ 2016-10-12 16:11 UTC (permalink / raw) To: Adhemerval Zanella; +Cc: libc-alpha On Wed, 12 Oct 2016, Adhemerval Zanella wrote: > By the way, do you know exactly why mips64n64 requires this symbol versioning? See what I said in <https://sourceware.org/ml/libc-ports/2012-05/msg00006.html>. Because there were releases with both symbol versions, we need to keep the exports at both versions even though they have the same semantics. Please commit the patch. -- Joseph S. Myers joseph@codesourcery.com ^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: [PATCH v2 3/3] Consolidate posix_fadvise implementations 2016-10-12 16:11 ` Joseph Myers @ 2016-10-12 16:14 ` Adhemerval Zanella 0 siblings, 0 replies; 27+ messages in thread From: Adhemerval Zanella @ 2016-10-12 16:14 UTC (permalink / raw) To: Joseph Myers; +Cc: libc-alpha On 12/10/2016 13:10, Joseph Myers wrote: > On Wed, 12 Oct 2016, Adhemerval Zanella wrote: > >> By the way, do you know exactly why mips64n64 requires this symbol versioning? > > See what I said in > <https://sourceware.org/ml/libc-ports/2012-05/msg00006.html>. Because > there were releases with both symbol versions, we need to keep the exports > at both versions even though they have the same semantics. > > Please commit the patch. > Thanks, I will add a comment on mips64 posix_fadvise64 implementation explaining why it is required. ^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: [PATCH v2 1/3] Consolidate fallocate{64} implementations 2016-09-28 0:15 [PATCH v2 1/3] Consolidate fallocate{64} implementations Adhemerval Zanella 2016-09-28 0:15 ` [PATCH v2 2/3] Consolidate posix_fallocate{64} implementations Adhemerval Zanella 2016-09-28 0:15 ` [PATCH v2 3/3] Consolidate posix_fadvise implementations Adhemerval Zanella @ 2016-09-30 0:51 ` Siddhesh Poyarekar 2016-10-04 15:07 ` Adhemerval Zanella 2 siblings, 1 reply; 27+ messages in thread From: Siddhesh Poyarekar @ 2016-09-30 0:51 UTC (permalink / raw) To: Adhemerval Zanella, libc-alpha On Tuesday 27 September 2016 05:14 PM, Adhemerval Zanella wrote: > From: Adhemerval Zanella <adhemerval.zanella@linaro.org> > > Changes from previous version: > > - Add back x32 use of syscalls.list until x32 {INTERNAL,INLINE}_SYSCALL > is not yet fixed [1]. > - Fix trailing whitespace > > -- > > This patch consolidates all the fallocate{64} implementation for Linux > in only one (sysdeps/unix/sysv/linux/fallocate{64}.c). It also removes the > syscall from the auto-generation using assembly macros. > > The new macro SYSCALL_LL{64} is used to handle the offset argument. > > Checked on x86_64, x32, i386, aarch64, and ppc64le. > > * sysdeps/unix/sysv/linux/Makefile (test): Add tst-fallocate and > tst-fallocate64. > * sysdeps/unix/sysv/linux/tst-fallocate.c: New file. > * sysdeps/unix/sysv/linux/tst-fallocate64.c: Likewise. > * sysdeps/unix/sysv/linux/tst-fallocate-common.c: Likewise. > * sysdeps/unix/sysv/linux/mips/mips64/n32/fallocate.c: Remove file. > * sysdeps/unix/sysv/linux/mips/mips64/n32/fallocate64.c: Likewise. > * sysdeps/unix/sysv/linux/mips/mips64/n64/fallocate.c: Likewise. > * sysdeps/unix/sysv/linux/mips/mips64/n64/fallocate64.c: Likewise. > * sysdeps/unix/sysv/linux/wordsize-64/fallocate.c: Likewise. > * sysdeps/unix/sysv/linux/wordsize-64/fallocate64.c: Likewise. > * sysdeps/unix/sysv/linux/fallocate.c (fallocate): Use SYSCALL_LL > macro on offset argument. > * sysdeps/unix/sysv/linux/fallocate64.c (fallocate64): Use > SYSCALL_LL64 on offset argument. A few minor nits, comments inline. > > [1] https://sourceware.org/ml/libc-alpha/2016-08/msg00443.html > --- > sysdeps/unix/sysv/linux/Makefile | 3 +- > sysdeps/unix/sysv/linux/fallocate.c | 11 +-- > sysdeps/unix/sysv/linux/fallocate64.c | 14 ++-- > .../unix/sysv/linux/mips/mips64/n32/fallocate.c | 33 -------- > .../unix/sysv/linux/mips/mips64/n32/fallocate64.c | 33 -------- > .../unix/sysv/linux/mips/mips64/n64/fallocate.c | 1 - > .../unix/sysv/linux/mips/mips64/n64/fallocate64.c | 1 - > sysdeps/unix/sysv/linux/tst-fallocate-common.c | 88 ++++++++++++++++++++++ > sysdeps/unix/sysv/linux/tst-fallocate.c | 25 ++++++ > sysdeps/unix/sysv/linux/tst-fallocate64.c | 54 +++++++++++++ > sysdeps/unix/sysv/linux/wordsize-64/fallocate.c | 34 --------- > sysdeps/unix/sysv/linux/wordsize-64/fallocate64.c | 1 - > 13 files changed, 195 insertions(+), 121 deletions(-) > delete mode 100644 sysdeps/unix/sysv/linux/mips/mips64/n32/fallocate.c > delete mode 100644 sysdeps/unix/sysv/linux/mips/mips64/n32/fallocate64.c > delete mode 100644 sysdeps/unix/sysv/linux/mips/mips64/n64/fallocate.c > delete mode 100644 sysdeps/unix/sysv/linux/mips/mips64/n64/fallocate64.c > create mode 100644 sysdeps/unix/sysv/linux/tst-fallocate-common.c > create mode 100644 sysdeps/unix/sysv/linux/tst-fallocate.c > create mode 100644 sysdeps/unix/sysv/linux/tst-fallocate64.c > delete mode 100644 sysdeps/unix/sysv/linux/wordsize-64/fallocate.c > delete mode 100644 sysdeps/unix/sysv/linux/wordsize-64/fallocate64.c > > diff --git a/sysdeps/unix/sysv/linux/Makefile b/sysdeps/unix/sysv/linux/Makefile > index 9a0423e..f8f778b 100644 > --- a/sysdeps/unix/sysv/linux/Makefile > +++ b/sysdeps/unix/sysv/linux/Makefile > @@ -42,7 +42,8 @@ sysdep_headers += sys/mount.h sys/acct.h sys/sysctl.h \ > bits/socket_type.h bits/syscall.h bits/sysctl.h \ > bits/mman-linux.h > > -tests += tst-clone tst-clone2 tst-fanotify tst-personality tst-quota > +tests += tst-clone tst-clone2 tst-fanotify tst-personality tst-quota \ > + tst-fallocate tst-fallocate64 OK. > > # Generate the list of SYS_* macros for the system calls (__NR_* macros). > > diff --git a/sysdeps/unix/sysv/linux/fallocate.c b/sysdeps/unix/sysv/linux/fallocate.c > index 6a58a5f..a38e9a6 100644 > --- a/sysdeps/unix/sysv/linux/fallocate.c > +++ b/sysdeps/unix/sysv/linux/fallocate.c > @@ -19,17 +19,12 @@ > #include <fcntl.h> > #include <sysdep-cancel.h> > > - > +#ifndef __OFF_T_MATCHES_OFF64_T > /* Reserve storage for the data of the file associated with FD. */ > int > fallocate (int fd, int mode, __off_t offset, __off_t len) > { > -#ifdef __NR_fallocate > return SYSCALL_CANCEL (fallocate, fd, mode, > - __LONG_LONG_PAIR (offset >> 31, offset), > - __LONG_LONG_PAIR (len >> 31, len)); > -#else > - __set_errno (ENOSYS); > - return -1; > -#endif > + SYSCALL_LL (offset), SYSCALL_LL (len)); > } > +#endif > diff --git a/sysdeps/unix/sysv/linux/fallocate64.c b/sysdeps/unix/sysv/linux/fallocate64.c > index 8e76d6f..d466095 100644 > --- a/sysdeps/unix/sysv/linux/fallocate64.c > +++ b/sysdeps/unix/sysv/linux/fallocate64.c > @@ -24,14 +24,10 @@ > int > fallocate64 (int fd, int mode, __off64_t offset, __off64_t len) > { > -#ifdef __NR_fallocate > return SYSCALL_CANCEL (fallocate, fd, mode, > - __LONG_LONG_PAIR ((long int) (offset >> 32), > - (long int) offset), > - __LONG_LONG_PAIR ((long int) (len >> 32), > - (long int) len)); > -#else > - __set_errno (ENOSYS); > - return -1; > -#endif > + SYSCALL_LL64 (offset), SYSCALL_LL64 (len)); > } > + > +#ifdef __OFF_T_MATCHES_OFF64_T > +weak_alias (fallocate64, fallocate) > +#endif OK. > diff --git a/sysdeps/unix/sysv/linux/mips/mips64/n32/fallocate.c b/sysdeps/unix/sysv/linux/mips/mips64/n32/fallocate.c > deleted file mode 100644 > index 4e432f4..0000000 > --- a/sysdeps/unix/sysv/linux/mips/mips64/n32/fallocate.c > +++ /dev/null > @@ -1,33 +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 <errno.h> > -#include <fcntl.h> > -#include <sysdep-cancel.h> > - > - > -/* Reserve storage for the data of the file associated with FD. */ > -int > -fallocate (int fd, int mode, __off_t offset, __off_t len) > -{ > -#ifdef __NR_fallocate > - return SYSCALL_CANCEL (fallocate, fd, mode, offset, len); > -#else > - __set_errno (ENOSYS); > - return -1; > -#endif > -} > diff --git a/sysdeps/unix/sysv/linux/mips/mips64/n32/fallocate64.c b/sysdeps/unix/sysv/linux/mips/mips64/n32/fallocate64.c > deleted file mode 100644 > index 95c9eab..0000000 > --- a/sysdeps/unix/sysv/linux/mips/mips64/n32/fallocate64.c > +++ /dev/null > @@ -1,33 +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 <errno.h> > -#include <fcntl.h> > -#include <sysdep-cancel.h> > - > - > -/* Reserve storage for the data of the file associated with FD. */ > -int > -fallocate64 (int fd, int mode, __off64_t offset, __off64_t len) > -{ > -#ifdef __NR_fallocate > - return SYSCALL_CANCEL (fallocate, fd, mode, offset, len); > -#else > - __set_errno (ENOSYS); > - return -1; > -#endif > -} > diff --git a/sysdeps/unix/sysv/linux/mips/mips64/n64/fallocate.c b/sysdeps/unix/sysv/linux/mips/mips64/n64/fallocate.c > deleted file mode 100644 > index d3b7218..0000000 > --- a/sysdeps/unix/sysv/linux/mips/mips64/n64/fallocate.c > +++ /dev/null > @@ -1 +0,0 @@ > -#include <sysdeps/unix/sysv/linux/wordsize-64/fallocate.c> > diff --git a/sysdeps/unix/sysv/linux/mips/mips64/n64/fallocate64.c b/sysdeps/unix/sysv/linux/mips/mips64/n64/fallocate64.c > deleted file mode 100644 > index fb2b681..0000000 > --- a/sysdeps/unix/sysv/linux/mips/mips64/n64/fallocate64.c > +++ /dev/null > @@ -1 +0,0 @@ > -/* fallocate64 is in fallocate.c */ OK. > diff --git a/sysdeps/unix/sysv/linux/tst-fallocate-common.c b/sysdeps/unix/sysv/linux/tst-fallocate-common.c > new file mode 100644 > index 0000000..5ef66be > --- /dev/null > +++ b/sysdeps/unix/sysv/linux/tst-fallocate-common.c > @@ -0,0 +1,88 @@ > +/* Basic fallocate test (no specific flags is checked). > + 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; > + > +void > +do_prepare (void) > +{ > + temp_fd = create_temp_file ("tst-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) Suggest: Use statement expressions since we use it widely in glibc. It might be a nice low hanging fruit project to fix all our tests to use FAIL defined like this. > + > +static int > +do_test_with_offset (off_t offset) > +{ > + int ret; > + struct stat finfo; > + char bwrite[1024] = { 0xf0 }; > + char bread[1024]; Define a macro BLOCK_SIZE to 1024 and use that everywhere. > + > + /* It tries to fallocate 1024 bytes from 'offset' and then write 1024 bytes. > + After both operation rewind the file descriptor and read 1024 bytes > + and check if both buffer have the same contents. */ > + ret = fallocate (temp_fd, 0, offset, 1024); > + if (ret == -1) > + FAIL ("fallocate failed"); > + > + ret = fstat (temp_fd, &finfo); > + if (ret == -1) > + FAIL ("fstat failed"); > + > + if (finfo.st_size < (offset + 1024)) > + FAIL ("size of first fallocate less than expected (1024)"); Suggest: Print offset + 1024 instead of just 1024. > + > + if (lseek (temp_fd, offset, SEEK_SET) == (off_t) -1) > + FAIL ("fseek (0, SEEK_SET) failed"); > + > + if (write (temp_fd, bwrite, 1024) != 1024) > + FAIL ("fail trying to write 1024 bytes"); > + > + if (lseek (temp_fd, offset, SEEK_SET) == (off_t) -1) > + FAIL ("fseek (0, SEEK_SET) failed"); > + > + if (read (temp_fd, bread, 1024) != 1024) > + FAIL ("fail trying to read 1024 bytes"); > + > + if (memcmp (bwrite, bread, 1024) != 0) > + FAIL ("buffer writted different than buffer readed"); > + > + return 0; > +} > diff --git a/sysdeps/unix/sysv/linux/tst-fallocate.c b/sysdeps/unix/sysv/linux/tst-fallocate.c > new file mode 100644 > index 0000000..ec3867c > --- /dev/null > +++ b/sysdeps/unix/sysv/linux/tst-fallocate.c > @@ -0,0 +1,25 @@ > +/* Basic fallocate test (no specific flags is checked). > + 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 "tst-fallocate-common.c" > + > +static int > +do_test (void) > +{ > + return do_test_with_offset (0); > +} > diff --git a/sysdeps/unix/sysv/linux/tst-fallocate64.c b/sysdeps/unix/sysv/linux/tst-fallocate64.c > new file mode 100644 > index 0000000..78bcb8c > --- /dev/null > +++ b/sysdeps/unix/sysv/linux/tst-fallocate64.c > @@ -0,0 +1,54 @@ > +/* Basic fallocate64 test (no specific flags is checked). > + 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-fallocate-common.c" > + > +static int > +do_test (void) > +{ > + ssize_t ret; > + > + ret = do_test_with_offset (0); > + if (ret == -1) > + return 1; This will fail since you return 1 on failure from do_test_with_offset, not -1. > + > + off_t base_offset = UINT32_MAX + 2048LL; This will overflow on 32-bit. > + ret = do_test_with_offset (base_offset); > + if (ret == -1) > + return 1; Again do_test_with_offset returns 1, not -1. > + > + struct stat st; > + if (fstat (temp_fd, &st) == -1) > + { > + printf ("error: fstat on temporary file failed: %m"); > + return 1; > + } > + > + /* The file size should >= base_offset plus bytes written. */ > + off_t expected_value = base_offset + ret; Again, this will overflow on 32-bit. > + if (st.st_size < expected_value) > + { > + printf ("error: file size less than expected (%jd > %jd)\n", > + (intmax_t) expected_value, (intmax_t) st.st_size); > + return 1; > + } > + > + return 0; > +} > + > diff --git a/sysdeps/unix/sysv/linux/wordsize-64/fallocate.c b/sysdeps/unix/sysv/linux/wordsize-64/fallocate.c > deleted file mode 100644 > index c1dd0b4..0000000 > --- a/sysdeps/unix/sysv/linux/wordsize-64/fallocate.c > +++ /dev/null > @@ -1,34 +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 <errno.h> > -#include <fcntl.h> > -#include <sysdep-cancel.h> > - > - > -/* Reserve storage for the data of the file associated with FD. */ > -int > -fallocate (int fd, int mode, __off_t offset, __off_t len) > -{ > -#ifdef __NR_fallocate > - return SYSCALL_CANCEL (fallocate, fd, mode, offset, len); > -#else > - __set_errno (ENOSYS); > - return -1; > -#endif > -} > -strong_alias (fallocate, fallocate64) > diff --git a/sysdeps/unix/sysv/linux/wordsize-64/fallocate64.c b/sysdeps/unix/sysv/linux/wordsize-64/fallocate64.c > deleted file mode 100644 > index df33112..0000000 > --- a/sysdeps/unix/sysv/linux/wordsize-64/fallocate64.c > +++ /dev/null > @@ -1 +0,0 @@ > -/* fallocate64 is in posix_fallocate.c */ > ^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: [PATCH v2 1/3] Consolidate fallocate{64} implementations 2016-09-30 0:51 ` [PATCH v2 1/3] Consolidate fallocate{64} implementations Siddhesh Poyarekar @ 2016-10-04 15:07 ` Adhemerval Zanella 2016-10-05 6:54 ` Siddhesh Poyarekar ` (2 more replies) 0 siblings, 3 replies; 27+ messages in thread From: Adhemerval Zanella @ 2016-10-04 15:07 UTC (permalink / raw) To: Siddhesh Poyarekar, libc-alpha Hi Siddhesh, Thanks for the review, comments below: On 29/09/2016 21:51, Siddhesh Poyarekar wrote: >> diff --git a/sysdeps/unix/sysv/linux/tst-fallocate-common.c b/sysdeps/unix/sysv/linux/tst-fallocate-common.c >> new file mode 100644 >> index 0000000..5ef66be >> --- /dev/null >> +++ b/sysdeps/unix/sysv/linux/tst-fallocate-common.c >> + >> +void >> +do_prepare (void) >> +{ >> + temp_fd = create_temp_file ("tst-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) > > Suggest: Use statement expressions since we use it widely in glibc. It > might be a nice low hanging fruit project to fix all our tests to use > FAIL defined like this. Ack, I changed to a statement expression. > >> + >> +static int >> +do_test_with_offset (off_t offset) >> +{ >> + int ret; >> + struct stat finfo; >> + char bwrite[1024] = { 0xf0 }; >> + char bread[1024]; > > Define a macro BLOCK_SIZE to 1024 and use that everywhere. Ack. >> + >> + /* It tries to fallocate 1024 bytes from 'offset' and then write 1024 bytes. >> + After both operation rewind the file descriptor and read 1024 bytes >> + and check if both buffer have the same contents. */ >> + ret = fallocate (temp_fd, 0, offset, 1024); >> + if (ret == -1) >> + FAIL ("fallocate failed"); >> + >> + ret = fstat (temp_fd, &finfo); >> + if (ret == -1) >> + FAIL ("fstat failed"); >> + >> + if (finfo.st_size < (offset + 1024)) >> + FAIL ("size of first fallocate less than expected (1024)"); > > Suggest: Print offset + 1024 instead of just 1024. Ack. >> diff --git a/sysdeps/unix/sysv/linux/tst-fallocate64.c b/sysdeps/unix/sysv/linux/tst-fallocate64.c >> new file mode 100644 >> index 0000000..78bcb8c >> --- /dev/null >> +++ b/sysdeps/unix/sysv/linux/tst-fallocate64.c >> + >> +static int >> +do_test (void) >> +{ >> + ssize_t ret; >> + >> + ret = do_test_with_offset (0); >> + if (ret == -1) >> + return 1; > > This will fail since you return 1 on failure from do_test_with_offset, > not -1. Ack, I fixed it. > >> + >> + off_t base_offset = UINT32_MAX + 2048LL; > > This will overflow on 32-bit. Not really since we explicit build the test with _FILE_OFFSET_BITS=64 so off_t will be 64-bit regardless. > >> + ret = do_test_with_offset (base_offset); >> + if (ret == -1) >> + return 1; > > Again do_test_with_offset returns 1, not -1. Ack. Below it is a version with the test fixed based on your comments: -- diff --git a/sysdeps/unix/sysv/linux/Makefile b/sysdeps/unix/sysv/linux/Makefile index 9a0423e..f8f778b 100644 --- a/sysdeps/unix/sysv/linux/Makefile +++ b/sysdeps/unix/sysv/linux/Makefile @@ -42,7 +42,8 @@ sysdep_headers += sys/mount.h sys/acct.h sys/sysctl.h \ bits/socket_type.h bits/syscall.h bits/sysctl.h \ bits/mman-linux.h -tests += tst-clone tst-clone2 tst-fanotify tst-personality tst-quota +tests += tst-clone tst-clone2 tst-fanotify tst-personality tst-quota \ + tst-fallocate tst-fallocate64 # Generate the list of SYS_* macros for the system calls (__NR_* macros). diff --git a/sysdeps/unix/sysv/linux/fallocate.c b/sysdeps/unix/sysv/linux/fallocate.c index 6a58a5f..a38e9a6 100644 --- a/sysdeps/unix/sysv/linux/fallocate.c +++ b/sysdeps/unix/sysv/linux/fallocate.c @@ -19,17 +19,12 @@ #include <fcntl.h> #include <sysdep-cancel.h> - +#ifndef __OFF_T_MATCHES_OFF64_T /* Reserve storage for the data of the file associated with FD. */ int fallocate (int fd, int mode, __off_t offset, __off_t len) { -#ifdef __NR_fallocate return SYSCALL_CANCEL (fallocate, fd, mode, - __LONG_LONG_PAIR (offset >> 31, offset), - __LONG_LONG_PAIR (len >> 31, len)); -#else - __set_errno (ENOSYS); - return -1; -#endif + SYSCALL_LL (offset), SYSCALL_LL (len)); } +#endif diff --git a/sysdeps/unix/sysv/linux/fallocate64.c b/sysdeps/unix/sysv/linux/fallocate64.c index 8e76d6f..d466095 100644 --- a/sysdeps/unix/sysv/linux/fallocate64.c +++ b/sysdeps/unix/sysv/linux/fallocate64.c @@ -24,14 +24,10 @@ int fallocate64 (int fd, int mode, __off64_t offset, __off64_t len) { -#ifdef __NR_fallocate return SYSCALL_CANCEL (fallocate, fd, mode, - __LONG_LONG_PAIR ((long int) (offset >> 32), - (long int) offset), - __LONG_LONG_PAIR ((long int) (len >> 32), - (long int) len)); -#else - __set_errno (ENOSYS); - return -1; -#endif + SYSCALL_LL64 (offset), SYSCALL_LL64 (len)); } + +#ifdef __OFF_T_MATCHES_OFF64_T +weak_alias (fallocate64, fallocate) +#endif diff --git a/sysdeps/unix/sysv/linux/mips/mips64/n32/fallocate.c b/sysdeps/unix/sysv/linux/mips/mips64/n32/fallocate.c deleted file mode 100644 index 4e432f4..0000000 --- a/sysdeps/unix/sysv/linux/mips/mips64/n32/fallocate.c +++ /dev/null @@ -1,33 +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 <errno.h> -#include <fcntl.h> -#include <sysdep-cancel.h> - - -/* Reserve storage for the data of the file associated with FD. */ -int -fallocate (int fd, int mode, __off_t offset, __off_t len) -{ -#ifdef __NR_fallocate - return SYSCALL_CANCEL (fallocate, fd, mode, offset, len); -#else - __set_errno (ENOSYS); - return -1; -#endif -} diff --git a/sysdeps/unix/sysv/linux/mips/mips64/n32/fallocate64.c b/sysdeps/unix/sysv/linux/mips/mips64/n32/fallocate64.c deleted file mode 100644 index 95c9eab..0000000 --- a/sysdeps/unix/sysv/linux/mips/mips64/n32/fallocate64.c +++ /dev/null @@ -1,33 +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 <errno.h> -#include <fcntl.h> -#include <sysdep-cancel.h> - - -/* Reserve storage for the data of the file associated with FD. */ -int -fallocate64 (int fd, int mode, __off64_t offset, __off64_t len) -{ -#ifdef __NR_fallocate - return SYSCALL_CANCEL (fallocate, fd, mode, offset, len); -#else - __set_errno (ENOSYS); - return -1; -#endif -} diff --git a/sysdeps/unix/sysv/linux/mips/mips64/n64/fallocate.c b/sysdeps/unix/sysv/linux/mips/mips64/n64/fallocate.c deleted file mode 100644 index d3b7218..0000000 --- a/sysdeps/unix/sysv/linux/mips/mips64/n64/fallocate.c +++ /dev/null @@ -1 +0,0 @@ -#include <sysdeps/unix/sysv/linux/wordsize-64/fallocate.c> diff --git a/sysdeps/unix/sysv/linux/mips/mips64/n64/fallocate64.c b/sysdeps/unix/sysv/linux/mips/mips64/n64/fallocate64.c deleted file mode 100644 index fb2b681..0000000 --- a/sysdeps/unix/sysv/linux/mips/mips64/n64/fallocate64.c +++ /dev/null @@ -1 +0,0 @@ -/* fallocate64 is in fallocate.c */ diff --git a/sysdeps/unix/sysv/linux/tst-fallocate-common.c b/sysdeps/unix/sysv/linux/tst-fallocate-common.c new file mode 100644 index 0000000..76f31ff --- /dev/null +++ b/sysdeps/unix/sysv/linux/tst-fallocate-common.c @@ -0,0 +1,98 @@ +/* Basic fallocate test (no specific flags is checked). + 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. */ + +#define XSTR(s) STR(S) +#define STR(s) #s + +#include <test-skeleton.c> + +static char *temp_filename; +static int temp_fd; + +void +do_prepare (void) +{ + temp_fd = create_temp_file ("tst-fallocate.", &temp_filename); + if (temp_fd == -1) + { + printf ("cannot create temporary file: %m\n"); + exit (1); + } +} + +#define FAIL(...) \ + ({ \ + printf ("error: line %d: ", __LINE__); \ + printf (__VA_ARGS__); \ + printf ("\n"); \ + return 1; \ + }) + +static int +do_test_with_offset (off_t offset) +{ + int ret; + struct stat finfo; +#define BLK_SIZE 1024 + char bwrite[BLK_SIZE] = { 0xf0 }; + char bread[BLK_SIZE]; + + /* It tries to fallocate 1024 bytes from 'offset' and then write 1024 bytes. + After both operation rewind the file descriptor and read 1024 bytes + and check if both buffer have the same contents. */ + ret = fallocate (temp_fd, 0, offset, BLK_SIZE); + if (ret == -1) + FAIL ("fallocate failed"); + + ret = fstat (temp_fd, &finfo); + if (ret == -1) + FAIL ("fstat failed"); + + if (finfo.st_size < (offset + BLK_SIZE)) + FAIL ("size of first fallocate less than expected (%llu)", + (long long unsigned int)offset + BLK_SIZE); + + if (lseek (temp_fd, offset, SEEK_SET) == (off_t) -1) + FAIL ("fseek (0, SEEK_SET) failed"); + + if (write (temp_fd, bwrite, BLK_SIZE) != BLK_SIZE) + FAIL ("fail trying to write " XSTR (BLK_SIZE) " bytes"); + + if (lseek (temp_fd, offset, SEEK_SET) == (off_t) -1) + FAIL ("fseek (0, SEEK_SET) failed"); + + if (read (temp_fd, bread, BLK_SIZE) != BLK_SIZE) + FAIL ("fail trying to read " XSTR (BLK_SIZE) " bytes"); + + if (memcmp (bwrite, bread, BLK_SIZE) != 0) + FAIL ("buffer writted different than buffer readed"); + + return 0; +} diff --git a/sysdeps/unix/sysv/linux/tst-fallocate.c b/sysdeps/unix/sysv/linux/tst-fallocate.c new file mode 100644 index 0000000..ec3867c --- /dev/null +++ b/sysdeps/unix/sysv/linux/tst-fallocate.c @@ -0,0 +1,25 @@ +/* Basic fallocate test (no specific flags is checked). + 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 "tst-fallocate-common.c" + +static int +do_test (void) +{ + return do_test_with_offset (0); +} diff --git a/sysdeps/unix/sysv/linux/tst-fallocate64.c b/sysdeps/unix/sysv/linux/tst-fallocate64.c new file mode 100644 index 0000000..3c0d370 --- /dev/null +++ b/sysdeps/unix/sysv/linux/tst-fallocate64.c @@ -0,0 +1,54 @@ +/* Basic fallocate64 test (no specific flags is checked). + 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-fallocate-common.c" + +static int +do_test (void) +{ + ssize_t ret; + + ret = do_test_with_offset (0); + if (ret == 1) + return 1; + + off_t base_offset = UINT32_MAX + 2048LL; + ret = do_test_with_offset (base_offset); + if (ret == 1) + return 1; + + struct stat st; + if (fstat (temp_fd, &st) == -1) + { + printf ("error: fstat on temporary file failed: %m"); + return 1; + } + + /* The file size should >= base_offset plus bytes written. */ + off_t expected_value = base_offset + ret; + if (st.st_size < expected_value) + { + printf ("error: file size less than expected (%jd > %jd)\n", + (intmax_t) expected_value, (intmax_t) st.st_size); + return 1; + } + + return 0; +} + diff --git a/sysdeps/unix/sysv/linux/wordsize-64/fallocate.c b/sysdeps/unix/sysv/linux/wordsize-64/fallocate.c deleted file mode 100644 index c1dd0b4..0000000 --- a/sysdeps/unix/sysv/linux/wordsize-64/fallocate.c +++ /dev/null @@ -1,34 +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 <errno.h> -#include <fcntl.h> -#include <sysdep-cancel.h> - - -/* Reserve storage for the data of the file associated with FD. */ -int -fallocate (int fd, int mode, __off_t offset, __off_t len) -{ -#ifdef __NR_fallocate - return SYSCALL_CANCEL (fallocate, fd, mode, offset, len); -#else - __set_errno (ENOSYS); - return -1; -#endif -} -strong_alias (fallocate, fallocate64) diff --git a/sysdeps/unix/sysv/linux/wordsize-64/fallocate64.c b/sysdeps/unix/sysv/linux/wordsize-64/fallocate64.c deleted file mode 100644 index df33112..0000000 --- a/sysdeps/unix/sysv/linux/wordsize-64/fallocate64.c +++ /dev/null @@ -1 +0,0 @@ -/* fallocate64 is in posix_fallocate.c */ ^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: [PATCH v2 1/3] Consolidate fallocate{64} implementations 2016-10-04 15:07 ` Adhemerval Zanella @ 2016-10-05 6:54 ` Siddhesh Poyarekar 2016-10-05 14:49 ` Adhemerval Zanella 2016-10-17 14:15 ` Andreas Schwab 2016-10-17 14:44 ` Andreas Schwab 2 siblings, 1 reply; 27+ messages in thread From: Siddhesh Poyarekar @ 2016-10-05 6:54 UTC (permalink / raw) To: Adhemerval Zanella, libc-alpha On Tuesday 04 October 2016 08:37 PM, Adhemerval Zanella wrote: >>> + >>> + off_t base_offset = UINT32_MAX + 2048LL; >> >> This will overflow on 32-bit. > > Not really since we explicit build the test with _FILE_OFFSET_BITS=64 so > off_t will be 64-bit regardless. I could see that in tst-fallocate, but not in tst-fallocate64. > -- > > diff --git a/sysdeps/unix/sysv/linux/Makefile b/sysdeps/unix/sysv/linux/Makefile > index 9a0423e..f8f778b 100644 > --- a/sysdeps/unix/sysv/linux/Makefile > +++ b/sysdeps/unix/sysv/linux/Makefile > @@ -42,7 +42,8 @@ sysdep_headers += sys/mount.h sys/acct.h sys/sysctl.h \ > bits/socket_type.h bits/syscall.h bits/sysctl.h \ > bits/mman-linux.h > > -tests += tst-clone tst-clone2 tst-fanotify tst-personality tst-quota > +tests += tst-clone tst-clone2 tst-fanotify tst-personality tst-quota \ > + tst-fallocate tst-fallocate64 > > # Generate the list of SYS_* macros for the system calls (__NR_* macros). > > diff --git a/sysdeps/unix/sysv/linux/fallocate.c b/sysdeps/unix/sysv/linux/fallocate.c > index 6a58a5f..a38e9a6 100644 > --- a/sysdeps/unix/sysv/linux/fallocate.c > +++ b/sysdeps/unix/sysv/linux/fallocate.c > @@ -19,17 +19,12 @@ > #include <fcntl.h> > #include <sysdep-cancel.h> > > - > +#ifndef __OFF_T_MATCHES_OFF64_T > /* Reserve storage for the data of the file associated with FD. */ > int > fallocate (int fd, int mode, __off_t offset, __off_t len) > { > -#ifdef __NR_fallocate > return SYSCALL_CANCEL (fallocate, fd, mode, > - __LONG_LONG_PAIR (offset >> 31, offset), > - __LONG_LONG_PAIR (len >> 31, len)); > -#else > - __set_errno (ENOSYS); > - return -1; > -#endif > + SYSCALL_LL (offset), SYSCALL_LL (len)); > } > +#endif > diff --git a/sysdeps/unix/sysv/linux/fallocate64.c b/sysdeps/unix/sysv/linux/fallocate64.c > index 8e76d6f..d466095 100644 > --- a/sysdeps/unix/sysv/linux/fallocate64.c > +++ b/sysdeps/unix/sysv/linux/fallocate64.c > @@ -24,14 +24,10 @@ > int > fallocate64 (int fd, int mode, __off64_t offset, __off64_t len) > { > -#ifdef __NR_fallocate > return SYSCALL_CANCEL (fallocate, fd, mode, > - __LONG_LONG_PAIR ((long int) (offset >> 32), > - (long int) offset), > - __LONG_LONG_PAIR ((long int) (len >> 32), > - (long int) len)); > -#else > - __set_errno (ENOSYS); > - return -1; > -#endif > + SYSCALL_LL64 (offset), SYSCALL_LL64 (len)); > } > + > +#ifdef __OFF_T_MATCHES_OFF64_T > +weak_alias (fallocate64, fallocate) > +#endif > diff --git a/sysdeps/unix/sysv/linux/mips/mips64/n32/fallocate.c b/sysdeps/unix/sysv/linux/mips/mips64/n32/fallocate.c > deleted file mode 100644 > index 4e432f4..0000000 > --- a/sysdeps/unix/sysv/linux/mips/mips64/n32/fallocate.c > +++ /dev/null > @@ -1,33 +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 <errno.h> > -#include <fcntl.h> > -#include <sysdep-cancel.h> > - > - > -/* Reserve storage for the data of the file associated with FD. */ > -int > -fallocate (int fd, int mode, __off_t offset, __off_t len) > -{ > -#ifdef __NR_fallocate > - return SYSCALL_CANCEL (fallocate, fd, mode, offset, len); > -#else > - __set_errno (ENOSYS); > - return -1; > -#endif > -} > diff --git a/sysdeps/unix/sysv/linux/mips/mips64/n32/fallocate64.c b/sysdeps/unix/sysv/linux/mips/mips64/n32/fallocate64.c > deleted file mode 100644 > index 95c9eab..0000000 > --- a/sysdeps/unix/sysv/linux/mips/mips64/n32/fallocate64.c > +++ /dev/null > @@ -1,33 +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 <errno.h> > -#include <fcntl.h> > -#include <sysdep-cancel.h> > - > - > -/* Reserve storage for the data of the file associated with FD. */ > -int > -fallocate64 (int fd, int mode, __off64_t offset, __off64_t len) > -{ > -#ifdef __NR_fallocate > - return SYSCALL_CANCEL (fallocate, fd, mode, offset, len); > -#else > - __set_errno (ENOSYS); > - return -1; > -#endif > -} > diff --git a/sysdeps/unix/sysv/linux/mips/mips64/n64/fallocate.c b/sysdeps/unix/sysv/linux/mips/mips64/n64/fallocate.c > deleted file mode 100644 > index d3b7218..0000000 > --- a/sysdeps/unix/sysv/linux/mips/mips64/n64/fallocate.c > +++ /dev/null > @@ -1 +0,0 @@ > -#include <sysdeps/unix/sysv/linux/wordsize-64/fallocate.c> > diff --git a/sysdeps/unix/sysv/linux/mips/mips64/n64/fallocate64.c b/sysdeps/unix/sysv/linux/mips/mips64/n64/fallocate64.c > deleted file mode 100644 > index fb2b681..0000000 > --- a/sysdeps/unix/sysv/linux/mips/mips64/n64/fallocate64.c > +++ /dev/null > @@ -1 +0,0 @@ > -/* fallocate64 is in fallocate.c */ > diff --git a/sysdeps/unix/sysv/linux/tst-fallocate-common.c b/sysdeps/unix/sysv/linux/tst-fallocate-common.c > new file mode 100644 > index 0000000..76f31ff > --- /dev/null > +++ b/sysdeps/unix/sysv/linux/tst-fallocate-common.c > @@ -0,0 +1,98 @@ > +/* Basic fallocate test (no specific flags is checked). > + 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. */ > + > +#define XSTR(s) STR(S) > +#define STR(s) #s > + > +#include <test-skeleton.c> > + > +static char *temp_filename; > +static int temp_fd; > + > +void > +do_prepare (void) > +{ > + temp_fd = create_temp_file ("tst-fallocate.", &temp_filename); > + if (temp_fd == -1) > + { > + printf ("cannot create temporary file: %m\n"); > + exit (1); > + } > +} > + > +#define FAIL(...) \ > + ({ \ > + printf ("error: line %d: ", __LINE__); \ > + printf (__VA_ARGS__); \ > + printf ("\n"); \ > + return 1; \ > + }) > + > +static int > +do_test_with_offset (off_t offset) > +{ > + int ret; > + struct stat finfo; > +#define BLK_SIZE 1024 > + char bwrite[BLK_SIZE] = { 0xf0 }; > + char bread[BLK_SIZE]; > + > + /* It tries to fallocate 1024 bytes from 'offset' and then write 1024 bytes. > + After both operation rewind the file descriptor and read 1024 bytes > + and check if both buffer have the same contents. */ > + ret = fallocate (temp_fd, 0, offset, BLK_SIZE); > + if (ret == -1) > + FAIL ("fallocate failed"); > + > + ret = fstat (temp_fd, &finfo); > + if (ret == -1) > + FAIL ("fstat failed"); > + > + if (finfo.st_size < (offset + BLK_SIZE)) > + FAIL ("size of first fallocate less than expected (%llu)", > + (long long unsigned int)offset + BLK_SIZE); > + > + if (lseek (temp_fd, offset, SEEK_SET) == (off_t) -1) > + FAIL ("fseek (0, SEEK_SET) failed"); > + > + if (write (temp_fd, bwrite, BLK_SIZE) != BLK_SIZE) > + FAIL ("fail trying to write " XSTR (BLK_SIZE) " bytes"); > + > + if (lseek (temp_fd, offset, SEEK_SET) == (off_t) -1) > + FAIL ("fseek (0, SEEK_SET) failed"); > + > + if (read (temp_fd, bread, BLK_SIZE) != BLK_SIZE) > + FAIL ("fail trying to read " XSTR (BLK_SIZE) " bytes"); > + > + if (memcmp (bwrite, bread, BLK_SIZE) != 0) > + FAIL ("buffer writted different than buffer readed"); Typo, "written"? > + > + return 0; > +} > diff --git a/sysdeps/unix/sysv/linux/tst-fallocate.c b/sysdeps/unix/sysv/linux/tst-fallocate.c > new file mode 100644 > index 0000000..ec3867c > --- /dev/null > +++ b/sysdeps/unix/sysv/linux/tst-fallocate.c > @@ -0,0 +1,25 @@ > +/* Basic fallocate test (no specific flags is checked). > + 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 "tst-fallocate-common.c" > + > +static int > +do_test (void) > +{ > + return do_test_with_offset (0); > +} > diff --git a/sysdeps/unix/sysv/linux/tst-fallocate64.c b/sysdeps/unix/sysv/linux/tst-fallocate64.c > new file mode 100644 > index 0000000..3c0d370 > --- /dev/null > +++ b/sysdeps/unix/sysv/linux/tst-fallocate64.c > @@ -0,0 +1,54 @@ > +/* Basic fallocate64 test (no specific flags is checked). > + 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-fallocate-common.c" > + > +static int > +do_test (void) > +{ > + ssize_t ret; > + > + ret = do_test_with_offset (0); > + if (ret == 1) > + return 1; > + > + off_t base_offset = UINT32_MAX + 2048LL; > + ret = do_test_with_offset (base_offset); > + if (ret == 1) > + return 1; > + > + struct stat st; > + if (fstat (temp_fd, &st) == -1) > + { > + printf ("error: fstat on temporary file failed: %m"); > + return 1; > + } > + > + /* The file size should >= base_offset plus bytes written. */ > + off_t expected_value = base_offset + ret; > + if (st.st_size < expected_value) > + { > + printf ("error: file size less than expected (%jd > %jd)\n", > + (intmax_t) expected_value, (intmax_t) st.st_size); > + return 1; > + } > + > + return 0; > +} > + > diff --git a/sysdeps/unix/sysv/linux/wordsize-64/fallocate.c b/sysdeps/unix/sysv/linux/wordsize-64/fallocate.c > deleted file mode 100644 > index c1dd0b4..0000000 > --- a/sysdeps/unix/sysv/linux/wordsize-64/fallocate.c > +++ /dev/null > @@ -1,34 +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 <errno.h> > -#include <fcntl.h> > -#include <sysdep-cancel.h> > - > - > -/* Reserve storage for the data of the file associated with FD. */ > -int > -fallocate (int fd, int mode, __off_t offset, __off_t len) > -{ > -#ifdef __NR_fallocate > - return SYSCALL_CANCEL (fallocate, fd, mode, offset, len); > -#else > - __set_errno (ENOSYS); > - return -1; > -#endif > -} > -strong_alias (fallocate, fallocate64) > diff --git a/sysdeps/unix/sysv/linux/wordsize-64/fallocate64.c b/sysdeps/unix/sysv/linux/wordsize-64/fallocate64.c > deleted file mode 100644 > index df33112..0000000 > --- a/sysdeps/unix/sysv/linux/wordsize-64/fallocate64.c > +++ /dev/null > @@ -1 +0,0 @@ > -/* fallocate64 is in posix_fallocate.c */ > ^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: [PATCH v2 1/3] Consolidate fallocate{64} implementations 2016-10-05 6:54 ` Siddhesh Poyarekar @ 2016-10-05 14:49 ` Adhemerval Zanella 2016-10-05 16:50 ` Siddhesh Poyarekar 0 siblings, 1 reply; 27+ messages in thread From: Adhemerval Zanella @ 2016-10-05 14:49 UTC (permalink / raw) To: Siddhesh Poyarekar, libc-alpha On 05/10/2016 03:53, Siddhesh Poyarekar wrote: > On Tuesday 04 October 2016 08:37 PM, Adhemerval Zanella wrote: >>>> + >>>> + off_t base_offset = UINT32_MAX + 2048LL; >>> >>> This will overflow on 32-bit. >> >> Not really since we explicit build the test with _FILE_OFFSET_BITS=64 so >> off_t will be 64-bit regardless. > > I could see that in tst-fallocate, but not in tst-fallocate64. Yes, but the large offset that exceeds a 32-bit value is checked only on tst-fallocate64. The tst-fallocate, which uses default 32-bit off_t (on architectures that do not have off_t 64-bit as default), only tests offset less than INT_MAX. >> diff --git a/sysdeps/unix/sysv/linux/tst-fallocate-common.c b/sysdeps/unix/sysv/linux/tst-fallocate-common.c >> new file mode 100644 >> index 0000000..76f31ff >> --- /dev/null >> +++ b/sysdeps/unix/sysv/linux/tst-fallocate-common.c >> @@ -0,0 +1,98 @@ >> +/* Basic fallocate test (no specific flags is checked). >> + 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. */ >> + >> +#define XSTR(s) STR(S) >> +#define STR(s) #s >> + >> +#include <test-skeleton.c> >> + >> +static char *temp_filename; >> +static int temp_fd; >> + >> +void >> +do_prepare (void) >> +{ >> + temp_fd = create_temp_file ("tst-fallocate.", &temp_filename); >> + if (temp_fd == -1) >> + { >> + printf ("cannot create temporary file: %m\n"); >> + exit (1); >> + } >> +} >> + >> +#define FAIL(...) \ >> + ({ \ >> + printf ("error: line %d: ", __LINE__); \ >> + printf (__VA_ARGS__); \ >> + printf ("\n"); \ >> + return 1; \ >> + }) >> + >> +static int >> +do_test_with_offset (off_t offset) >> +{ >> + int ret; >> + struct stat finfo; >> +#define BLK_SIZE 1024 >> + char bwrite[BLK_SIZE] = { 0xf0 }; >> + char bread[BLK_SIZE]; >> + >> + /* It tries to fallocate 1024 bytes from 'offset' and then write 1024 bytes. >> + After both operation rewind the file descriptor and read 1024 bytes >> + and check if both buffer have the same contents. */ >> + ret = fallocate (temp_fd, 0, offset, BLK_SIZE); >> + if (ret == -1) >> + FAIL ("fallocate failed"); >> + >> + ret = fstat (temp_fd, &finfo); >> + if (ret == -1) >> + FAIL ("fstat failed"); >> + >> + if (finfo.st_size < (offset + BLK_SIZE)) >> + FAIL ("size of first fallocate less than expected (%llu)", >> + (long long unsigned int)offset + BLK_SIZE); >> + >> + if (lseek (temp_fd, offset, SEEK_SET) == (off_t) -1) >> + FAIL ("fseek (0, SEEK_SET) failed"); >> + >> + if (write (temp_fd, bwrite, BLK_SIZE) != BLK_SIZE) >> + FAIL ("fail trying to write " XSTR (BLK_SIZE) " bytes"); >> + >> + if (lseek (temp_fd, offset, SEEK_SET) == (off_t) -1) >> + FAIL ("fseek (0, SEEK_SET) failed"); >> + >> + if (read (temp_fd, bread, BLK_SIZE) != BLK_SIZE) >> + FAIL ("fail trying to read " XSTR (BLK_SIZE) " bytes"); >> + >> + if (memcmp (bwrite, bread, BLK_SIZE) != 0) >> + FAIL ("buffer writted different than buffer readed"); > > Typo, "written"? Yes, I will fix it. ^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: [PATCH v2 1/3] Consolidate fallocate{64} implementations 2016-10-05 14:49 ` Adhemerval Zanella @ 2016-10-05 16:50 ` Siddhesh Poyarekar 0 siblings, 0 replies; 27+ messages in thread From: Siddhesh Poyarekar @ 2016-10-05 16:50 UTC (permalink / raw) To: Adhemerval Zanella, libc-alpha On Wednesday 05 October 2016 08:19 PM, Adhemerval Zanella wrote: > Yes, but the large offset that exceeds a 32-bit value is checked only on > tst-fallocate64. The tst-fallocate, which uses default 32-bit off_t (on > architectures that do not have off_t 64-bit as default), only tests > offset less than INT_MAX. Of course, looks good to me with the typo fix then. Siddhesh ^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: [PATCH v2 1/3] Consolidate fallocate{64} implementations 2016-10-04 15:07 ` Adhemerval Zanella 2016-10-05 6:54 ` Siddhesh Poyarekar @ 2016-10-17 14:15 ` Andreas Schwab 2016-10-17 14:20 ` Andreas Schwab 2016-10-17 14:44 ` Andreas Schwab 2 siblings, 1 reply; 27+ messages in thread From: Andreas Schwab @ 2016-10-17 14:15 UTC (permalink / raw) To: Adhemerval Zanella; +Cc: Siddhesh Poyarekar, libc-alpha The new tests fail on s390x: ------ FAIL: misc/tst-fallocate ------ error: ../sysdeps/unix/sysv/linux/tst-fallocate-common.c:61: fallocate failed ------ FAIL: misc/tst-fallocate64 ------ error: ../sysdeps/unix/sysv/linux/tst-fallocate-common.c:61: fallocate failed Andreas. -- Andreas Schwab, SUSE Labs, schwab@suse.de GPG Key fingerprint = 0196 BAD8 1CE9 1970 F4BE 1748 E4D4 88E3 0EEA B9D7 "And now for something completely different." ^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: [PATCH v2 1/3] Consolidate fallocate{64} implementations 2016-10-17 14:15 ` Andreas Schwab @ 2016-10-17 14:20 ` Andreas Schwab 2016-10-17 15:52 ` Andreas Schwab 0 siblings, 1 reply; 27+ messages in thread From: Andreas Schwab @ 2016-10-17 14:20 UTC (permalink / raw) To: Adhemerval Zanella; +Cc: Siddhesh Poyarekar, libc-alpha They also fail on i586, x86_64, ppc, ppc64, ppc64le (same error). Andreas. -- Andreas Schwab, SUSE Labs, schwab@suse.de GPG Key fingerprint = 0196 BAD8 1CE9 1970 F4BE 1748 E4D4 88E3 0EEA B9D7 "And now for something completely different." ^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: [PATCH v2 1/3] Consolidate fallocate{64} implementations 2016-10-17 14:20 ` Andreas Schwab @ 2016-10-17 15:52 ` Andreas Schwab 2016-10-17 15:57 ` Christoph Hellwig 0 siblings, 1 reply; 27+ messages in thread From: Andreas Schwab @ 2016-10-17 15:52 UTC (permalink / raw) To: Adhemerval Zanella; +Cc: Siddhesh Poyarekar, libc-alpha The error is EOPNOTSUPP, virtio-blk apparently does not support fallocate (neither does nfs). Andreas. -- Andreas Schwab, SUSE Labs, schwab@suse.de GPG Key fingerprint = 0196 BAD8 1CE9 1970 F4BE 1748 E4D4 88E3 0EEA B9D7 "And now for something completely different." ^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: [PATCH v2 1/3] Consolidate fallocate{64} implementations 2016-10-17 15:52 ` Andreas Schwab @ 2016-10-17 15:57 ` Christoph Hellwig 2016-10-17 18:59 ` Adhemerval Zanella 2016-10-18 7:45 ` Andreas Schwab 0 siblings, 2 replies; 27+ messages in thread From: Christoph Hellwig @ 2016-10-17 15:57 UTC (permalink / raw) To: Andreas Schwab; +Cc: Adhemerval Zanella, Siddhesh Poyarekar, libc-alpha On Mon, Oct 17, 2016 at 05:52:12PM +0200, Andreas Schwab wrote: > The error is EOPNOTSUPP, virtio-blk apparently does not support > fallocate (neither does nfs). virtio-blk is a block driver, it's the file system that needs to support it. NFS 4.2 actually does support a subset of the fallocate functionality, but the spec isn't finished yet and thus usually not turned on by default. That being said: EOPNOTSUPP is a common return value for fallocate and should be expected at any time. ^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: [PATCH v2 1/3] Consolidate fallocate{64} implementations 2016-10-17 15:57 ` Christoph Hellwig @ 2016-10-17 18:59 ` Adhemerval Zanella 2016-10-18 9:55 ` Florian Weimer 2016-10-18 7:45 ` Andreas Schwab 1 sibling, 1 reply; 27+ messages in thread From: Adhemerval Zanella @ 2016-10-17 18:59 UTC (permalink / raw) To: Christoph Hellwig, Andreas Schwab; +Cc: Siddhesh Poyarekar, libc-alpha On 17/10/2016 13:57, Christoph Hellwig wrote: > On Mon, Oct 17, 2016 at 05:52:12PM +0200, Andreas Schwab wrote: >> The error is EOPNOTSUPP, virtio-blk apparently does not support >> fallocate (neither does nfs). > > virtio-blk is a block driver, it's the file system that needs to > support it. NFS 4.2 actually does support a subset of the fallocate > functionality, but the spec isn't finished yet and thus usually > not turned on by default. > > That being said: EOPNOTSUPP is a common return value for fallocate > and should be expected at any time. > Right, I did not take in consideration that fallocate might fall due this constraint. The correct approach would be just set as unsupported if fallocate returns -1/EOPNOTSUPP. I will push this patch: diff --git a/sysdeps/unix/sysv/linux/Makefile b/sysdeps/unix/sysv/linux/Makefile index 101e120..e329a6b 100644 --- a/sysdeps/unix/sysv/linux/Makefile +++ b/sysdeps/unix/sysv/linux/Makefile @@ -43,7 +43,7 @@ sysdep_headers += sys/mount.h sys/acct.h sys/sysctl.h \ bits/mman-linux.h tests += tst-clone tst-clone2 tst-fanotify tst-personality tst-quota \ - tst-fallocate tst-fallocate64 tst-sync_file_range + tst-sync_file_range # Generate the list of SYS_* macros for the system calls (__NR_* macros). @@ -173,6 +173,8 @@ ifeq ($(subdir),io) sysdep_routines += xstatconv internal_statvfs internal_statvfs64 \ sync_file_range fallocate fallocate64 sysdep_headers += bits/fcntl-linux.h + +tests += tst-fallocate tst-fallocate64 endif ifeq ($(subdir),elf) diff --git a/sysdeps/unix/sysv/linux/tst-fallocate-common.c b/sysdeps/unix/sysv/linux/tst-fallocate-common.c index 9879488..d98bf4a 100644 --- a/sysdeps/unix/sysv/linux/tst-fallocate-common.c +++ b/sysdeps/unix/sysv/linux/tst-fallocate-common.c @@ -58,7 +58,13 @@ do_test_with_offset (off_t offset) and check if both buffer have the same contents. */ ret = fallocate (temp_fd, 0, offset, BLK_SIZE); if (ret == -1) - FAIL_EXIT1 ("fallocate failed"); + { + /* fallocate might not be fully supported by underlying filesystem (for + instance some NFS versions). */ + if (errno == EOPNOTSUPP) + FAIL_EXIT (77, "fallocate not supported"); + FAIL_EXIT1 ("fallocate failed"); + } ret = fstat (temp_fd, &finfo); if (ret == -1) ^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: [PATCH v2 1/3] Consolidate fallocate{64} implementations 2016-10-17 18:59 ` Adhemerval Zanella @ 2016-10-18 9:55 ` Florian Weimer 0 siblings, 0 replies; 27+ messages in thread From: Florian Weimer @ 2016-10-18 9:55 UTC (permalink / raw) To: Adhemerval Zanella, Christoph Hellwig, Andreas Schwab Cc: Siddhesh Poyarekar, libc-alpha On 10/17/2016 08:58 PM, Adhemerval Zanella wrote: > Right, I did not take in consideration that fallocate might fall due > this constraint. The correct approach would be just set as unsupported > if fallocate returns -1/EOPNOTSUPP. > > I will push this patch: Okay with a suitable changelog entry for both sets of changes. Thanks, Florian ^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: [PATCH v2 1/3] Consolidate fallocate{64} implementations 2016-10-17 15:57 ` Christoph Hellwig 2016-10-17 18:59 ` Adhemerval Zanella @ 2016-10-18 7:45 ` Andreas Schwab 1 sibling, 0 replies; 27+ messages in thread From: Andreas Schwab @ 2016-10-18 7:45 UTC (permalink / raw) To: Christoph Hellwig; +Cc: Adhemerval Zanella, Siddhesh Poyarekar, libc-alpha On Okt 17 2016, Christoph Hellwig <hch@lst.de> wrote: > On Mon, Oct 17, 2016 at 05:52:12PM +0200, Andreas Schwab wrote: >> The error is EOPNOTSUPP, virtio-blk apparently does not support >> fallocate (neither does nfs). > > virtio-blk is a block driver, s/virtio-blk/ext3/ Andreas. -- Andreas Schwab, SUSE Labs, schwab@suse.de GPG Key fingerprint = 0196 BAD8 1CE9 1970 F4BE 1748 E4D4 88E3 0EEA B9D7 "And now for something completely different." ^ permalink raw reply [flat|nested] 27+ messages in thread
* Re: [PATCH v2 1/3] Consolidate fallocate{64} implementations 2016-10-04 15:07 ` Adhemerval Zanella 2016-10-05 6:54 ` Siddhesh Poyarekar 2016-10-17 14:15 ` Andreas Schwab @ 2016-10-17 14:44 ` Andreas Schwab 2 siblings, 0 replies; 27+ messages in thread From: Andreas Schwab @ 2016-10-17 14:44 UTC (permalink / raw) To: Adhemerval Zanella; +Cc: Siddhesh Poyarekar, libc-alpha On Okt 04 2016, Adhemerval Zanella <adhemerval.zanella@linaro.org> wrote: > diff --git a/sysdeps/unix/sysv/linux/Makefile b/sysdeps/unix/sysv/linux/Makefile > index 9a0423e..f8f778b 100644 > --- a/sysdeps/unix/sysv/linux/Makefile > +++ b/sysdeps/unix/sysv/linux/Makefile > @@ -42,7 +42,8 @@ sysdep_headers += sys/mount.h sys/acct.h sys/sysctl.h \ > bits/socket_type.h bits/syscall.h bits/sysctl.h \ > bits/mman-linux.h > > -tests += tst-clone tst-clone2 tst-fanotify tst-personality tst-quota > +tests += tst-clone tst-clone2 tst-fanotify tst-personality tst-quota \ > + tst-fallocate tst-fallocate64 The tests should be sorted under io, where fallocate(64) is built. Andreas. -- Andreas Schwab, SUSE Labs, schwab@suse.de GPG Key fingerprint = 0196 BAD8 1CE9 1970 F4BE 1748 E4D4 88E3 0EEA B9D7 "And now for something completely different." ^ permalink raw reply [flat|nested] 27+ messages in thread
end of thread, other threads:[~2016-10-18 9:55 UTC | newest] Thread overview: 27+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2016-09-28 0:15 [PATCH v2 1/3] Consolidate fallocate{64} implementations Adhemerval Zanella 2016-09-28 0:15 ` [PATCH v2 2/3] Consolidate posix_fallocate{64} implementations Adhemerval Zanella 2016-10-05 17:02 ` Siddhesh Poyarekar 2016-10-05 17:51 ` Adhemerval Zanella 2016-10-05 18:19 ` Siddhesh Poyarekar 2016-09-28 0:15 ` [PATCH v2 3/3] Consolidate posix_fadvise implementations Adhemerval Zanella 2016-10-05 17:15 ` Siddhesh Poyarekar 2016-10-06 20:50 ` Adhemerval Zanella 2016-10-11 23:47 ` Joseph Myers 2016-10-12 13:51 ` Adhemerval Zanella 2016-10-12 15:39 ` Joseph Myers 2016-10-12 16:05 ` Adhemerval Zanella 2016-10-12 16:11 ` Joseph Myers 2016-10-12 16:14 ` Adhemerval Zanella 2016-09-30 0:51 ` [PATCH v2 1/3] Consolidate fallocate{64} implementations Siddhesh Poyarekar 2016-10-04 15:07 ` Adhemerval Zanella 2016-10-05 6:54 ` Siddhesh Poyarekar 2016-10-05 14:49 ` Adhemerval Zanella 2016-10-05 16:50 ` Siddhesh Poyarekar 2016-10-17 14:15 ` Andreas Schwab 2016-10-17 14:20 ` Andreas Schwab 2016-10-17 15:52 ` Andreas Schwab 2016-10-17 15:57 ` Christoph Hellwig 2016-10-17 18:59 ` Adhemerval Zanella 2016-10-18 9:55 ` Florian Weimer 2016-10-18 7:45 ` Andreas Schwab 2016-10-17 14:44 ` Andreas Schwab
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).