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