Patchwork [v2,2/3] Consolidate posix_fallocate{64} implementations

login
register
mail settings
Submitter Adhemerval Zanella Netto
Date Sept. 28, 2016, 12:15 a.m.
Message ID <1475021701-22246-2-git-send-email-adhemerval.zanella@linaro.com>
Download mbox | patch
Permalink /patch/16100/
State New
Headers show

Comments

Adhemerval Zanella Netto - Sept. 28, 2016, 12:15 a.m.
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
Siddhesh Poyarekar - Oct. 5, 2016, 5:02 p.m.
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
>
Adhemerval Zanella Netto - Oct. 5, 2016, 5:50 p.m.
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.
Siddhesh Poyarekar - Oct. 5, 2016, 6:19 p.m.
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

Patch

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